使用调试符号从指令指针中查找变量名称

时间:2014-03-16 20:22:12

标签: c debugging gcc static symbols

我正在寻找一种方法来查找给定指令(执行内存访问)访问的变量的名称。

使用调试符号,例如addr2line或objdump,它很容易将指令地址转换为源代码文件+行号,但遗憾的是,通常单个源代码行包含多个变量,因此这种方法不会具有足够细的粒度。

我发现objdump能够将指令地址转换为全局变量。但我还没有找到办法为局部变量做这个。例如,在下面的示例中,我想知道地址0x4004c4处的指令正在访问本地变量" local_hello"并且地址0x4004c9处的指令正在访问本地变量" local_hello2"。

HELLO.C:

int global_hello = 4;

int main(){
    int local_hello = 3;
    int local_hello2 = 0;
    local_hello2 = global_hello + local_hello;
    return local_hello2;
}

使用" objdump -S你好":

local_hello2 = global_hello + local_hello;
4004be:  8b 15 cc 03 20 00   mov    0x2003cc(%rip),%edx    # 600890 <global_hello>
4004c4:  8b 45 fc            mov    -0x4(%rbp),%eax
4004c7:  01 d0               add    %edx,%eax
4004c9:  89 45 f8            mov    %eax,-0x8(%rbp)

1 个答案:

答案 0 :(得分:0)

这可能适用于没有或只有中等优化级别的简单程序,但在编译器优化时会变得很困难。

您可能需要查看gdb源以了解将变量连接到优化编译器输出的工作。

毕竟你的目标是什么?