Ich habe Code-Assemblierung mit Yasm und Verknüpfung in meinem C++ - Programm, aber ich kann nicht Breakpoints in Gdb auf Symbole aus der Assembler-Sprachdatei setzen.Wie kann ich gdb verwenden, um Code zu debuggen, der mit yasm erstellt wurde?
Die Befehlszeilen sind wahrscheinlich nicht sehr beleuchtet, aber hier gehen wir:
"g++" -ftemplate-depth-128 -O0 -fno-inline -Wall -g -fPIC -std=c++11 -I"$HOME/usr/include" -c -o "bin/gcc-4.7/debug/main.o" "main.cpp"
yasm -g dwarf2 -f elf64 -o bin/gcc-4.7/debug/mandel.o mandel.yasm
"g++" -L"$HOME/usr/lib" -Wl,-R -Wl,"$HOME/usr/lib" -Wl,-rpath-link -Wl,"$HOME/usr/lib" -o "bin/gcc-4.7/debug/mandel" -Wl,--start-group "bin/gcc-4.7/debug/main.o" "bin/gcc-4.7/debug/mandel.o" -Wl,-Bstatic -Wl,-Bdynamic -lboost_system -lboost_thread -Wl,--end-group -g
Das alles ohne Zwischenfälle baut, und das Programm läuft. Aber wenn ich versuche, es in gdb zu laden, um es zu debuggen, kann ich anscheinend keine Breakpoints auf irgendwelche Funktionen in der Yasm-Datei setzen. Zum Beispiel habe ich dort eine Funktion namens MandelRect. Hier ist gdb mir zeigt, wo es aus, irgendwo in Haupt genannt:
(gdb) disassemble 0x404ada,0x404af0
Dump of assembler code from 0x404ada to 0x404af0:
0x0000000000404ada <main()+474>: mov %rax,%rdi
0x0000000000404add <main()+477>: callq 0x409980 <MandelRect>
0x0000000000404ae2 <main()+482>: movq $0x0,-0x18(%rbp)
0x0000000000404aea <main()+490>: jmp 0x404b1c <main()+540>
0x0000000000404aec <main()+492>: mov -0x18(%rbp),%rdx
End of assembler dump.
hier GDB zeigt mir, was die Adresse ist:
(gdb) info address MandelRect
Symbol "MandelRect" is at 0x409980 in a file compiled without debugging.
Hier ist gdb nicht in der Lage zu sein, einen Haltepunkt setzen darauf:
(gdb) break MandelRect
Function "MandelRect" not defined.
Make breakpoint pending on future shared library load? (y or [n]) n
Und wenn ich einen Haltepunkt an der richtigen Adresse setzen, wenn die Ausführung die Funktion erreicht, kann ich es nicht Anweisung für Anweisung durchlaufen. Es läuft nur von Etikett zu Etikett, soweit ich kann (zu belästigen) zu erzählen.
Offensichtlich - nun, vielleicht? - Dies hat etwas damit zu tun, dass gdb darauf besteht, dass die Datei ohne Debugging kompiliert wurde. Aber es scheint Symbole in der relevanten .o-Datei und in der binären zu sein:
~/tests/mandel/bin/gcc-4.7/debug% nm mandel.o | grep MandelRectAsm
0000000000000000 R MandelRectAsm
~/tests/mandel/bin/gcc-4.7/debug% nm mandel | grep MandelRectAsm
000000000040a340 R MandelRectAsm
~/tests/mandel/bin/gcc-4.7/debug% objdump -t mandel.o | grep -i MandelRectAsm
0000000000000000 g .txt 0000000000000000 MandelRectAsm
~/tests/mandel/bin/gcc-4.7/debug% objdump -t mandel | grep -i MandelRectAsm
000000000040a340 g .txt 0000000000000000 MandelRectAsm
Also, wie behebe ich das? Habe ich etwas missverstanden oder ist yasm -g
kaputt? Hat jemand jemals die Debug-Informationen von yasm mit gdb arbeiten lassen?
(System ist Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_64 GNU/Linux
.)
Ich würde nm & objdump -g auf mandel.o & madel versuchen, um zu sehen, wo Debug-Informationen verloren gehen/beschädigt werden. – dbrank0
Danke für den Vorschlag. Ich habe die Frage aktualisiert. 'objdump -g' hat für keine der Dateien, für die ich es ausprobiert habe, nichts für mich geschrieben (wie, buchstäblich, überhaupt nichts, außer zu sagen, dass die Datei elf64-x86-64 ist), also habe ich' objdump -t' verwendet stattdessen. –