Debugging gdb不使用NASM在所有断点处停止
我最近才开始学习汇编(NASM)。我正在学习的这本书是为32位cpu编写的,但我的电脑是64位的 我有一个“sandbox.asm”文件,我将代码放入其中,然后在组装后,我在gdb中运行程序,查看寄存器值以及每行的内容等 有时我会在gdb中遇到我不理解的错误 这是我的沙盒。asm:Debugging gdb不使用NASM在所有断点处停止,debugging,assembly,gdb,x86-64,nasm,Debugging,Assembly,Gdb,X86 64,Nasm,我最近才开始学习汇编(NASM)。我正在学习的这本书是为32位cpu编写的,但我的电脑是64位的 我有一个“sandbox.asm”文件,我将代码放入其中,然后在组装后,我在gdb中运行程序,查看寄存器值以及每行的内容等 有时我会在gdb中遇到我不理解的错误 这是我的沙盒。asm: 1 section .data 2 section .text 3 4 global _start 5 6 _start: 7 nop 8 ; test code
1 section .data
2 section .text
3
4 global _start
5
6 _start:
7 nop
8 ; test code below
9 mov rax,5
10 mov rbx,3
11 mul rbx
12 ; test code above
13 nop
14
15 section .bss
一个足够简单的程序,5应该进入rax,3应该进入rbx,结果应该在rdx和rax中结束
但是gdb运行到最后,只在1个断点处停止(不确定它是否正在这样做,或者是否在“nop”处停止)
204来自哪里?至少3与之相乘,并将结果放入rax(612)
为什么我也会犯错误?我尝试使用32位(eax)、16位(ax)甚至8位寄存器作为“mov”指令的寄存器,但gdb根本不能很好地使用它们
而且,即使源文件位于同一目录中,“$gdb-tui sandbox”也无法工作,因此我在一个终端中打开了gdb,在另一个终端中打开了ed中的代码
是否有更好的调试器专门用于汇编(而不是像c一样的gdb)?很抱歉发布,我刚刚找到了解决方案 我以前的makefile是:
1 sandbox: sandbox.o
2 ld -o sandbox sandbox.o
3 sandbox.o: sandbox.asm
4 nasm -f elf64 -g -F stabs sandbox.asm
但现在我把它改成:
1 sandbox: sandbox.o
2 ld -o sandbox sandbox.o
3 sandbox.o: sandbox.asm
4 nasm -f elf64 -g -F dwarf sandbox.asm
“侏儒”的命令让世界变得不同
现在gdb的行为与我期望的一样。注意,您可以
stepi
(又称si
)按指令单步执行,并使用disas
。(或layout reg
)。那么你就不需要任何调试信息了。您可以使用starti
(在\u start
处的第一条用户空间指令之前停止)在暂停状态下启动程序。请参阅下面的asm调试提示,为什么我也会出现segfault?-和
1 sandbox: sandbox.o
2 ld -o sandbox sandbox.o
3 sandbox.o: sandbox.asm
4 nasm -f elf64 -g -F dwarf sandbox.asm