我正在学习用gdb解决一些运行时错误。以下是我的问题:
当由于某些内存的某些访问操作发生冲突而发生运行时错误时,是否可以在转储核心中找到该内存的地址?
给定一个地址,是否可以找出哪个变量正在使用它(地址可能位于变量内存的开头,结尾或中间)?
考虑到变量使用的内存,是否可以在其下方和右上方找到附近的变量?
谢谢和问候!
答案 0 :(得分:5)
通常是的。假设你的程序
由于SIGSEGV
而在GDB外部崩溃
并留下核心转储,你可以:
答:找出哪个
指令实际上引起了
访问违规:
(gdb) x/i $pc
这通常是内存访问
指令,例如"movl
$1,8(%eax)"
。重要的是
然后寄存器有什么价值
这应该指向有效
记忆了。
B.找出价值
该登记册:
(gdb) p/x $eax
这通常是0(你是
通过NULL
指针写入,
或者一些无意义的价值,例如
0x32314043
(你已经腐败了
指针,或用一个覆盖它
ASCII
字符串)。
GDB
"info symbol"
命令会告诉您哪个符号
(如果有的话)在指定地址附近。
使用相同的"info symbol"
命令对地址稍微小一些,稍微大一点的“目标”变量的地址。
更新:
info symbol
不适用于本地(自动)变量,因为这些变量没有与之关联的(符号表)符号。
要查找有关局部变量的信息,请执行"info locals"
。然后,您可以使用
(gdb) print &a_local_variable
我不知道有什么方法可以做反向(即将局部变量的地址映射回其符号名称)。但是,如果您只有少数本地人,那么通过“手动”将地址映射到其中一个地址通常是微不足道的。如果你有太多的本地人,这是一个糟糕的“代码味道” - 你应该重构你的代码,这样你就不会。