2008-10-26 20 views

回答

3

使用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"); 
    ... 
} 
+0

壞主意:使用輸出函數經常序列化你的線程,因爲cout使用鎖。這可以摧毀你試圖找到的問題。 – 2008-10-26 20:12:40

+0

然後用fprintf(stderr,...)替換cout。 – Dima 2008-10-26 23:09:57

2

將調試器附加到進程時,可以右鍵單擊源代碼,然後選擇「斷點→添加TracePoint」,並選擇所需的文本(甚至提供一些宏)。

事實上,Tracepoint實際上是一個斷點,在某些消息打印機功能上具有「何時點擊」字段,並且實際上並沒有打破該過程。我發現它非常有用:它還有一個宏$ FUNCTION,它完全符合你的需求:打印它所在的函數(假設它具有可用的調試信息...)和一個$ THREADID。

2

以上所有的選項很好,可以幫助你。但是我看不到如何使用鼠標設置TracePoing可以幫助您防止代碼擁有數千個函數。
這種事情應該是你常規編程工作的一部分。當你編寫一個函數時,你應該考慮跟蹤消息將幫助你調試它。
您需要編寫/使用現有的記錄器,可以分成幾部分(讀取器線程,工作線程等)和不同的日誌記錄級別(錯誤,警告,跟蹤,詳細等)。好的記錄器的設計方式應該不會損害你的表現,這通常會損害冗長,但通常可以複製複雜的同步問題,除非記錄速度很快,例如將字符串指針指派給可以在問題後拋棄的數組被轉載。我通常開始調試時將全部跟蹤轉移到屏幕上,如果我幸運地和錯誤地再現這種方式,修復這個bug是微不足道的,因爲我已經有了足夠的信息,當問題消失時開始樂趣,並且爲了重現問題。
實際上,我發現調試比編寫代碼更有創意和令人滿意,但這只是我:)。

相關問題