2009-11-02 10 views
7

Mam program niepowodzeniem z:Jak mogę debugować błędy St9bad_alloc w gdb w C?

terminate called after throwing an instance of 'std::bad_alloc' 
    what(): St9bad_alloc 

sobie wyobrazić, że to ma coś wspólnego z malloc/free, ale nie wiem który.

Jaki punkt przerwania mogę ustawić w zestawie gdb, który naruszy błąd, aby można było wyświetlić ślad stosu?

Program jest kombinacją C i C++ skompilowanych z gcc 3.4.2.

Odpowiedz

12

To naprawdę nie jest malloc/free, co powoduje wyjątek, jest "nowy", który jest zdecydowanie w C++ częścią twojej aplikacji. Wygląda na to, że podajesz parametr, który jest zbyt duży dla "nowego" do przydzielenia.

'std :: bad_alloc' jest spowodowany przez następujący kod na przykład:

int * p = new int[50000000]; 

Co backtrace mówi po załadowaniu zrzutu awaryjnego w gdb? Jeśli nie możesz wygenerować zrzutu, możesz poprosić GDB o zatrzymanie when exception is thrown or caught. Niestety, niektóre wersje obsługują tylko GDB następującej składni:

catch throw 

który pozwala przerwać stosowanie kiedy każdy jest wyjątek. Jednak w pomocy widać, że powinno być możliwe uruchomienie

catch throw std::bad_alloc 

w nowszych wersjach.

I nie zapominaj, że:

(gdb) pomaga łapać

jest dobrym źródłem dla innych przydatnych informacji.

+0

Twój link do "Kiedy wyjątek jest rzucony lub złapany" to 404. – Karl

0

Jest całkiem możliwe, że dzieje się tak z powodu nadpisania pamięci, co powoduje uszkodzenie stanu systemu alokacji pamięci (który zazwyczaj jest przechowywany przed lub po blokach pamięci zwróconych do aplikacji).

Jeśli masz taką możliwość (tzn. Jesteś na Linuksie x86), uruchom program pod numerem Valgrind, który często pokazuje dokładnie, gdzie wystąpiło uszkodzenie.

0

Miałem to podczas próby odczytu w pliku, który nie istnieje ... Próbowałem utworzyć wewnętrzny bufor dla zawartości pliku, ale ponieważ plik nie istnieje, moje stworzenie bufor wkręcony.

int lenth_bytes; 
length_bytes = in_file.tellg(); 
new char [length_bytes]; // length_bytes hadn't been initialised!!!! 

Pamiętaj dzieci, zawsze inicjalizacji zmiennych: D i sprawdzić zerowych przypadków.