2009-02-02 18 views
39

Czy istnieje opcja gcc, którą mogę ustawić, która da mi numer linii błędu segmentacji?Numer linii awarii segmentacji

wiem, może: linia

  1. Debug przez linię
  2. Put printfs w kodzie, aby zawęzić.

Edits:

  1. bt/where na gdb nie dają stosu.
  2. Helpful suggestion
+0

Czy możesz opublikować swoje flagi kompilatora? – cbrulak

+0

gcc -DDEBUG -I "" -O0 -g3 -Wall -c -fmessage-length = 0 -MMD -MP – Rohit

+0

(następnym razem, proszę wpisać swój kod w swoje pytanie). – cbrulak

Odpowiedz

54

nie wiem z opcją gcc, ale powinieneś być w stanie uruchomić aplikację z gdb i wtedy kiedy się zawiesi, typ where spojrzeć na stosie, gdy odszedł, który powinien cię przybliżyć.

$ gdb blah 
(gdb) run 
(gdb) where 

Edycja dla kompletności:

Należy również upewnić się, aby zbudować aplikację z flagami debugowania na temat korzystania z opcji gcc -g zawierać numery linii w pliku wykonywalnego.

Inną opcją jest użycie polecenia bt (śledzenie).

+2

Co mam zrobić, jeśli w miejscu "Brak stosu"? – Rohit

+0

Niektóre awarie mogą uszkodzić zawartość zawartości, a następnie prawdopodobnie najlepiej jest wstawić printf i sprawdzić poprawność danych wejściowych w różnych punktach kodowych. – che

+2

możesz również wypróbować moją sugestię poniżej - używa on procedur odwijania stosu glibc, aby wydrukować stos stacków bez konieczności uciekania się do gdb. – tgamblin

4

trzeba także zbudować z flagami debugowania na -g

Można również otworzyć zrzut z gdb (choć trzeba -g).

+0

Brulak jest na miejscu, jeśli nie dostajesz stosu w gdb, musisz naprawić swoje symbole –

1

Dla GCC nie ma metody dostarczenia tych informacji, będziesz musiał polegać na zewnętrznym programie takim jak GDB.

GDB może podać wiersz, w którym nastąpiło zderzenie z poleceniem "bt" (skrót od "backtrace"), po tym, jak program usunął błąd w seg. To da ci nie tylko linię awarii, ale cały stos programu (dzięki czemu możesz zobaczyć, co nazywa się funkcją, w której zdarzyła się katastrofa).

19

Oto kompletny sesji powłoki/GDB

 
$ gcc -ggdb myproj.c 
$ gdb a.out 
gdb> run --some-option=foo --other-option=bar 
(gdb will say your program hit a segfault) 
gdb> bt 
(gdb prints a stack trace) 
gdb> q 
[are you sure, your program is still running]? y 
$ emacs myproj.C# heh, I know what the error is now... 

Szczęśliwy hacking :-)

+2

bt i where daje "No Stack". Jak to naprawić? – Rohit

+5

uruchamiasz go na moim komputerze ;-) [sorry] –

9

Można uzyskać gcc wydrukować ci StackTrace gdy program dostaje sygnał, podobny do SEGV jak Java i inne bardziej przyjazne języki obsługują wyjątki wskaźnika pustego. Zobacz moją odpowiedź tutaj po więcej szczegółów:

Dobrą rzeczą jest to, można po prostu zostawić go w kodzie; nie musisz uruchamiać rzeczy przez gdb, aby uzyskać ładne wyjście debugowania.

Jeśli kompilujesz z -g i postępujesz zgodnie z instrukcjami tam, możesz użyć narzędzia wiersza polecenia, takiego jak addr2line, aby uzyskać informacje o pliku/linii z danych wyjściowych.

+0

Link jest uszkodzony ... poprawiony: http://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when- my-gcc-c-app-zawiesza się –

3

Jeśli wszystkie sugestie poprzednich kompilacji debugowania (-g) i uruchomić pod debugger (gdb, biegać, bt) nie działa dla Ciebie, a następnie:

  • Elementary: Może nie jesteś działa pod debuggerem, próbujesz po prostu przeanalizować pośmiertny zrzut rdzenia. (Jeśli uruchamiasz sesję debugowania, ale nie uruchamiasz programu lub kończysz, wtedy gdy poprosisz o ślad, gdb powie "Brak stosu" - ponieważ w ogóle nie ma uruchomionego programu. aby wpisać "run".) Jeśli to się zmieniło, nie zapomnij dodać trzeciego argumentu (core) po uruchomieniu gdb, w przeciwnym razie zaczniesz w tym samym stanie, nie dołączając do żadnego konkretnego procesu lub obrazu pamięci.
  • Trudne: Jeśli Twój program rzeczywiście działa, ale Twój gdb mówi "Brak stosu", być może twój wskaźnik stosu jest poważnie zmiażdżony. W takim przypadku może to być problem z przepełnieniem bufora, na tyle poważny, że całkowicie zmieści się w środowisku wykonawczym. GCC 4.1 obsługuje ProPolice "Stack Smashing Protector", który jest włączony z -fstack-protector-all. Można go dodać do GCC 3.x z łatką.
1

Problem wydaje się występować po pomyślnym zakończeniu programu.

Dla przypomnienia, miałem ten problem, ponieważ zapomniałem o powrocie w moim kodzie, co spowodowało, że mój program zakończył pracę z kodem błędu.