簡體   English   中英

使用調試符號從指令指針中查找變量名

[英]Finding variable name from instruction pointer using debugging symbols

我正在尋找一種查找給定指令(執行內存訪問)所訪問變量的名稱的方法。

使用調試符號和例如addr2line或objdump,可以很容易地將指令地址轉換為源代碼文件+行號,但是不幸的是,單個源代碼行通常包含多個變量,因此此方法的粒度不夠精確。

我發現objdump能夠將指令地址轉換為全局變量。 但是我還沒有找到對局部變量執行此操作的方法。 例如,在下面的示例中,我想知道地址0x4004c4處的指令正在訪問局部變量“ local_hello”,而地址0x4004c9處的指令正在訪問局部變量“ local_hello2”。

你好ç:

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)

這可能對沒有或只有中等優化級別的簡單程序有效,但隨着編譯器優化的增加,將變得困難。

您可能需要研究gdb源代碼,以了解將變量連接到優化的編譯器輸出的工作。

畢竟,您的目標是什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM