2015-04-12 29 views
5

我檢查覈心轉儲和名稱符號需要打印函數的參數值時,只有它們的類型是已知的(沒有參數名稱符號):GDB:如何打印功能的參數值時沒有可用的

(gdb) frame 7 
#7 0x00007f201a269e82 in f1(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char*, int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)() from /usr/lib64/libsome.so 
(gdb) info args 
No symbol table info available. 
(gdb) info f 
Stack level 7, frame at 0x7f200ebf9e50: 
rip = 0x7f201a269e82 
    in f1(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char*, int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >*); saved rip 0x7f201b430905 
called by frame at 0x7f200ebfa1c0, caller of frame at 0x7f200ebf9e00 
Arglist at 0x7f200ebf9df8, args: 
Locals at 0x7f200ebf9df8, Previous frame's sp is 0x7f200ebf9e50 
Saved registers: 
    rbx at 0x7f200ebf9e28, rbp at 0x7f200ebf9e30, r12 at 0x7f200ebf9e38, r13 at 0x7f200ebf9e40, rip at 0x7f200ebf9e48 

具體來說,我需要知道第一個參數(std :: string)和最後一個參數(std :: string *)中的內容。 的的arglist當地人在這個框架都指向同一個地址......

+0

試圖解開這個函數,可能你會得到一些關於函數參數的信息。 –

回答

4

有沒有簡單的方法來做到這一點。

你需要做的是查找你的平臺的ABI,然後用它來理解參數傳遞約定。這並非易事,但可以完成。這將告訴你如何找到參數,無論它們是在寄存器還是存儲器中;然後你可以使用強制類型來打印它們。

當然,如果您沒有debuginfo,鑄造也可能很困難。雖然有一個訣竅:編譯一個帶有-g的虛擬文件,它有你需要的類型,然後symbol-file它到gdb中來訪問這些類型。這當然有一些注意事項,你必須使用正確的編譯器和庫版本,正確的編譯器目標和ABI改變標誌等。

提前計劃和總是在某處調試信息真的好多了。這對你現在沒有幫助,但可能在未來。能夠發佈程序但將調試信息提供給以後使用基本上是分離調試信息被髮明出來的原因。

另外,值得注意的是,自從已久的刺傷日子以來,gdb frame的輸出變化不大。我認爲「arglist」和「locals」信息對於DWARF和現代ABI來說是毫無意義的。有一個關於解決這個問題的gdb錯誤。