c++ - test - gdb ubuntu
¿Cómo puedo usar gdb para depurar código ensamblado usando yasm? (1)
Tengo el código ensamblado usando yasm, y vinculo a mi programa C ++, pero no puedo establecer puntos de interrupción en gdb en símbolos del archivo de lenguaje ensamblador.
Las líneas de comando probablemente no son muy esclarecedoras, pero aquí vamos:
"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
Todo se desarrolla sin incidentes y el programa se ejecuta. Pero cuando intento cargarlo en gdb para depurarlo, parece que no puedo poner puntos de corte en ninguna función del archivo yasm. Por ejemplo, tengo una función llamada MandelRect. Aquí está gdb mostrándome de dónde se llama, en algún lugar en main:
(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.
Aquí está gdb mostrándome cuál es su dirección:
(gdb) info address MandelRect
Symbol "MandelRect" is at 0x409980 in a file compiled without debugging.
Aquí está el gdb que no puede poner un punto de interrupción en él:
(gdb) break MandelRect
Function "MandelRect" not defined.
Make breakpoint pending on future shared library load? (y or [n]) n
Y si pongo un punto de interrupción en la dirección correcta, cuando la ejecución alcanza la función, no puedo pasar por la instrucción por instrucción. Simplemente va de etiqueta en etiqueta, en la medida que puedo (me molesto) en contar.
Obviamente, bueno, tal vez? - Esto tiene algo que ver con la insistencia de gdb de que el archivo se compiló sin depuración. Pero parece que hay símbolos en el archivo .o relevante y en el binario:
~/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
Entonces, ¿cómo puedo arreglar esto? ¿He entendido mal algo, o está yasm -g
roto? ¿Alguien ha logrado que la información de depuración de yasm funcione con gdb?
(El sistema es Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_64 GNU/Linux
.)
Mi programa contenía código que estaba fuera de la sección .text
, ya que de alguna manera había logrado .text
mal el "texto" en el archivo asm (como se puede ver en el resultado de objdump anterior). yasm te permite nombrar tus secciones como quieras, y evidentemente terminan marcadas como ejecutables, pero claramente muchas herramientas no esperan esto ...
Esto también solucionó algunos resultados extraños que estaba obteniendo de perf
, también.