list
Polecenia wypisują zestaw wierszy, ale potrzebuję jednej pojedynczej linii, gdzie jestem i gdzie prawdopodobnie wystąpił błąd.
bt
lub backtrace
albo where
wypisuje stos wywołań funkcji, f
albo frame
wypisuje następną linię do wykonania.
list
Polecenia wypisują zestaw wierszy, ale potrzebuję jednej pojedynczej linii, gdzie jestem i gdzie prawdopodobnie wystąpił błąd.
bt
lub backtrace
albo where
wypisuje stos wywołań funkcji, f
albo frame
wypisuje następną linię do wykonania.
Odpowiedzi:
Otrzymuję te same informacje podczas debugowania. Chociaż nie, kiedy sprawdzam ślad stosu. Myślę, że prawdopodobnie użyłbyś flagi optymalizacji. Sprawdź ten link - coś związanego.
Spróbuj skompilować, -g3
usuwając wszelkie flagi optymalizacji. Wtedy to może zadziałać. HTH!
-g
aby zawierał informacje debugowania, obecnie jestem w ramce stosu, pobranej z jednej z bibliotek współdzielonych, która najwyraźniej nie została skompilowana, aby zawierała informacje o wierszach. Dzięki, kumar.
Polecenie „ramka” da ci to, czego szukasz. (Można to skrócić do po prostu „f”). Oto przykład:
(gdb) frame
\#0 zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0) at xsub.cpp:139
139 int rc = fq.recv (msg_);
(gdb)
Bez argumentu „ramka” po prostu mówi ci, gdzie jesteś (wraz z argumentem zmienia ramkę). Więcej informacji na temat polecenia ramki można znaleźć tutaj .
Należy pamiętać, że gdb to potężne polecenie, które może obsługiwać instrukcje niskiego poziomu, więc jest powiązane z koncepcjami asemblera.
To, czego szukasz, nazywa się wskaźnikiem instrukcji, tj .:
Rejestr wskaźnika instrukcji wskazuje na adres pamięci, który procesor będzie w następnej kolejności próbował wykonać. Wskaźnik instrukcji nazywa się ip w trybie 16-bitowym, eip w trybie 32-bitowym i zgrywanie w trybie 64-bitowym.
więcej szczegółów tutaj
wszystkie rejestry dostępne w wykonaniu gdb można wyświetlić za pomocą:
(gdb) info registers
dzięki niemu możesz sprawdzić, w jakim trybie działa Twój program (sprawdzanie, które z tych rejestrów istnieją)
następnie (tutaj używając obecnie najczęściej używanego register rip , w razie potrzeby zamień na eip lub bardzo rzadko IP ):
(gdb)info line *$rip
pokaże numer linii i źródło pliku
(gdb) list *$rip
pokaże ci tę linię z kilkoma przed i po
ale prawdopodobnie
(gdb) frame
w wielu przypadkach powinno wystarczyć.
ip
nigdy nie jest tutaj używane. Ponadto, zamiast wyraźnie pisowni nazwy licznika programu, można użyć aliasu GDB za nim: $pc
. Więc x/10i $pc
będzie demontować 10 instrukcji na bieżący wskaźnik instrukcji niezależnie od architektury - to będzie działać na i386, x86_64, ARM itp ..
Wszystkie powyższe odpowiedzi są poprawne, wolę używać trybu Tui (ctrl + XA), który pokazuje Twoją lokalizację i funkcję w osobnym oknie, co jest bardzo pomocne dla użytkowników. Mam nadzieję, że to też pomoże.
backtrace
lubwhere
nawetinfo line
lub po prostubt
(do śledzenia wstecznego). dirac.org/linux/gdb dla samouczka gdb