任何人都可以告訴我函數名存儲在堆棧幀中。我知道返回地址存儲在鏈接寄存器(lr)中。但我的要求是實現回溯哪個打印函數名稱我不想打印函數地址。函數名在ARM7l中的堆棧幀中存儲(鏈接寄存器「lr」中的非函數地址)
2
A
回答
5
有兩個API backtrace()
和backtrace_symbols()
您可以使用打印回溯信息。請使用man backtrace
瞭解關於這兩個API的更多詳細信息。
至於功能名稱,我不認爲它是保存在堆棧幀中,你需要參考地圖信息/符號表來找到它的地址。
1
在C和C++函數名稱不存儲在堆棧幀中。
+0
那麼我怎樣才能得到函數名稱使用堆棧幀信息,如'backtrace_symbols()' –
0
您可以使用預處理器符號: __FILE__
和__LINE__
財產以後這樣的:printf("File: " __FILE__ "in Line: " __LINE__);
這將返回當前文件和行的函數被調用。請注意,字符串存儲在內存中。所以不要經常使用它。
相關問題
- 1. 在遞歸函數中存儲堆棧
- 2. 將函數的參數傳遞給堆棧還是寄存器?
- 3. 函數參數名稱和C中堆棧幀的變量名?
- 4. 如何將堆棧指針寄存器中的值存儲到存儲器(8085)?
- 5. 存儲在寄存器中的變量的地址
- 6. 爲什麼存儲在寄存器中的數據有內存地址?
- 7. 存儲在堆內存中的成員數據的地址
- 8. Python是否將函數參數加載到寄存器中,還是將它們保存在堆棧中?
- 9. 如何在C++中記錄函數的堆棧返回地址
- 10. 動態地改變追蹤/堆棧幀函數的名字
- 11. 加載地址存儲在MIPS寄存器中
- 12. 如何釋放先前堆棧幀的存儲器中的Javascript
- 13. 如何將數據存儲在存儲器或寄存器中
- 14. 我應該將sockaddr與push一起存儲在堆棧中還是存儲在syscall connect的寄存器中?
- 15. MIPS RISC計數存儲在寄存器中的非零位的數量$ a0
- 16. 接收器堆棧已滿 - 保存表格函數的輸出
- 17. 爲什麼我們將s寄存器中的值存入堆棧而不是在函數中移動到新的寄存器?
- 18. 堆棧參數從堆棧中的錯誤內存地址讀取
- 19. ARM彙編,POP堆棧和存儲在寄存器
- 20. ARM彙編中的Raspberry Pi寄存器r0-r4中是否存在嚴格的函數參數存儲序列?
- 21. 在Zend Framework中調用MYSQL存儲函數(非存儲過程)
- 22. main函數的C函數沒有推動棧中的堆棧
- 23. 爲什麼參數存儲在寄存器中而不是x86-64彙編中的堆棧上?
- 24. 在Meteor中的MongoDB中存儲函數
- 25. 堆棧上EBP寄存器的大小?
- 26. 在堆棧內存中存儲引用
- 27. 如何在C中調用時存儲函數地址?
- 28. 的Windows Phone 8.1,避免存儲幀在堆棧中
- 29. 根據堆中的內存地址查找哪個函數分配了堆
- 30. 如何檢查windbg中特定調用堆棧幀上的寄存器值
我很確定函數名不會存儲在堆棧上。 – Andreas
[這個問題和答案](http://stackoverflow.com/questions/15752188/arm-link-register-and-frame-pointer)給出瞭如何手動執行此操作的詳細信息;這是**不是**罐裝解決方案,所以它聽起來像不適合你。你也可以使用'/ proc/self/stack'來查看任務的內核調用棧。這取決於內核'.config'選項。 –
[如何從函數地址中使用鏈接寄存器(如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) –