由於我使用activemq-cpp API的方式,我的ActiveMQ庫中發生了間歇性崩潰。如果我能觀察導致崩潰的每個函數,調試問題就會容易得多。在Visual Studio 2005 C++多線程程序中是否有任何快速方法來跟蹤函數的進入和退出?追蹤Visual Studio 2005 C++多線程程序中函數的進入和退出的快速方法是什麼?
在此先感謝!
由於我使用activemq-cpp API的方式,我的ActiveMQ庫中發生了間歇性崩潰。如果我能觀察導致崩潰的每個函數,調試問題就會容易得多。在Visual Studio 2005 C++多線程程序中是否有任何快速方法來跟蹤函數的進入和退出?追蹤Visual Studio 2005 C++多線程程序中函數的進入和退出的快速方法是什麼?
在此先感謝!
使用Tracer對象。事情是這樣的:
class Tracer
{
public:
Tracer(const char *functionName) : functionName_(functionName)
{
cout << "Entering function " << functionName_ << endl;
}
~Tracer()
{
cout << "Exiting function " << functionName_ << endl;
}
const char *functionName_;
};
現在,你可以簡單地實例在頂部有一個物體示蹤功能,它會自動打印「出來......」當函數退出,並調用析構函數:
void foo()
{
Tracer t("foo");
...
}
將調試器附加到進程時,可以右鍵單擊源代碼,然後選擇「斷點→添加TracePoint」,並選擇所需的文本(甚至提供一些宏)。
事實上,Tracepoint實際上是一個斷點,在某些消息打印機功能上具有「何時點擊」字段,並且實際上並沒有打破該過程。我發現它非常有用:它還有一個宏$ FUNCTION,它完全符合你的需求:打印它所在的函數(假設它具有可用的調試信息...)和一個$ THREADID。
以上所有的選項很好,可以幫助你。但是我看不到如何使用鼠標設置TracePoing可以幫助您防止代碼擁有數千個函數。
這種事情應該是你常規編程工作的一部分。當你編寫一個函數時,你應該考慮跟蹤消息將幫助你調試它。
您需要編寫/使用現有的記錄器,可以分成幾部分(讀取器線程,工作線程等)和不同的日誌記錄級別(錯誤,警告,跟蹤,詳細等)。好的記錄器的設計方式應該不會損害你的表現,這通常會損害冗長,但通常可以複製複雜的同步問題,除非記錄速度很快,例如將字符串指針指派給可以在問題後拋棄的數組被轉載。我通常開始調試時將全部跟蹤轉移到屏幕上,如果我幸運地和錯誤地再現這種方式,修復這個bug是微不足道的,因爲我已經有了足夠的信息,當問題消失時開始樂趣,並且爲了重現問題。
實際上,我發現調試比編寫代碼更有創意和令人滿意,但這只是我:)。
壞主意:使用輸出函數經常序列化你的線程,因爲cout使用鎖。這可以摧毀你試圖找到的問題。 – 2008-10-26 20:12:40
然後用fprintf(stderr,...)替換cout。 – Dima 2008-10-26 23:09:57