gdb: jak wydrukować bieżącą linię lub znaleźć bieżący numer linii?

97

list Polecenia wypisują zestaw wierszy, ale potrzebuję jednej pojedynczej linii, gdzie jestem i gdzie prawdopodobnie wystąpił błąd.

Boris Burkov
źródło
23
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!

kumar_m_kiran
źródło
1
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:

(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 .

user3162307
źródło
22

Polecenie, w którym można użyć lub ramki . gdzie polecenie poda więcej informacji wraz z nazwą funkcji

pravu pp
źródło
21

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ć.

albfan
źródło
2
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.

Mazhar MIK
źródło