簡體   English   中英

如何獲得Linux下C ++程序中調用的函數的打印?

[英]How do I get a print of the functions called in a C++ program under Linux?

我想要的是混合使用靜態代碼分析(例如Doxygen)和使用GDB時可以看到的堆棧框架獲得的結果。 我知道我正在調試哪個有問題的函數,並且我想查看引導該函數調用執行的函數調用附近。 例如,運行一個簡單的HelloWorld! 將輸出類似:

main:
   Greeter::Greeter()
   Greeter::printHello()
   Greeter::printWorld()

從主函數表示,先調用構造函數,然后再調用printHello和printWorld函數。 請注意,在GDB中,如果我在printWorld處中斷,則無法在堆棧幀中看到被調用printHello的情況。

關於如何跟蹤函數調用而無需在無數個源文件中插入日志消息的痛苦的任何想法?

謝謝!!

gcc-finstrument-functions選項指示編譯器在每個函數入口和出口處調用用戶提供的概要分析函數。

您可以使用它來編寫僅記錄每個函數進入和退出的函數。

通過閱讀問題,我了解到您想要一個按順序執行的所有相關功能的列表。

不幸的是,沒有應用程序可以自動生成此列表,但是有幫助程序宏可以為您節省大量時間。 定義一個稱為LOGFUNCTION的宏或您想要的任何宏,並將其定義為:

#define LOGFUNCTION printf("In %s (%s:%d)\n", __PRETTY_FUNCTION__, __FILE__, __LINE__);

現在,您確實必須將行LOGFUNCTION粘貼到要添加跟蹤的任何位置。

只要您認為合適。

參見http://gcc.gnu.org/onlinedocs/gcc/Function-Names.htmlhttp://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html

GDB具有堆棧跟蹤功能,它可以滿足您的要求。

他想要的是獲取tha信息(例如,來自gdb的回溯信息),但是以比gdb更為“更精細”的格式打印。 我想你做不到 我的意思是,也許有些類型的應用程序可以跟蹤您的應用程序並執行類似的操作,但是我從未聽說過類似的應用程序。

最好的辦法是使用GDB,也許創建某種類型的bash腳本,該腳本使用gdb獲取信息並以您喜歡的方式打印出來。

當然,您的應用程序必須使用調試符號(對於gcc的-g參數)進行編譯。

我不完全確定gdb的回溯是什么問題,但分析器可能更接近您想要的? 例如,使用valgrind:

valgrind --tool cachegrind ./myprogram
kcachegrind callgrind.out.NNNN

您是否嘗試過使用gprof生成調用圖? 例如,您還可以使用gprof2dot將gprof輸出轉換為更輕松的內容。

暫無
暫無

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

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