首页 > 解决方案 > 使用断点和符号调试时出现 Gdb 问题

问题描述

我使用 Nasm 编写程序集,我想使用 gdb 调试程序,但是当我设置断点并运行程序时它不起作用。

该程序编译正常并链接,问题是gdb。

以下是要编译的命令:

 nasm -f elf64 -F dwarf -g   types.asm
 nasm -f elf64 -F dwarf -g   functions.asm
 nasm -f elf64 -F dwarf -g   Hello.asm
 ld -g -o Hello Hello.o functions.o types.o

这是我要调试 Hello.asm 的文件:

 %include "functions.asm"
 section .bss
     res: resb 1
     fout: resb 1

 section .text
    global _start:     ;must be declared for linker (ld)

 section .data
      msg db 'Hello, world!', 0xa  ;string to be printed
      len equ $ - msg     ;length of the string 
      filename db 'hello.txt'

  _start:               ;tells linker entry point
       mov ecx,5
       mov edx,4
       call sum
       mov [res],eax
       mov  edx,1     ;message length
       mov  ecx,res  ;message to write
       mov  ebx,1       ;file descriptor (stdout)
       mov  eax,4       ;system call number (sys_write)
       int  0x80        ;call kernel
       write_string msg,len
       create_file filename
       mov [fout],eax
       close_file [fout]


       call print_msg

       mov  eax,1       ;system call number (sys_exit)
       int  0x80       ;call kernel

  sum:
     mov eax,ecx
     add eax,edx
     add eax,'0'
     ret

接下来我打开gdb:

gdb Hello
(gdb) break _start
Function «_start» not defined
¿Compilación de breakpoint pendiente hasta futura cargada de biblioteca compartida? (y or [n]) y     
 Punto de interrupción 1 (_start) pendiente.
(gdb) run  
 Starting program: /asm/Hello 
 9Hello, world!
 Hello, world!from another file
 [Inferior 1 (process 5811) exited with code 01]
 (gdb) 

标签: linuxassemblyx86gdbnasm

解决方案


我解决了它,我只将位置部分 .data 更改为部分 .text 并且调试器工作。我不知道为什么,但现在 gdb 采用 .start。


推荐阅读