【问题标题】:Finding variable name from instruction pointer using debugging symbols使用调试符号从指令指针中查找变量名
【发布时间】:2014-04-21 22:55:08
【问题描述】:

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

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

我发现 objdump 能够将指令地址转换为全局变量。但是我还没有找到对局部变量执行此操作的方法。例如,在下面的示例中,我想知道地址 0x4004c4 处的指令正在访问局部变量“local_hello”,地址 0x4004c9 处的指令正在访问局部变量“local_hello2”。

你好.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 hello”:

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)

【问题讨论】:

    标签: c debugging gcc static symbols


    【解决方案1】:

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

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

    到底你的目标是什么?

    【讨论】:

    • 找到一个适用于非优化代码的解决方案就足够了。我希望这些信息存储在通常的编译器调试符号中。我有兴趣在项目上下文中获取此类信息以检测和分析数据竞争。
    • @Warydo,也许使用源代码(采用 sparse 之类的东西)或测试编译器(例如,使用 LLWM 作为起点)更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    相关资源
    最近更新 更多