2009-01-24 4 views
17

verwendet und ich würde gerne wissen, ob es eine Möglichkeit gibt, ein Programm zu stoppen, wenn eine Funktion aus einer bestimmten Datei verwendet wird. Im Idealfall für das, was ich suche ist so etwas wie:Mit gdb stoppen Sie das Programm, wenn es eine Funktion aus der Datei X

GDB Stop when use a function from file foo.cpp 

Der Grund, dies zu tun ist, weil ich einen Code bin debuggen, die nicht von mir ist, und ich weiß nicht genau, was Funktionen aufgerufen werden wurden und welche Funktionen nicht. Gibt es in GDB eine Funktion, um das zu tun, wonach ich suche, oder eine andere empfohlene Vorgehensweise, um etwas Ähnliches zu tun?

Dank

+0

Bitte akzeptieren Sie: http://StackOverflow.com/A/478145/895245, es tut genau das, was Sie in der aktuellen GDB wollen. –

Antwort

21

Schritt 1: bauen eine Liste aller in foo.cpp
Die einfachste Art und Weise definiert Funktionen, die ich mir vorstellen kann (vorausgesetzt, Sie binutils und GNU grep haben):

nm a.out | grep ' T ' | addr2line -fe a.out | 
    grep -B1 'foo\.cpp' | grep -v 'foo\.cpp' > funclist 

Schritt 2: Konstruktion eines GDB-Skript, das einen Haltepunkt auf jedem der oben genannten Funktionen eingestellt:

sed 's/^/break /' funclist > stop-in-foo.gdb 

[Offensichtlich Schritte 1 und 2 kombiniert werden könnten; -]

Schritt 3: tatsächlich setzen die Stützpunkte:

gdb a.out 
(gdb) source stop-in-foo.gdb 

bei this Antwort sucht, eine noch einfachere Art und Weise (wenn Sie auf Fedora Linux sind), um herauszufinden, welche foo.cpp Funktionen aufgerufen werden:

ftrace -sym='foo.cpp#*' ./a.out 

Schade ftrace man Seite sagt, dies ist noch nicht implementiert.

+0

Ich wollte sagen, dies zu tun, aber +1, um es tatsächlich zu tun. =) –

+1

Scheint nicht, statische Funktionen aufzugreifen. –

0

gdb Stützpunkte haben ein paar Syntax ... See here.

Es wird allerdings nicht in der Datei auf einem beliebigen Funktion brechen ....

Edit: Sie könnte etwas tun Dumm wie alle Funktionen rufen Sie eine Dummy-Funktion void foo (void), und Breakpoint im Inneren. Zumindest würden Sie innerhalb der Datei brechen, und es sollte trivial sein zu finden, welche Funktion in der Seite der Datei X aufgerufen wird.

+0

Es ist keine schlechte Idee die Foo-Funktion, die Sache ist, dass ich viele Methoden und Dateien habe, die einzige Option, die ich vielleicht verwenden kann, ist Rbreak Regex. Danke – Eduardo

2

Angestellt russische Antwort sieht sehr gut aus, aber da Sie sagen:

Ich weiß nicht genau, welche Funktionen aufgerufen wurden und welche Funktionen sind nicht.

Würde ein Bericht, welche Funktionen betroffen sind, durch ein Code-Coverage-Tool wie gcov oder etwas beteiligt Valgrind erzeugte eine gute Lösung für das Problem sein?

1

können Sie Befehl verwenden:

break foo.cpp:function-name 
+0

Dies wird nur eine Funktion unterbrechen, aber die Frage ist für alle Funktionen. – Herbert

+0

'rbreak foo.cpp: .' bricht alle Funktionen von' foo.cpp' ab, die mit regex '.' übereinstimmen (also alle Funktionen von' foo.cpp'). – ShreevatsaR

10

rbreak regex

Setzen Sie Haltepunkte auf alle Funktionen mit dem regulären Ausdruck regex entspricht.Dieser Befehl setzt einen unbedingten Haltepunkt für alle Treffer und druckt eine Liste aller gesetzten Haltepunkte. Sobald diese Haltepunkte gesetzt sind, werden sie genau wie die Haltepunkte behandelt, die mit dem Befehl break gesetzt wurden. Sie können sie löschen, sie deaktivieren oder sie auf die gleiche Weise wie jeden anderen Haltepunkt konditionieren.

Die Syntax des regulären Ausdrucks ist die Standardsprache, die mit Werkzeugen wie `grep 'verwendet wird. Beachten Sie, dass sich dies von der Syntax unterscheidet, die von Shells verwendet wird. So entspricht beispielsweise foo * allen Funktionen, die ein fo gefolgt von null oder mehr os enthalten. Es gibt ein implizites. *, Das den regulären Ausdruck, den Sie liefern, vor und nachgibt. Um also nur Funktionen zu finden, die mit foo beginnen, verwenden Sie^foo.

Beim Debuggen von C++ - Programmen eignet sich rbreak zum Festlegen von Haltepunkten bei überladenen Funktionen, die keiner speziellen Klasse angehören.

+1

Das scheint mir besser zu sein als die angenommene Antwort :) – kizzx2

+0

Das hat mir enorm geholfen! Obwohl ich denke, es kann nicht die akzeptierte Antwort sein, da es Funktionsnamen und nicht den Dateinamen der Datei entspricht, in der es sich befindet. –

1

rbreak foo.cpp:.

Hier . passt alles, und so bricht auf alle Funktionen der Datei foo.cpp.