2012-03-06 94 views
0

我想編寫一個Dtrace,以便我可以分析overflow_error是否正在執行過程中 正在執行。我只知道這是一個錯誤,因爲std::overflow_error。我不知道如何編寫D-Trace。我需要一些初學者指南,如果有人能讓我知道如何寫它。我正在運行的進程名稱是superbug_returns。我如何編寫一個D-Trace來分析上述情況是否發生?我正在開發solarisDtrace用於內存溢出?

回答

1

在調試器(dbx)中運行程序可能會更容易,並且可以在引發異常時停止。

1

我第二個建議嘗試使用這個調試器 - 通常有一個命令來打破C++ - 異常。這樣更簡單。

如果你堅持要DTrace:
幾年前,Sun公佈了a whitepaper how to use DTrace with C++--讀了這個。

遺憾的是,將那裏描述的技術應用於「trace exceptions」用例並不重要,因爲異常拋出/處理在C++運行時中,並且通過內部(非曝光)函數調用完成。在GCC編譯的代碼,throw ...變得__cxa_throw(...)而在SunStudio編譯的代碼(其使用不同的名稱重整方案)的函數的(未重整/錯位):

void __Crun::ex_throw(void*,const __Crun::static_type_info*,void(*)(void*)) 

__1cG__CrunIex_throw6Fpvpkn0AQstatic_type_info_pF1_v_v_ 

被調用。請注意,這取決於您的編譯器版本; SunStudio在過去的某個時間點更改了它們的mangling scheme/C++運行時。在這兩種情況下,std::...都會作爲參數傳遞,因此您希望DTrace用於特定的異常類,但只需要進行二級過濾(D探測謂詞,用於測試拋出的異常是否真的是您有興趣)。你需要找出上述函數的參數對應於std::overflow被拋出並篩選。
沒有你的實際目標文件,我不能給出比這更多的建議。一開始,嘗試:

GCC:

dtrace -n ' 
    pid<your-process-pid>::__cxa_throw:entry 
    { 
     @exloc[ustack()] = count(); 
    }' 

SunStudio:

dtrace -n ' 
    pid<your-process-pid>::__1cG__CrunIex_throw6Fpvpkn0AQstatic_type_info_pF1_v_v_:entry 
    { 
     @exloc[ustack()] = count(); 
    }' 

發現其中的異常被拋出(按Ctrl + C終止DTrace的在你的代碼的地方給你統計)。然後從那裏迭代(嘗試轉儲參數,看看是否可以識別std::overflow,通過向探針添加/arg0 == .../或類似的過濾器)。