簡體   English   中英

如何報告JVM中的所有異常,無論是自己的代碼還是第三方代碼?

[英]How to report all exceptions in JVM, be it own or third-party code?

有沒有辦法記錄JVM中發生的所有異常?

系統是由不同小組提供的大量較小的組件構成的。 它們全部都在同一JVM(在Weblogic下)內運行。

錯誤報告策略在這些組中有很大的不同,因此有時我們會遇到例外情況被抑制的情況,這使得故障排除非常困難。 同時,我注意到JDB能夠攔截任何地方發生在代碼中的異常。

我想使用JDB在DEV / SIT / UAT環境中使用的相同工具來縮短問題解決時間。 在PTE和PROD中,不僅應關閉設施,而且應關閉設施

  • 不影響性能
  • 無需更改代碼即可將其關閉。

當然,我可以將JDB連接到在DEV / SIT中運行的服務器的每個實例。 我猜這是可行的...但是有兩個主要缺點:

  • 它使配置更加復雜
  • 當發生異常時,JDB停止; 需要腳本或其他東西讓它繼續

所以我想知道是否有任何方法可以做到這一點,例如Runtime.traceExceptions(...)?

據我所知,除了調試API之外,沒有官方的Java API,它也可以在即將“調試”的VM內部使用。

一個更簡單快速和骯臟的方式得到通知在運行時創建的每個例外的是破解一些跟蹤代碼,直接進入的Throwable類的構造函數(S),編譯它,並把它放到bootclasspath中的rt.jar之前。 當然,在發行版本中您不需要執行任何操作,但是分析在某些地方捕獲異常並且無法正確報告異常的代碼將非常有幫助。

針對評論:

關於Debugger API:上次我做這樣的事情時,我使用JVMDI構建了本機JNI / JVMDI dll,並從VM內部對其進行了訪問。 它可以正常工作,並允許您執行Java通常不提供的各種有線操作,但是與使用修補的Throwable類相比,我認為這甚至更多。 除此之外,自Java 1.6起,JVMDI已被棄用並被JVM TI取代。 我不知道您是否以及如何使用此新的Debugger API進行類似的操作。

用改進的Throwable是速度快,易於得到正確的,本身不強加任何性能退化,也沒有,即使你是在執行環境控制真正的hackish。 您可以將其視為某種AOP。 ;)但是我仍然只會用它來發現否則很難檢測到的錯誤,而不是在生產代碼中,或者只是作為最后的手段。 這樣的事情肯定不應該被視為設計的一部分。 最好的長期方法是讓您所有的開發小組就一些常見的異常處理達成共識。

如果您決定進行代碼檢查以查找所有捕獲異常且未報告異常的地方, FindBugs也可以提供很多幫助。

我可能會取消解壓縮JDK,修改“異常”以記錄您的異常,然后重新進行壓縮。

這是一個非常合理的解決方案,不會引起任何問題-JDK類在大多數情況下只是標准的Java類。

通過在讀取JDK的版本之前操縱類路徑以讀取“ Exception”的版本,您可能能夠在不修改JDK的情況下做到這一點-這樣,分發起來就不會那么困難。

Fedora上有一個項目-ABRT-自動錯誤報告工具。

它還報告未捕獲的JVM異常。

現在(2013年),開始努力使其也捕獲JBoss AS / EAP / WildFly異常。

請繼續關注它的發布時間: https//fedorahosted.org/abrt/milestone/Support_for_JAVA_exceptions

GDB是為GCC內置程序設計的,如果要調試Java應用程序,建議您在IDE中使用Java Debugger。 它可以用來捕獲任何拋出的異常。

注意:一些庫在正常啟動期間會引發異常,並想象Weblogic有其自己的庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM