linux assembly gdb nasm

linux - GDB se queja Sin fuente disponible



assembly nasm (2)

Me estoy ejecutando en Ubuntu 12.10 64 bits.

Estoy intentando depurar un programa de ensamblaje simple en GDB. Sin embargo, el modo gui de GDB (-tui) parece no poder encontrar el código fuente de mi archivo de ensamblaje. Reconstruí el proyecto en el directorio actual y busqué google sin éxito, por favor ayúdenme aquí.

Mis comandos:

nasm -f elf64 -g -F dwarf hello.asm gcc -g hello.o -o hello gdb -tui hello

La información de depuración parece estar cargada, puedo establecer un punto de interrupción en main () pero la mitad superior de la pantalla aún dice '' [Sin fuente disponible] ''.

Aquí está hello.asm si estás interesado:

; hello.asm a first program for nasm for Linux, Intel, gcc ; ; assemble: nasm -f elf -l hello.lst hello.asm ; link: gcc -o hello hello.o ; run: hello ; output is: Hello World SECTION .data ; data section msg: db "Hello World",10 ; the string to print, 10=cr len: equ $-msg ; "$" means "here" ; len is a value, not an address SECTION .text ; code section global main ; make label available to linker main: ; standard gcc entry point mov edx,len ; arg3, length of string to print mov ecx,msg ; arg2, pointer to string mov ebx,1 ; arg1, where to write, screen mov eax,4 ; write command to int 80 hex int 0x80 ; interrupt 80 hex, call kernel mov ebx,0 ; exit code, 0=normal mov eax,1 ; exit command to kernel int 0x80 ; interrupt 80 hex, call kernel


El problema en este caso es que el ensamblador no está produciendo información de número de línea para el depurador. Entonces, aunque la fuente está ahí (si haces "list" en gdb, muestra una lista del campo de origen - al menos cuando sigo tus pasos, sí lo hace), pero el depurador necesita información del número de línea del archivo para saber qué línea corresponde a qué dirección. No puede hacer eso con la información dada.

Hasta donde puedo encontrar, no hay una manera de hacer que NASM emita la directiva .loc que se usa al usar gcc por ejemplo. Pero as no es capaz de tomar su archivo fuente sin generar un montón de errores [incluso con -msyntax = intel -mmnemonic = intel - usted pensaría que eso debería funcionar].

Así que, a menos que alguien más inteligente pueda encontrar una forma de generar las entradas .loc que proporciona la información del número de línea del depurador, no estoy del todo seguro de cómo podemos responder a su pregunta de una manera que le haga feliz.


Esta declaración es falsa.

El ensamblador produce información del número de línea (observe los bits -g -F enano).

Por otro lado, ensambla lo que obviamente es código de 32 bits como 64 bits, que pueden funcionar o no.

Ahora, si hay errores en la salida de depuración de NASM, necesitamos saber eso.

Un par de experimentos rápidos muestra que addr2line (¡pero no gdb!) Decodifica correctamente la información del número de línea generada por NASM utilizando puñaladas, pero no usa enanismo, por lo que probablemente haya algo incorrecto en la forma en que NASM genera DWARF ... pero también algo extraño gdb.

GNU addr2line versión 2.22.52.0.1-10.fc17 20120131, GNU gdb (GDB) Fedora (7.4.50.20120120-52.fc17)).