Wenn Sie verwenden -ggdb Option kompilieren und sehen, ob das funktioniert
http://sourceware.org/gdb/onlinedocs/gdb/Inline-Functions.html
Inlining ist eine Optimierung, die direkt an jedem Anruf Ort, anstatt springen zu einer gemeinsamen Routine eine Kopie des Funktionskörpers einfügt. gdb zeigt inlined Funktionen genau wie nicht-inlined Funktionen an. Sie erscheinen in Rückverfolgungen. Sie können ihre Argumente und lokalen Variablen anzeigen, mit ihnen in Schritt gehen, sie mit dem nächsten überspringen und mit dem Ende davon entkommen. Mit dem Befehl info frame können Sie prüfen, ob eine Funktion inline war.
Um inlineed Funktionen zu unterstützen, muss der Compiler Informationen über Inlining in den Debug-Informationen aufzeichnen - gcc im dwarf 2 Format tut dies, und einige andere Compiler machen das auch. gdb unterstützt nur inlined Funktionen, wenn Sie Zwerg 2 verwenden. Versionen von gcc vor 4.1 geben nicht zwei erforderliche Attribute aus ('DW_AT_call_file' und 'DW_AT_call_line'); gdb zeigt inlined Funktionsaufrufe mit früheren Versionen von gcc nicht an. Stattdessen werden die Argumente und lokalen Variablen von Inlined-Funktionen als lokale Variablen im Aufrufer angezeigt.
Der Körper einer Inlinefunktion ist direkt an seiner Aufrufstelle enthalten; Im Gegensatz zu einer nicht-inlined-Funktion gibt es keine Anweisungen für den Anruf. gdb gibt weiterhin vor, dass die Aufruf-Site und der Anfang der Inlined-Funktion unterschiedliche Anweisungen sind. Wenn Sie zur Aufruf-Site wechseln, wird die Aufruf-Site angezeigt und dann wird wieder die erste Zeile der Inline-Funktion angezeigt, obwohl keine zusätzlichen Anweisungen ausgeführt werden.
Dies macht Source-Level-Debugging viel klarer; Sie können sowohl den Kontext des Anrufs als auch die Auswirkung des Anrufs sehen. Nur durch eine einzige Anweisung mit stepi oder nexti zu gehen, tut dies nicht; einzelne Instruktionsschritte zeigen immer den Inline-Körper an.
Es gibt einige Möglichkeiten, die gdb erhebt nicht den Anspruch, dass inlined Funktion ruft die gleiche wie normale Anrufe sind:
Stützpunkte an der Aufrufstelle einer inlined Funktion einstellen kann nicht funktionieren, da der Aufruf-Website enthält keine Code. gdb kann den Haltepunkt nach dem Aufruf falsch in die nächste Zeile der umschließenden Funktion verschieben. Diese Einschränkung wird in einer zukünftigen Version von gdb entfernt. Bis dahin setzen Sie stattdessen einen Breakpoint auf eine frühere Zeile oder innerhalb der Inlined-Funktion. gdb kann den Rückgabewert von inlined-Aufrufen nach dem Befehl finish nicht finden.Dies ist eine Einschränkung der Compiler-generierten Debuginformationen; Danach können Sie zur nächsten Zeile springen und eine Variable ausgeben, in der Ihr Programm den Rückgabewert gespeichert hat.
Ein weiterer guter alter Freund Ebene printf ist:) –
@ Anand Rathi ..., ja, aber ich wollte nur wissen, ob das mit gdb möglich ist. –