我在Ubuntu 12.10 64位上运行。
我正在尝试在GDB中调试一个简单的程序集。然而,GDB的gui模式(-tui)似乎无法找到我的程序集文件的源代码。我已经重建了当前目录中的项目,并搜索谷歌,但没有任何效果,请在这里帮助我。
我的命令:
nasm -f elf64 -g -F dwarf hello.asm
gcc -g hello.o -o hello
gdb -tui hello调试信息似乎已经加载,我可以在main()设置一个断点,但屏幕的上半部分仍然写着“ No Source Available ”。
如果您感兴趣的话,这里是hello.asm:
; 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发布于 2012-12-25 12:10:07
本例中的问题是汇编程序没有为调试器生成行号信息。因此,尽管源是存在的(如果在gdb中使用"list“,它会显示源文件的列表--至少当我按照您的步骤执行时是这样的),但是调试器需要文件中的行号信息来知道哪一行对应于哪个地址。给出的信息是做不到的。
据我所知,没有办法让NASM发出.loc指令,例如as在使用gcc时所使用的指令。但是,as无法在不生成大量错误的情况下获取源文件,即使使用-msyntax=intel -mmnemonic=intel --您可能会认为这是可行的。
因此,除非更聪明的人能够想出一种方法来生成.loc条目,从而提供调试器行号信息,否则我不完全确定如何以您满意的方式回答您的问题。
发布于 2012-12-29 17:44:26
这句话是假的。
汇编程序确实生成行号信息(注意-g -F侏儒)位。
另一方面,他将明显的32位代码组装为64位,这可能工作,也可能不起作用。
现在,如果在NASM的调试输出中存在bug,我们需要知道这一点。
几个快速实验表明,addr2line (但不是gdb!)是否正确解码NASM生成的行号信息,但不使用矮人,因此在NASM产生矮人的方式上可能有错误。但也有一些奇怪的地方。
GNU addr2line版本2.22.52.0.1-10.fc 17 20120131,GNU ( gdb ) Fedora (7.4.50.20120-52.fc17)。
https://stackoverflow.com/questions/14027651
复制相似问题