他の言語で読む: English Português 中文
行ブレークポイントの設定、値のログ記録、式の評価方法を説明するデバッガー チュートリアルが多数あります。この知識だけでもアプリケーションをデバッグするための多くのツールが得られますが、実際のシナリオはもう少し複雑で、より高度なアプローチが必要になる場合があります。
この記事では、プロジェクトに関する事前知識があまりなくても、UI クラッシュの原因となるコードを特定し、その場で壊れたコードを修正する方法を学びます。
問題 例に従いたい場合は、まずこのリポジトリのクローンを作成します: https://github.com/flounder4130/debugger-example 何らかのアクションを実行するとクラッシュする複雑なアプリケーションがあるとします。エラーを再現する方法はわかっていますが、問題は、コードのどの部分がこの機能を担当しているのかがわからないことです。 このサンプルアプリでは、ボタン Nをクリックするとクラッシュが発生します。ただし、このアクションを実行するコードを見つけるのはそれほど簡単ではありません:
デバッガーを使用してそれを見つける方法を見てみましょう。 メソッドのブレークポイントサンプル プロジェクトを見ると、すべてのアクション クラスが単一のメソッド Perform() を使用して Action インターフェイスから派生していることがわかります。
このインターフェイス メソッドにメソッド ブレークポイントを設定すると、派生メソッドのいずれかが呼び出されるたびにアプリケーションが一時停止されます。メソッド ブレークポイントを設定するには、メソッドを宣言する行をクリックします。
デバッグ セッションを開始し、
ボタン Nをクリックします。アプリケーションは ActionImpl14 で一時停止されます。これで、このボタンに対応するコードがどこにあるかが分かりました。
この記事ではバグの発見に重点を置いていますが、このテクニックは、大規模なコードベースで何かがどのように動作するかを理解したいときにも大幅に時間を節約できます。
アプリケーションを一時停止する
そうですね、ブレークポイントなしでも実行できます。
ボタン Nをクリックし、アプリケーションがハングしている間に IntelliJ IDEA に移動します。メインメニューから、実行| を選択します。デバッグアクション|プログラムを一時停止します.
アプリケーションが一時停止され、[
スレッドと変数]タブでスレッドの現在のステータスを確認できるようになります。これにより、アプリケーションがその時点で何をしているのかがわかります。ハングしているため、ブロックの原因となっているメソッドを特定し、呼び出しサイトまで追跡できます。このアプローチには、従来のスレッド ダンプに比べていくつかの利点があります。これについては、後ほど説明します。たとえば、変数に関する情報を便利な形式で提供し、プログラムのさらなる実行を制御できるようにします。
ヒント:プログラムの一時停止に関するその他のヒントとコツについては、「ブレークポイントを使用しないデバッグ」と「Debugger.godMode()」を参照してください。スレッドダンプ
ボタンN
をクリックします。アプリケーションがクラッシュしている間に、IntelliJ IDEA に移動します。メインメニューから、実行| を選択します。デバッグアクション|スレッドダンプを取得.左側で利用可能なスレッドを調べると、AWT-EventQueue
で問題の原因がわかります。執行緒轉儲的缺點是它們僅提供者在建立時的狀態快照。您不能使用線程轉儲來探索變數或控製程式執行。
在我們的例子中,我們不需要訴諸線程轉儲。但是,我仍然想提一下這種技術,因為它在其他情況下也很有用,例如當您嘗試調試在沒有調試代理的情況下啟動的應用程式時。
不管調試技術如何,我們都會到達 ActionImpl14。在此類中,有人打算在單獨的執行緒中完成工作,但將 Thread.start() 與 Thread.run() 混淆了,後者在與呼叫程式碼相同的執行緒中執行程式碼。
IntelliJ IDEA 的靜態分析器甚至在設計時警告我們:
在 UI 執行緒上呼叫執行繁重任務(或在本例中休眠很多時間)的方法,並阻止方法直到該方法完成。這就是為什麼我們在點擊按鈕N後一段時間內無法在UI中執行任何操作。
現在我們已經找到了錯誤的原因,讓我們來糾正問題。
我們可以停止程序,重新編譯程式碼,然後再次執行。然而,僅僅因為做了一個小更改就重新部署整個應用程式並不總是明智的。
讓我們用聰明的方式來做吧。首先,使用建議的快速修復修復代碼:
程式碼準備好後,點選運行|調試操作|重新載入更改的類別。出現一個氣球,確認新代碼已到達虛擬機器。
讓我們返回應用程式並檢查一下。點擊按鈕 N不再使應用程式崩潰。
提示:請記住,HotSwap 有其局限性。如果您對擴展的 HotSwap 功能感興趣,那麼看看 DCEVM 或 JRebel 等高級工具可能是個好主意
使用我們的推理和一些調試器功能,我們能夠找到導致專案中 UI 崩潰的程式碼。然後,我們繼續修復程式碼,而不會浪費時間重新編譯和重新分發,這在實際專案中可能會很長。
我希望您發現所描述的技術很有用。讓我知道你的想法!
如果您對更多與調試和分析相關的文章感興趣,請查看我的其他一些文章:
更多精彩敬請期待!
以上が応答しないアプリケーションをデバッグするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。