如何在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)
- 输入以下命令绑定钩子:
(gdb) commands 1 > p $rbp - $rsp > c > end
- 上述配置表示每次断点1触发时,自动打印当前栈帧大小后继续运行,不需要自动继续可以删除
c那一行。 - 跨架构通用场景可以把打印命令替换为
p $fp - $sp,GDB会自动适配对应架构的栈帧指针、栈顶指针别名。
注意事项
- 若程序编译时开启了
-fomit-frame-pointer无栈帧优化,rbp/ebp会被用作通用寄存器,无法用上述方法计算,需要关闭该优化重新编译后再调试。 - 计算递归调用的总栈占用时,直接用栈段最高地址减去当前
rsp的值,比逐层累加栈帧大小效率更高。 - 上述计算的是用户态栈的已用大小,不包含内核态栈的占用。
内容的提问来源于stack exchange,提问作者Андрій Немченко
相关产品推荐
相关产品推荐

