我在 NASM 中写了这个简单的程序,我知道当堆栈增长到程序代码时 Linux 会结束程序,但是我如何在真实场景中调试这样的问题,显然忽略了这永远不会发生的事实。
section .data
section .bss
section .text
global _start
_start:
nop
mov eax,42
SillyLoop: push eax
jmp SillyLoop
nop
当我运行 gdb 时,我收到
Continuing.
Program received signal SIGSEGV, Segmentation fault.
SillyLoop () at sandbox.asm:10
这不是很有帮助,我如何提取更多信息(在真实程序中)?
这不是很有帮助,我如何提取更多信息(在真实程序中)?
您可以使用
where
命令检查调用堆栈(这里没有帮助,因为堆栈上只有一个例程),并使用 x/i $pc
检查当前的错误指令。给定:
(gdb) x/i $pc
=> 0x8049006 <SillyLoop>: push %eax
你可以立即告诉堆栈有问题(因为这是唯一原因
PUSH
可能会失败) - 你的ESP
已经搞砸了,或者你已经用完了堆栈.使用 info reg esp
(打印 0xff7fe000
)检查堆栈指针提供了另一个线索:您在页面边界上。
但归根结底,用汇编编程就像用一把非常锋利的刀——你需要知道自己在做什么,否则你会写出难以调试的程序。