You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用GDB获取栈段错误(Segmentation Fault)的更多调试信息?

调试栈溢出导致的SIGSEGV问题(汇编程序场景)

已知Linux下栈增长至代码区域会触发程序终止,针对如下NASM汇编程序:

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

要提取更多调试信息,可采用以下方法:

  • 编译时添加完整调试符号
    编译NASM程序时启用调试信息生成:

    nasm -f elf32 -g -F dwarf sandbox.asm -o sandbox.o
    ld -m elf_i386 sandbox.o -o sandbox
    

    这样GDB能关联源码行、符号与内存地址,方便后续精准定位。

  • 在GDB中查看核心状态信息

    • 执行 bt 查看调用栈,确认当前执行流的上下文(即使是无限循环,也能验证是否卡在预期位置)
    • 执行 info registers 查看寄存器值,重点关注esp(栈指针)的地址,对比内存段布局判断栈的当前位置
    • 执行 x/20x $esp 查看栈顶附近的内存内容,执行 x/20x $eip 查看当前代码段内存,直接对比两者地址是否重叠
  • 检查进程内存布局
    在GDB中执行 info proc mappings,查看输出里的栈段(Stack)和代码段(Text)的地址范围,确认栈是否已经溢出到代码区域。

  • 配置GDB的信号处理逻辑
    执行 handle SIGSEGV stop print pass,确保SIGSEGV信号触发时,GDB会暂停程序并打印更详细的信号相关信息,而非仅显示基础错误提示。

  • 使用内存检测工具
    用Valgrind运行程序,它能精准检测非法内存访问:

    valgrind --tool=memcheck ./sandbox
    

    Valgrind会输出内存越界的具体位置、访问类型等细节,直接定位栈溢出问题。

内容的提问来源于stack exchange,提问作者The_Matrix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:22:50