c - gdb false 可以重新创建帧的寄存器吗?
问题描述
我正在分析我的应用程序的核心转储,当我转到第 1 帧时,我打印存储在 EAX 中的变量的值。Gdb 打印值,如果它是真的程序不会调用恐慌(反汇编显示,它比较来自寄存器的值,所以没有其他线程可以改变它)。我调用info reg
并且指令指针的一部分给了我帧#0和#1的相同结果。是否有可能,Gdb 在帧 #1 中显示帧 #0 的寄存器 EAX 的值?
编辑:代码如下所示:
switch(myVar){
case -1:
break;
default:
panic();
}
gdb 显示:
(gdb) bt
#0 panic()
#1 0x0891a3e9 in myFunc() at myFunc.c:10
(gdb) up
#1 0x0891a3e9 in myFunc() at myFunc.c:10
10 panic();
(gdb) print myVar
$1 = -1
(gdb) print &myVar
Address requested for identifier "myVar" which is in register $eax
解决方案
是否有可能,Gdb 在帧 #1 中显示帧 #0 的寄存器 EAX 的值?
不仅可能,而且目前是.
GDB 在调用堆栈中向上/向下时不恢复寄存器,除了$EBP
and$ESP
和$EIP
(有时$EBX
)。
可以说这是令人困惑的(当您在帧之间导航时,您看不到非恢复寄存器的实际值)。
GDB 一直以来都是这样,在汇编级别进行调试的人知道如何从堆栈中“钓”出正确的值。
推荐阅读
- react-router - 在 HOC 中包装 React Route 渲染组件
- pandas - 计算`pd.Timestamp`差异与`pd.DateOffset`的关系
- stored-procedures - 如何将存储过程保存到 Azure SQL Server
- oauth - 几天以来,刷新令牌已自动过期
- c - 使用 pthread_create 出现分段错误
- vue.js - 在 Vuetify 中的两个图标之间留出空间
- python - Matplotlib - 颜色编码数据绘图线?
- c++ - 在for循环中接收信息会产生奇怪的错误
- python - 如何修复此错误:(-4:内存不足)无法在函数中分配 6220800 字节?
- laravel - 如何在 Laravel 中使用带有签名 V2 的 S3