我想編寫一個Dtrace,以便我可以分析overflow_error
是否正在執行過程中 正在執行。我只知道這是一個錯誤,因爲std::overflow_error
。我不知道如何編寫D-Trace。我需要一些初學者指南,如果有人能讓我知道如何寫它。我正在運行的進程名稱是superbug_returns
。我如何編寫一個D-Trace來分析上述情況是否發生?我正在開發solarisDtrace用於內存溢出?
0
A
回答
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 == .../
或類似的過濾器)。
相關問題
- 1. 內存溢出使用ImageIO.write
- 2. Memset內存溢出
- 3. 堆內存溢出
- 4. CCSprite內存溢出
- 5. Hypertable啓動時溢出內存溢出
- 6. 內存溢出!在Linux中
- 7. C socket溢出內存
- 8. VS2008內存溢出異常
- 9. 內存溢出問題-opeCV
- 10. 內存(Ram)溢出Swift
- 11. C內存溢出(V2)
- 12. MVC3內存溢出異常
- 13. PDO導致內存溢出
- 14. 防止內存溢出
- 15. Magento Model-調用加載內存溢出
- 16. Python中使用pymc的內存溢出
- 17. 程序內存使用溢出atmel
- 18. 關於堆溢出或堆棧溢出的Linux內核行爲
- 19. 內存溢出雖然堆大小小於6MB
- 20. 內存溢出異常,而在Android的
- 21. 堆棧溢出/內存不足
- 22. 如何處理豬溢出內存
- 23. SonarQube 6.4.0.25310 TFS的內存溢出異常
- 24. MSTest的內存溢出的異常
- 25. 加載大紋理時內存溢出
- 26. 內存溢出異常的RMI
- 27. 如何檢測內存溢出?
- 28. Android的內存溢出異常和ContentResolver.registerContentObserver
- 29. C#圖像溢出內存異常
- 30. Emacs-nxml-mode導致內存溢出