backtracelub wherenawet info linelub po prostu bt(do śledzenia wstecznego). dirac.org/linux/gdb dla samouczka gdb
dwalter
btlub backtracealbo wherewypisuje stos wywołań funkcji, falbo framewypisuje następną linię do wykonania.
Eric Wang
Odpowiedzi:
21
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ć, -g3usuwając wszelkie flagi optymalizacji. Wtedy to może zadziałać. HTH!
Ach, więc chociaż mój program został skompilowany tak, -gaby 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.
Boris Burkov
107
Polecenie „ramka” da ci to, czego szukasz. (Można to skrócić do po prostu „f”). Oto przykład:
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.
Myślę, że GDB nie obsługuje trybu 16-bitowego, więc ipnigdy 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 $pcbę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 ..
Ruslan
4
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 gdbbt
lubbacktrace
albowhere
wypisuje stos wywołań funkcji,f
alboframe
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!źródło
-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 .
źródło
Polecenie, w którym można użyć lub ramki . gdzie polecenie poda więcej informacji wraz z nazwą funkcji
źródło
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 .:
więcej szczegółów tutaj
wszystkie rejestry dostępne w wykonaniu gdb można wyświetlić za pomocą:
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 ):
pokaże numer linii i źródło pliku
(gdb) list *$rip
pokaże ci tę linię z kilkoma przed i po
ale prawdopodobnie
w wielu przypadkach powinno wystarczyć.
źródło
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ęcx/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.
źródło