在调试中查找地址信息

时间:2009-08-27 17:08:48

标签: memory debugging gdb

我正在学习用gdb解决一些运行时错误。以下是我的问题:

  1. 当由于某些内存的某些访问操作发生冲突而发生运行时错误时,是否可以在转储核心中找到该内存的地址?

  2. 给定一个地址,是否可以找出哪个变量正在使用它(地址可能位于变量内存的开头,结尾或中间)?

  3. 考虑到变量使用的内存,是否可以在其下方和右上方找到附近的变量?

  4. 谢谢和问候!

1 个答案:

答案 0 :(得分:5)

  1. 通常是的。假设你的程序 由于SIGSEGV而在GDB外部崩溃 并留下核心转储,你可以:
    答:找出哪个 指令实际上引起了 访问违规:

        (gdb) x/i $pc
    

    这通常是内存访问 指令,例如"movl $1,8(%eax)"。重要的是 然后寄存器有什么价值 这应该指向有效 记忆了。
    B.找出价值 该登记册:

       (gdb) p/x $eax
    

    这通常是0(你是 通过NULL指针写入, 或者一些无意义的价值,例如 0x32314043(你已经腐败了 指针,或用一个覆盖它 ASCII字符串)。

  2. GDB "info symbol"命令会告诉您哪个符号 (如果有的话)在指定地址附近。

  3. 使用相同的"info symbol"命令对地址稍微小一些,稍微大一点的“目标”变量的地址。

  4. 更新:
    info symbol不适用于本地(自动)变量,因为这些变量没有与之关联的(符号表)符号。

    要查找有关局部变量的信息,请执行"info locals"。然后,您可以使用

    打印他们的地址
    (gdb) print &a_local_variable
    

    我不知道有什么方法可以做反向(即将局部变量的地址映射回其符号名称)。但是,如果您只有少数本地人,那么通过“手动”将地址映射到其中一个地址通常是微不足道的。如果你有太多的本地人,这是一个糟糕的“代码味道” - 你应该重构你的代码,这样你就不会。