linux - 使用断点和符号调试时出现 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)
解决方案
我解决了它,我只将位置部分 .data 更改为部分 .text 并且调试器工作。我不知道为什么,但现在 gdb 采用 .start。
推荐阅读
- oracle - 我怎样才能避免这个错误,我已经做了一个触发器,但 DBMS 丢失了它?
- javascript - create-react-app 到网站的部分实现
- java - JavaFX 菜单栏 Windows 讲述人支持
- java - 从 Java 中的 try catch 块获取变量的问题
- react-native - React Native:重置路由,返回首页
- sql - 如何根据 SQL Server 中的行值获取列名?
- node.js - npm audit 不工作并且没有列出依赖项的描述
- java - How to detect in Java if SOAP message is MTOM
- ios - VTCompressionSession 比特率/数据率过冲
- python-3.x - 在 Peewee 中组合可选的已通过查询过滤器