我遇到了我有一個程序(不是由我寫的,由別人寫的)的問題我想全天候運行,但有時它會崩潰。通常情況下,這不是一個問題,因爲我可以簡單地創建一個進程監視器來檢查它是否崩潰,然後在必要時重新啓動它。從另一個正在運行的Java應用程序中捕獲異常
但是,這個特定的程序有時會拋出異常並將其輸出到集成到其中的圖形界面中。在這種情況下,程序根本不會崩潰。界面保持不變,但實際的服務器功能不可用。
有沒有什麼辦法可以從這個過程中截獲這些信息?
我遇到了我有一個程序(不是由我寫的,由別人寫的)的問題我想全天候運行,但有時它會崩潰。通常情況下,這不是一個問題,因爲我可以簡單地創建一個進程監視器來檢查它是否崩潰,然後在必要時重新啓動它。從另一個正在運行的Java應用程序中捕獲異常
但是,這個特定的程序有時會拋出異常並將其輸出到集成到其中的圖形界面中。在這種情況下,程序根本不會崩潰。界面保持不變,但實際的服務器功能不可用。
有沒有什麼辦法可以從這個過程中截獲這些信息?
您想使用Java Virtual Machine Tools Interface。我不能給你的代碼來捕捉你的異常,但這是看看。你必須做一些偵探工作才能找到引發異常的類,或者至少找到一些指示它已被拋出。
編輯:您也可以嘗試致電供應商,看他們是否知道一種方式。您也可以查看它是否將異常寫入日誌文件,然後您可以觀看。
我會看看這個。我知道它拋出的具體異常,因爲它將它全面詳細地拋出到GUI中。我只關心這個例外,因爲服務器沒有以任何方式處理它。 –
是其他程序的Java?看看AspectJ,如果你能夠控制程序啓動,你可以使用它來破解它。
我擁有的唯一控件是我可以運行的可執行文件。這仍然是可能的嗎? –
AspectJ僅適用於Java。如果這是Windows可執行文件,則可能需要查看窗口標題並殺死然後重新啓動該進程。 –
我會的,但它不會那樣工作。它將它輸出到界面中的文本框中,而不是標題。 –
我假設你沒有訪問源代碼,所以如果它輸出到GUI的答案是否定的。即使你可以附加到正在運行的進程,你也需要攔截異常,但它會被捕獲併發送到GUI,而不是從應用程序拋出。
從理論上講,你可以屏幕刮的應用。我不知道這樣做的具體工具,但他們可能在那裏。
編輯:我上面可能是錯的,檢查一個帖子here他們從一個正在運行的線程獲取堆棧。您可能無法以這種方式捕獲異常,但如果幸運的話,與程序運行正常時相比,堆棧跟蹤看起來會非常不同。
編輯2:我提交了第二個更準確的答案。見下文。
我的猜測是這是最好的路線。如果它打印到System.err/out,您將看到很多輸出,並且可以終止進程(刪除創建的GUI元素)。 –
沒有能力重建應用程序,你通常運氣不好,除非你做一些廣泛的黑客攻擊。這是我能想到的一個選擇。
很可能應用程序會用自己的流實現替換System.out和/或System.err。如果是這種情況,你可以嘗試找到這個流的類,並用你自己的名稱相同的包裝替換它。您可以使用jarjar重命名原始類。在wapper中,您可以提供控制檯輸出來檢測異常。
如果它是一個Java程序,並且你有一個可執行文件,它可能被包裝。查看Launch4J,因爲這是他們使用的很好的機會。提取罐子可能不是不可能的(許可除外)。 –
這可能會也可能不會,但是如果應用程序顯示錯誤並且服務器停止工作,內存使用情況會下降嗎?如果是這樣,你可能只需在你的進程監視器中添加一些邏輯來調用windows命令tasklist
來查看內存使用量是否下降到某個閾值以下。你必須檢查程序通常使用多少內存,並在錯誤發生後使用多少內存。
既然你說服務器功能停止工作,另一種選擇可能是編寫一個簡單的程序,基本上只是ping服務器,往往你想確保它仍然是最好的。如果沒有,則終止進程並重新啓動它。
您正在使用什麼操作系統? – Windle
你有權訪問這個應用程序的源代碼?如果是這樣 - 你可以修改它嗎? – aav
@Windle:這是在Windows 7上運行的,但我也可以在Linux中輕鬆運行。儘管如此,我更喜歡Windows的解決方案。 –