如何使用 gdb 调试堆栈分段错误?

问题描述 投票:0回答:1

我在 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

这不是很有帮助,我如何提取更多信息(在真实程序中)?

linux debugging gdb nasm
1个回答
1
投票

这不是很有帮助,我如何提取更多信息(在真实程序中)?

您可以使用

where
命令检查调用堆栈(这里没有帮助,因为堆栈上只有一个例程),并使用
x/i $pc
检查当前的错误指令。给定:

(gdb) x/i $pc
=> 0x8049006 <SillyLoop>:       push   %eax

你可以立即告诉堆栈有问题(因为这是唯一原因

PUSH
可能会失败) - 你的
ESP
已经搞砸了,或者你已经用完了堆栈.使用
info reg esp
(打印
0xff7fe000
)检查堆栈指针提供了另一个线索:您在页面边界上。

但归根结底,用汇编编程就像用一把非常锋利的刀——你需要知道自己在做什么,否则你会写出难以调试的程序。

© www.soinside.com 2019 - 2024. All rights reserved.