2014-10-26 8 views
7

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.)

+0

Ich würde nm & objdump -g auf mandel.o & madel versuchen, um zu sehen, wo Debug-Informationen verloren gehen/beschädigt werden. – dbrank0

+0

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. –

Antwort

2

Mein Programmcode enthalten, die außerhalb des .text Abschnitt war, wie ich irgendwie in der asm-Datei falsch schreiben „text“ verwaltet würde (wie Sie oben in der objdump Ausgabe sehen können). Mit yasm können Sie Ihre Sektionen nach Belieben benennen, und sie werden am Ende als ausführbar markiert, aber viele Tools erwarten dies nicht.

Dies behob auch einige seltsame Ergebnisse, die ich von perf erhielt.

Verwandte Themen