2013-03-07 12 views
5

Aby utworzyć .out wykonywalny, muszę wpisać:Programowanie C: Jak używać gdb z Makefile i argumentami wiersza poleceń?

$: make 
$: myprogram.out name.ged 

Mój program zawiera argument wiersza poleceń, więc "name.ged".

Ilekroć uruchomić gdb po uzyskaniu winy segmentacji (rdzeń po cenach dumpingowych), wejdę:

$: gdb a.out core 
(gdb): bt 

Następnie użyj polecenia prześledzić wstecz i GDB powraca:

#0 0x4a145155 in ??() 
#1 0x08a16ce0 in ??() 

Próbowałem nawet użycie polecenia up t przesunięcie w górę stosu, ale wciąż nie ma szczęścia. Nie mogę powiedzieć, która linia w moim programie daje mi błąd seg. gdb współpracuje z moimi innymi programami, które nie wymagają pliku Makefile i argumentów poleceń, więc zastanawiam się, czy moje polecenia są niepoprawne.

+4

potrzeby kompilacji z '-g' flagi. Ponieważ nie opublikowałeś Makefile, nie mogę ci pomóc. –

+0

Więc czy polecenie brzmi gcc -g myprogram.out nazwa.ged? – Bonnie

+0

W pliku make znajduje się polecenie kompilacji kodu (gcc ...) To polecenie wymaga flagi -g do dodania dodatkowych informacji dla gdb do efektywnego działania. –

Odpowiedz

7

Podsumowywanie komentarzy (zanim ktokolwiek zrobi :).

W pliku wykonywalnym brakuje symbolicznych informacji wymaganych przez gdb do wyświetlenia odpowiedniego kodu źródłowego. Musisz dodać opcję -g do polecenia kompilacji i utworzyć nowy plik wykonywalny. Następnie ponownie przeprowadź test na wypadek niepowodzenia, aby utworzyć nowy plik core. gdb z tym plikiem wykonywalnym i rdzeniem będzie w stanie pokazać stos wywołań funkcji za pomocą backtrace.

W pliku Makefile najłatwiej jest dodać zmienną CFLAGS, która jest używana z niejawną regułą .o.c.

CFLAGS= -g -Wall -Wextra 

Możesz dodać to bezpośrednio do linii poleceń (zakładając przyzwoitą powłokę :). Ustawia to wartość jako zmienną środowiskową podczas wykonywania komendy make (i podkomend).

$ CFLAGS='-g -Wall -Wextra' make 

Właściwie zaleciłbym dodanie tego do twojego bash .profile, dzięki czemu zawsze uzyskasz najwięcej informacji z kompilatora.

CFLAGS='-Wall -Wextra' 

Wtedy, gdy jest to potrzebne, umieścić to w makefile dokonać debuggable wykonywalny:

CFLAGS+= -g 
Powiązane problemy