2012-10-10 4 views
12

In GDB Eingabe des Befehls:GDB - Liste Quelle der aktuellen Funktion ohne seinen Namen

list function 

wird für die Funktion all die Quellenliste.

Gibt es einen Befehl, der alle Quellen der Funktion auflistet, in der Sie sich gerade befinden, ohne dass Sie den Funktionsnamen manuell eingeben müssen?

+2

Wie wäre es mit 'liste'? –

+1

Es druckt eine Anzahl von Zeilen, aber nicht die ganze Funktion. – s5s

+1

Sie können weiter nach der "Listenfunktion" eingeben, um den vorherigen Befehl zu wiederholen und die Funktion 10 Zeilen gleichzeitig auszudrucken. – Ben

Antwort

8
(gdb) help list 
List specified function or line. 
With no argument, lists ten more lines after or around previous listing. 
"list -" lists the ten lines before a previous ten-line listing. 
One argument specifies a line, and ten lines are listed around that line. 
Two arguments with comma between specify starting and ending lines to list. 
Lines can be specified in these ways: 
    LINENUM, to list around that line in current file, 
    FILE:LINENUM, to list around that line in that file, 
    FUNCTION, to list around beginning of that function, 
    FILE:FUNCTION, to distinguish among like-named static functions. 
    *ADDRESS, to list around the line containing that address. 
With two args if one is empty it stands for ten lines away from the other arg. 

Die *ADDRESS ist was interessant ist.

auf x86/x64 aktuellen Zeiger ist in rip Register so:

(gdb) list *$pc 
0x7ffff7b018a0 is at ../sysdeps/unix/syscall-template.S:82. 
77 in ../sysdeps/unix/syscall-template.S 

Das Beispiel ist von cat Befehl als ich etwas mit Debug-Informationen nicht zur Hand haben.

+2

Diese ID funktionierte nicht für mich auf GDB 7.7: es gedruckt '10' Zeilen um die aktuelle Zeile, genau wie' liste', nicht die gesamte Funktion. –

2

gdbtui kann nützlich sein, um die Quelle während des Debuggens anzuzeigen.

4

Wenn Sie in einem Funktionstyp bt für Backtrace gestoppt. Backtrace listet den aktuellen Stapel auf. Das Element oben, # 0, ist normalerweise die Funktion, an der Sie interessiert sind, und die Quelldatei und die Zeilennummer werden ebenfalls aufgelistet.

Zum Beispiel:

(gdb) bt 
#0 myClass::EntityTypeStruct::readAttributes (this=0x7fffd00066e0, buf=0x7fffd0006020 "", len=48) 
    at /team/project/src/EntityTypeStruct.cc:55 
#1 0x000000000044ca86 in workerThread (ts=0x7fffea71dcc0) 
    at /team/project/src/threads/workerThread.cc:219 
#2 0x00007ffff775e9d1 in start_thread() from /lib64/libpthread.so.0 
#3 0x00007ffff6c07b5d in clone() from /lib64/libc.so.6 

Siehe http://www.chemie.fu-berlin.de/chemnet/use/info/gdb/gdb_7.html#SEC42 für weitere Informationen.

Auch, wenn Sie einen Haltepunkt festlegen können Sie festlegen, Befehle, die jedes Mal ausgeführt wird treffen Sie diesen Breakpoint. Siehe http://www.chemie.fu-berlin.de/chemnet/use/info/gdb/gdb_6.html#SEC35

Also, wenn Sie wissen, wie viele Zeilen in Ihrer Funktion sind Sie einen Befehl gesetzt könnten alle Sourceleitungen der Funktion zur Liste:

(gdb) break myClass::EntityTypeStruct::readAttributes 
Breakpoint 1 at 0x61ec3b: file /team/project/src/EntityTypeStruct.cc, line 38. 
(gdb) commands 1 
list 38,104 
end 
+0

Ein wenig zu spät zur Party, aber eindeutig die beste Antwort. –

1

Der ‚Rahmen‘ Befehl zeigt die Funktionsnamen und die aktuelle Zeilenposition und setzt die aktuelle Zeile für die Liste auf die aktuelle ausführbare Zeile.

set listsize 17 
frame 
list 

listet die 8 Zeilen auf, die die aktuelle Zeile umgeben.

Verwandte Themen