応答しないアプリケーションをデバッグする

WBOY
リリース: 2024-08-12 20:35:38
オリジナル
177 人が閲覧しました

他の言語で読む: English Português 中文

行ブレークポイントの設定、値のログ記録、式の評価方法を説明するデバッガー チュートリアルが多数あります。この知識だけでもアプリケーションをデバッグするための多くのツールが得られますが、実際のシナリオはもう少し複雑で、より高度なアプローチが必要になる場合があります。

この記事では、プロジェクトに関する事前知識があまりなくても、UI クラッシュの原因となるコードを特定し、その場で壊れたコードを修正する方法を学びます。

問題

例に従いたい場合は、まずこのリポジトリのクローンを作成します: https://github.com/flounder4130/debugger-example

何らかのアクションを実行するとクラッシュする複雑なアプリケーションがあるとします。エラーを再現する方法はわかっていますが、問題は、コードのどの部分がこの機能を担当しているのかがわからないことです。

Depurar Aplicaciones No Responsivas

このサンプルアプリでは、

ボタン Nをクリックするとクラッシュが発生します。ただし、このアクションを実行するコードを見つけるのはそれほど簡単ではありません:

Depurar Aplicaciones No Responsivas

デバッガーを使用してそれを見つける方法を見てみましょう。

メソッドのブレークポイント

メソッド ブレークポイントの行ブレークポイントに対する利点は、クラス階層全体で使用できることです。これは私たちの場合にどのように役立ちますか?

サンプル プロジェクトを見ると、すべてのアクション クラスが単一のメソッド Perform() を使用して Action インターフェイスから派生していることがわかります。

Depurar Aplicaciones No Responsivasこのインターフェイス メソッドにメソッド ブレークポイントを設定すると、派生メソッドのいずれかが呼び出されるたびにアプリケーションが一時停止されます。メソッド ブレークポイントを設定するには、メソッドを宣言する行をクリックします。

デバッグ セッションを開始し、

ボタン N

をクリックします。アプリケーションは ActionImpl14 で一時停止されます。これで、このボタンに対応するコードがどこにあるかが分かりました。

Depurar Aplicaciones No Responsivasこの記事ではバグの発見に重点を置いていますが、このテクニックは、大規模なコードベースで何かがどのように動作するかを理解したいときにも大幅に時間を節約できます。

アプリケーションを一時停止する

メソッド ブレークポイントを使用したアプローチはうまく機能しますが、親インターフェイスについて何かを知っているという前提に基づいています。この仮定が間違っていたり、他の理由でこのアプローチを使用できない場合はどうなりますか?

そうですね、ブレークポイントなしでも実行できます。

ボタン N

をクリックし、アプリケーションがハングしている間に IntelliJ IDEA に移動します。メインメニューから、実行| を選択します。デバッグアクション|プログラムを一時停止します.

Depurar Aplicaciones No Responsivasアプリケーションが一時停止され、[

スレッドと変数]

タブでスレッドの現在のステータスを確認できるようになります。これにより、アプリケーションがその時点で何をしているのかがわかります。ハングしているため、ブロックの原因となっているメソッドを特定し、呼び出しサイトまで追跡できます。このアプローチには、従来のスレッド ダンプに比べていくつかの利点があります。これについては、後ほど説明します。たとえば、変数に関する情報を便利な形式で提供し、プログラムのさらなる実行を制御できるようにします。

ヒント

:プログラムの一時停止に関するその他のヒントとコツについては、「ブレークポイントを使用しないデバッグ」と「Debugger.godMode()」を参照してください。スレッドダンプ

最後に、スレッド ダンプを使用できます。これは厳密にはデバッガ機能ではありません。デバッガーを使用しているかどうかに関係なく利用できます。

ボタンN

をクリックします。アプリケーションがクラッシュしている間に、IntelliJ IDEA に移動します。メインメニューから、

実行| を選択します。デバッグアクション|スレッドダンプを取得.左側で利用可能なスレッドを調べると、AWT-EventQueue

で問題の原因がわかります。

Depurar Aplicaciones No Responsivas

執行緒轉儲的缺點是它們僅提供者在建立時的狀態快照。您不能使用線程轉儲來探索變數或控製程式執行。

在我們的例子中,我們不需要訴諸線程轉儲。但是,我仍然想提一下這種技術,因為它在其他情況下也很有用,例如當您嘗試調試在沒有調試代理的情況下啟動的應用程式時。

了解問題所在

不管調試技術如何,我們都會到達 ActionImpl14。在此類中,有人打算在單獨的執行緒中完成工作,但將 Thread.start() 與 Thread.run() 混淆了,後者在與呼叫程式碼相同的執行緒中執行程式碼。

IntelliJ IDEA 的靜態分析器甚至在設計時警告我們:

Depurar Aplicaciones No Responsivas

在 UI 執行緒上呼叫執行繁重任務(或在本例中休眠很多時間)的方法,並阻止方法直到該方法完成。這就是為什麼我們在點擊按鈕N後一段時間內無法在UI中執行任何操作。

熱插拔

現在我們已經找到了錯誤的原因,讓我們來糾正問題。

我們可以停止程序,重新編譯程式碼,然後再次執行。然而,僅僅因為做了一個小更改就重新部署整個應用程式並不總是明智的。

讓我們用聰明的方式來做吧。首先,使用建議的快速修復修復代碼:

Depurar Aplicaciones No Responsivas

程式碼準備好後,點選運行|調試操作|重新載入更改的類別。出現一個氣球,確認新代碼已到達虛擬機器。

Depurar Aplicaciones No Responsivas

讓我們返回應用程式並檢查一下。點擊按鈕 N不再使應用程式崩潰。

提示:請記住,HotSwap 有其局限性。如果您對擴展的 HotSwap 功能感興趣,那麼看看 DCEVM 或 JRebel 等高級工具可能是個好主意

概括

使用我們的推理和一些調試器功能,我們能夠找到導致專案中 UI 崩潰的程式碼。然後,我們繼續修復程式碼,而不會浪費時間重新編譯和重新分發,這在實際專案中可能會很長。

我希望您發現所描述的技術很有用。讓我知道你的想法!

如果您對更多與調試和分析相關的文章感興趣,請查看我的其他一些文章:

  • Debugger.godMode() – 使用偵錯器破解 JVM 應用程式
  • 解決調試器速度慢的問題
  • createDirectories() 有什麼問題嗎? - CPU 分析指南
  • 無斷點調試

更多精彩敬請期待!

以上が応答しないアプリケーションをデバッグするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!