2015-04-12 11 views
5

ich einen Core Dump bin Inspektion und Werte Funktionsargumente drucken müssen, wenn nur ihre Typen bekannt sind (kein Argument Name Symbole):GDB: Wie Funktionsargument Werte drucken, wenn keine Namen Symbole verfügbar

(gdb) frame 7 
#7 0x00007f201a269e82 in f1(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char*, int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)() from /usr/lib64/libsome.so 
(gdb) info args 
No symbol table info available. 
(gdb) info f 
Stack level 7, frame at 0x7f200ebf9e50: 
rip = 0x7f201a269e82 
    in f1(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char*, int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >*); saved rip 0x7f201b430905 
called by frame at 0x7f200ebfa1c0, caller of frame at 0x7f200ebf9e00 
Arglist at 0x7f200ebf9df8, args: 
Locals at 0x7f200ebf9df8, Previous frame's sp is 0x7f200ebf9e50 
Saved registers: 
    rbx at 0x7f200ebf9e28, rbp at 0x7f200ebf9e30, r12 at 0x7f200ebf9e38, r13 at 0x7f200ebf9e40, rip at 0x7f200ebf9e48 

Insbesondere muss ich wissen, was im ersten Argument (std :: string) und im letzten (std :: string *) steht. Die arglist und die Einheimischen in diesem Rahmen sowohl auf die gleiche Adresse ...

+0

versuchen, diese Funktion zu disassemblieren., Erhalten Sie möglicherweise Informationen über die Argumente der Funktion. –

Antwort

4

Es gibt keine einfache Möglichkeit, dies zu tun.

Was Sie tun müssen, ist, die ABI für Ihre Plattform nachzuschlagen und diese dann zu verwenden, um die Argument-passing Konvention zu verstehen. Dies ist nicht immer einfach, aber es kann getan werden. Dadurch erfahren Sie, wie Sie die Argumente finden, ob sie sich in Registern oder im Speicher befinden. und dann können Sie Umwandlungen zu den entsprechenden Typen verwenden, um sie zu drucken.

Natürlich kann das Casting auch schwierig sein, wenn Sie keine Debuginfo haben. Obwohl es einen Trick gibt: kompilieren Sie eine Dummy-Datei mit -g, die die Typen hat, die Sie benötigen, und dann symbol-file es in gdb, um Zugriff auf die Typen zu erhalten. Dies hat natürlich Vorbehalte, Sie müssen die richtigen Compiler-und Bibliotheksversionen, korrekte Compiler-Ziel und ABI ändern Flags usw.

Es ist wirklich viel, viel, viel besser im Voraus zu planen und immer Debug-Informationen irgendwo haben. Was dir jetzt nicht weiterhilft, aber in Zukunft könnte. In der Lage zu sein, ein Programm zu versenden, aber die Debug-Informationen für später verfügbar zu halten, ist im Grunde genommen der Grund dafür, dass geteilte Debuginfo erfunden wurde.

Auch, es ist erwähnenswert, dass die gdb frame Ausgabe hat sich nicht viel verändert seit den Tagen Stich, die lange vorbei sind. Ich denke, dass die Informationen "Arglist" und "Einheimische" mit DWARF und modernen ABIs wirklich bedeutungslos sind. Es gibt einen gdb-Bug, der offen dafür ist, dies zu beheben.

Verwandte Themen