2016-04-18 35 views
2

任何人都可以告訴我函數名存儲在堆棧幀中。我知道返回地址存儲在鏈接寄存器(lr)中。但我的要求是實現回溯哪個打印函數名稱我不想打印函數地址。函數名在ARM7l中的堆棧幀中存儲(鏈接寄存器「lr」中的非函數地址)

+3

我很確定函數名不會存儲在堆棧上。 – Andreas

+0

[這個問題和答案](http://stackoverflow.com/questions/15752188/arm-link-register-and-frame-pointer)給出瞭如何手動執行此操作的詳細信息;這是**不是**罐裝解決方案,所以它聽起來像不適合你。你也可以使用'/ proc/self/stack'來查看任務的內核調用棧。這取決於內核'.config'選項。 –

+4

[如何從函數地址中使用鏈接寄存器(如backtrace \ _symbol)在linux中檢索函數名稱](http://stackoverflow.com/questions/36685976/how-to-retrieve-function-name-from-函數地址使用鏈接寄存器樣巴)還[如何展開...](http://stackoverflow.com/questions/29559347/how-to-unwind-the-stack-to-get -backtrace-for-the-specified-stack-pointer-sp) –

回答

5

有兩個API backtrace()backtrace_symbols()您可以使用打印回溯信息。請使用man backtrace瞭解關於這兩個API的更多詳細信息。

至於功能名稱,我不認爲它是保存在堆棧幀中,你需要參考地圖信息/符號表來找到它的地址。

+0

是的我在x86架構上使用'backtrace()'和'backtrace_symbols()'工作,但我希望它用於ARM架構。 inbuild圖書館不支持。 –

+0

inbuild library是什麼意思? – Harald

+0

@BhavithCAcharya如果你使用像''readelf -a'這樣的binutil工具,對ARM來說,它應該像'arm-poky-linux-gnueabi-readelf',你會發現函數名保存在.symtab節中,值,也許它會給你一些關於如何實現的線索。 – gzh

1

在C和C++函數名稱不存儲在堆棧幀中。

+0

那麼我怎樣才能得到函數名稱使用堆棧幀信息,如'backtrace_symbols()' –

0

您可以使用預處理器符號: __FILE____LINE__ 財產以後這樣的:printf("File: " __FILE__ "in Line: " __LINE__);

這將返回當前文件和行的函數被調用。請注意,字符串存儲在內存中。所以不要經常使用它。

相關問題