Chương trình của tôi bị lỗi ngẫu nhiên trong một kịch bản nhỏ mà tôi có thể sao chép, nhưng nó xảy ra trong mlock.c (đó là tệp thời gian chạy VC++) từ ntdll.dll và tôi không thể thấy ngăn xếp dấu vết. Tôi biết rằng nó xảy ra trong một trong các chức năng thread của tôi, mặc dù.VC++ 2010: Lỗi phần nghiêm trọng kỳ lạ
Đây là mã mlock.c nơi chương trình bị treo:
void __cdecl _unlock (
int locknum
)
{
/*
* leave the critical section.
*/
LeaveCriticalSection(_locktable[locknum].lock);
}
Lỗi này là "xử lý không hợp lệ theo quy định". Nếu tôi nhìn vào locknum, đó là một số lớn hơn kích thước của _locktable, do đó, điều này làm cho một số ý nghĩa.
Điều này dường như liên quan đến việc sử dụng Mục quan trọng. Tôi sử dụng CRITICAL_SECTIONS trong chủ đề của mình, thông qua lớp trình bao bọc CCriticalSection và trình bảo vệ RAII liên quan của nó, CGuard. Định nghĩa cho cả hai here để tránh lộn xộn hơn nữa.
Đây là chức năng thread đó là đâm:
unsigned int __stdcall CPlayBack::timerThread(void * pParams) {
#ifdef _DEBUG
DRA::CommonCpp::SetThreadName(-1, "CPlayBack::timerThread");
#endif
CPlayBack * pThis = static_cast<CPlayBack*>(pParams);
bool bContinue = true;
while(bContinue) {
float m_fActualFrameRate = pThis->m_fFrameRate * pThis->m_fFrameRateMultiplier;
if(m_fActualFrameRate != 0 && pThis->m_bIsPlaying) {
bContinue = (::WaitForSingleObject(pThis->m_hEndThreadEvent, static_cast<DWORD>(1000.0f/m_fActualFrameRate)) == WAIT_TIMEOUT);
CImage img;
if(pThis->m_bIsPlaying && pThis->nextFrame(img))
pThis->sendImage(img);
}
else
bContinue = (::WaitForSingleObject(pThis->m_hEndThreadEvent, 10) == WAIT_TIMEOUT);
}
::GetErrorLoggerInstance()->Log(LOG_TYPE_NOTE, "CPlayBack", "timerThread", "Exiting thread");
return 0;
}
đâu CCriticalSection
vào được không? Mọi đối tượng CImage
chứa đối tượng CCriticalSection
mà nó sử dụng thông qua khóa RAII CGuard
. Hơn nữa, mỗi CImage
chứa đối tượng CSharedMemory
thực hiện đếm tham chiếu. Cuối cùng, nó chứa hai số CCriticalSection
, một cho dữ liệu và một cho bộ đếm tham chiếu. Một ví dụ điển hình của những tương tác được tốt nhất nhìn thấy trong destructors:
CImage::~CImage() {
CGuard guard(m_csData);
if(m_pSharedMemory != NULL) {
m_pSharedMemory->decrementUse();
if(!m_pSharedMemory->isBeingUsed()){
delete m_pSharedMemory;
m_pSharedMemory = NULL;
}
}
m_cProperties.ClearMin();
m_cProperties.ClearMax();
m_cProperties.ClearMode();
}
CSharedMemory::~CSharedMemory() {
CGuard guardUse(m_cs);
if(m_pData && m_bCanDelete){
delete []m_pData;
}
m_use = 0;
m_pData = NULL;
}
Bất cứ ai đụng vào loại hình báo lỗi? Bất kì lời đề nghị nào?
Chỉnh sửa: Tôi đã thấy một số ngăn xếp cuộc gọi: cuộc gọi đến từ ~ CSharedMemory. Vì vậy, phải có một số điều kiện chủng tộc có
Sửa: Mã More CSharedMemory here
Tham nhũng bộ nhớ? –
Cả hai lớp đều trông ổn. Bạn có thể hiển thị một số mã liên quan đến CÁCH bạn đang sử dụng chúng không? Bạn có chắc chắn các nhà xây dựng được gọi đúng cách trước khi sử dụng (không có tranh chấp thread trên các nhà xây dựng?). Chúng có được phân bổ động (vì một lý do nào đó) không? – Chad
Lớp học của bạn không có liên quan gì đến mã CRT, nó sử dụng Windows. Gỡ lỗi cuộc đua luồng và tham nhũng đống không bao giờ là vui vẻ, chúc may mắn với nó. –