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

如何在GDB断点处获取当前栈的字节大小

GDB断点触发时获取当前栈字节大小操作指引

可以直接实现该需求,分为手动查询和自动打印两种方案:

方案1:断点触发后手动计算

  • 64位架构下,栈底地址存在rbp寄存器,栈顶地址存在rsp寄存器,触发断点后直接执行以下命令即可得到当前栈帧的字节大小:
    p $rbp - $rsp
  • 32位架构将寄存器替换为ebp和esp即可:
    p $ebp - $esp
  • 若需要查询整个线程栈的总已用大小,先执行info proc mappings找到栈内存段的最高起始地址,减去当前rsp/esp的值即可得到总用量。

示例输出:

(gdb) p $rbp - $rsp
$1 = 64

代表当前栈帧已使用64字节。

方案2:断点触发时自动打印栈大小

无需每次手动输入命令,给断点绑定钩子即可实现触发时自动输出:

  1. 先给目标位置打断点,记录断点编号(假设为1)
  2. 输入以下命令绑定钩子:
    (gdb) commands 1
    > p $rbp - $rsp
    > c
    > end
    
  • 上述配置表示每次断点1触发时,自动打印当前栈帧大小后继续运行,不需要自动继续可以删除c那一行。
  • 跨架构通用场景可以把打印命令替换为p $fp - $sp,GDB会自动适配对应架构的栈帧指针、栈顶指针别名。

注意事项

  • 若程序编译时开启了-fomit-frame-pointer无栈帧优化,rbp/ebp会被用作通用寄存器,无法用上述方法计算,需要关闭该优化重新编译后再调试。
  • 计算递归调用的总栈占用时,直接用栈段最高地址减去当前rsp的值,比逐层累加栈帧大小效率更高。
  • 上述计算的是用户态栈的已用大小,不包含内核态栈的占用。

内容的提问来源于stack exchange,提问作者Андрій Немченко

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:24:00