2013-05-01 70 views
6

Tôi gặp sự cố khi chạy một testcase trong chế độ gỡ lỗi: Tôi nhận được một hộp bật lên có thông báo "Ngoại lệ không đúng lúc 0x7c812fd3 trong Test.exe: 0xE0000003: 0xe0000003.". Mã ngắt trong free.c:C++ Ngoại lệ chưa xử lý - cách gỡ lỗi

void __cdecl _free_base (void * pBlock) 
{ 
    int retval = 0; 

    if (pBlock == NULL) 
     return; 

    RTCCALLBACK(_RTC_Free_hook, (pBlock, 0)); 

    retval = HeapFree(_crtheap, 0, pBlock); 
    if (retval == 0) 
    { 
     errno = _get_errno_from_oserr(GetLastError()); 
    } 
} 

tại dòng "retval = ..." with _crtheap = 0x00df0000 và pBlock = 0x967c93d3. Các cuộc gọi ngăn xếp phá vỡ tại "kernel32.dll! 7c812fd3()" và một mục khác tiếp tục xuống trong ngăn xếp cuộc gọi: "> msvcr100d.dll! _free_base (void * pBlock = 0x967c93d3) Dòng 50 + 0x13 byte".

Tôi đã googled khá một chút và vấn đề có thể đến từ giải phóng bộ nhớ severel lần. Mặc dù mô tả mơ hồ và lộn xộn này bất cứ ai có thể gợi ý cách xác định vấn đề? và có thể làm thế nào để sửa nó?

gì đập vào mắt tôi một chút kỳ lạ là tôi không kinh nghiệm này khi chạy thử nghiệm trong phiên bản chế độ ...

Trân trọng! Svend

+2

Lý do thông thường cho lỗi chỉ chế độ gỡ lỗi là các biến chưa được khởi tạo. Có lẽ bạn đang giải phóng một con trỏ chưa bao giờ được đưa ra một giá trị. – john

+4

Trong chế độ phát hành, các kiểm tra này không được thực hiện, do đó tại sao bạn chỉ nhận được thông báo trong chế độ gỡ lỗi (sự cố vẫn tồn tại trong bản phát hành, bạn sẽ gặp may khi không xuất hiện thêm bất kỳ lỗi nào). Đi lên theo dõi stack cho đến khi bạn nhận được một chức năng mà bạn đã viết, và cố gắng tìm ra những gì sai ở đó (ví dụ: miễn phí gấp đôi hoặc giải phóng một địa chỉ không thực sự được phân bổ). – Cameron

+0

Bạn có thể cung cấp thêm một chút chi tiết không? Loại đối tượng nào đang được giải thoát? Có một con trỏ thông minh ví dụ –

Trả lời

-2

Bạn đã cố gắng để chạy các testcases dưới hình ảnh studio debugger? Trình gỡ lỗi sẽ bắt ngoại lệ này và bạn có thể xác minh ngăn xếp cuộc gọi và xác định vị trí của sự cố.

+0

Trường hợp ngoại lệ xảy ra trong '_free_base', anh ta đã biết điều này. Nhưng trình gỡ lỗi không bắt được vấn đề (tức là đống tham nhũng xảy ra trước đó) –

+0

Nếu đó là trường hợp thì anh ta chỉ nên sử dụng trình gỡ lỗi và bước qua tất cả mã testcases và tìm phần tạo ra ngoại lệ. – Zuljin

+0

Chà. Lời khuyên ngây thơ này chỉ có thể đến từ một người chưa bao giờ trải qua một lỗi hành động-ở-một-khoảng cách. Tôi ghen tị với bạn. –