2012-08-28 56 views
2

我有一些遺留的C++代碼,這些代碼多年以來一直沒有維護。我正試圖瞭解它目前的功能。它需要.xml輸入,並應該吐出一個輸出文本文件。兩個不同的.xml輸入文件需要大量不同的時間來處理,其中一個文件行爲正常,另一個則不正確。他們雖然開始相同。我想輸出當我用兩個不同的輸入執行代碼時所做的函數調用的日誌文件,並將這些日誌相互區分開以查看它們開始發生分歧的位置。我不能只在main()的第一行中斷代碼,並通過gdb中的控制流程來完成。這太耗時了。理想情況下,我想找到一種方法,像做對日誌文件的輸出函數調用

gdb --args old_exec inp1.xml -step >log1.txt
gdb --args old_exec inp2.xml -step >log2.txt
diff log1.txt log2.txt

的「 - 工序」標誌是不是真實的,當然,但也許某種方式來告訴它來記錄所有步驟做存在。有什麼想法嗎?謝謝!

回答

3

GCC編譯器有一個標誌-finstrument-functions,它使您的函數在進入和退出時調用特定的函數;你可以使用它來跟蹤你的代碼流。使用此標誌在使用中,您需要提供以下功能:

void __cyg_profile_func_enter (void *this_fn, void *call_site); 
void __cyg_profile_func_exit (void *this_fn, void *call_site); 

並牢記與intrumentation標誌,當你編譯了這些功能,它們不能被編譯!

您可以使用addr2line將指針轉換爲文件/函數/行號。在運行時記錄原始指針並執行驗屍地址轉換通常會更好。

查看http://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/瞭解更多詳情。

+0

非常感謝!我收集到,如果出於某種原因想要聲明(也可能定義)函數在使用-finstrument-functions標誌編譯的源文件中輸入和退出,則可以使用屬性no_instrument_function聲明它們,以免溢出調用通過你會得到的無限遞歸堆棧。 – josh

+0

是的,不處理這些調用的屬性應該也能正常工作。有一件事我沒有留意 - 看到你標記了C++,你需要聲明這些'extern「C」'。另外 - 最好如果你編譯並使用'-g'鏈接,以充分利用符號解析。 – mah