2013-05-01 17 views
6

Mam problem podczas uruchamiania testcase w trybie debugowania: Otrzymuję wyskakujące okienko z komunikatem "Nieobsługiwany wyjątek przy 0x7c812fd3 w Test.exe: 0xE0000003: 0xe0000003.". Przerwy kodowe w free.c:C++ Nieobsługiwany wyjątek - jak debugować

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()); 
    } 
} 

w wierszu "retval = ..." z _crtheap = 0x00df0000 i pBlock = 0x967c93d3. Stos wywołań rozbija się na "kernel32.dll! 7c812fd3()" i kolejny wpis w dalszej części stosu wywołań: "> msvcr100d.dll! _free_base (void * pBlock = 0x967c93d3) Linia 50 + 0x13 bajtów".

Mam dość google i problem może wynikać z uwolnienia razy w pamięci. Pomimo tego niejasnego i nieuporządkowanego opisu, każdy może wskazać, jak zlokalizować problem? i może to naprawić?

Co wydaje mi się nieco dziwne jest to, że nie doświadczają tego po uruchomieniu testu uwalniania trybie ...

pozdrowienia rodzaju, Svend

+2

Zwykle powodem błędów w trybie debugowania są niezainicjalizowane zmienne. Być może uwalniasz wskaźnik, który nigdy nie otrzymał żadnej wartości. – john

+4

W trybie zwolnienia te kontrole nie są wykonywane, dlatego powinieneś otrzymywać powiadomienia tylko w trybie debugowania (problem nadal występuje w wersji, po prostu masz szczęście, że nie powoduje żadnych dalszych błędów). Przejdź do śledzenia stosu, aż dojdziesz do funkcji, którą napisałeś, i spróbuj odgadnąć, co jest nie tak (np. Podwójnie uwolnić lub zwolnić adres, który nie został przydzielony). – Cameron

+0

Czy możesz podać nieco więcej szczegółów? Jaki przedmiot zostaje uwolniony? Czy jest to inteligentny wskaźnik np. –

Odpowiedz

-2

Czy próbowałeś uruchomić te testami pod wizualny studyjny debugger? Debugger powinien wychwycić ten wyjątek i sprawdzić stos wywołań i zlokalizować problem.

+0

Wyjątek występuje w '_free_base', już o tym wie. Ale debugger nie łapie problemu (tj. Korupcja sterty, która wystąpiła wcześniej). –

+0

Jeśli tak jest, to powinien po prostu użyć debuggera i przejść przez kod wszystkich skrzynek testowych i zlokalizować część generującą wyjątek. – Zuljin

+0

Wow. Tego rodzaju naiwna rada może pochodzić tylko od kogoś, kto nigdy nie doświadczył błędu działania na odległość. Zazdroszczę ci. –