ホームページ Java &#&チュートリアル 非アクティブなアプリケーションのデバッグ

非アクティブなアプリケーションのデバッグ

Aug 19, 2024 pm 12:32 PM

他の言語で読む: English Español 中文

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

この記事では、設計に関する事前知識がなくても、UI フリーズの原因となるコードを見つけて、欠陥のあるコードをリアルタイムで修正する方法を学びます。

問題

フォローしたい場合は、まずこのリポジトリのクローンを作成してください: https://github.com/flounder4130/debugger-example

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

Depurando Aplicativos Inativos

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

Depurando Aplicativos Inativos

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

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

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

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

Depurando Aplicativos Inativos

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

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

Depurando Aplicativos Inativos

この記事ではバグの発見に重点を置いていますが、この手法は、大規模なコードベースで何かがどのように動作するかを理解したい場合にも、多くの時間を節約できます。

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

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

そうですね、ブレークポイントがなくてもこれを行うことができます。 ボタン N をクリックし、アプリケーションがロックされている間に IntelliJ IDEA に移動します。メイン メニューから、実行 | を選択します。 アクションのデバッグ | プログラムを一時停止します.

Depurando Aplicativos Inativos

アプリケーションが一時停止され、スレッドと変数 タブでスレッドの現在の状態を調べることができます。これにより、アプリケーションが現在何を行っているかがわかります。ロックされているため、ロック方法を特定し、呼び出しの場所まで追跡できます。

このアプローチには、従来のスレッド ダンプに比べていくつかの利点があります。これについては後ほど説明します。たとえば、変数に関する情報を便利な方法で提供し、さらにプログラムの実行を制御できるようにします。

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

スレッドダンプ

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

ボタン N をクリックします。アプリケーションがロックされている間に、IntelliJ IDEA に移動します。メイン メニューから、実行 | を選択します。 アクションのデバッグ | スレッド ダンプを取得.

左側で使用可能なスレッドを確認すると、AWT-EventQueue の下に問題の原因が表示されます。

Depurando Aplicativos Inativos

スレッド ダンプの欠点は、スレッド ダンプが取得された時点でのプログラムの状態のスナップショットしか提供されないことです。スレッド ダンプを使用して変数を調べたり、プログラムの実行を制御したりすることはできません。

この例では、スレッド ダンプに頼る必要はありません。ただし、このテクニックは、デバッグ エージェントなしで起動されたアプリケーションをデバッグしようとする場合など、他の場合にも役立つ可能性があるため、それでも言及しておきたいと思いました。

問題を理解する

デバッグ手法に関係なく、ActionImpl14 に到達します。このクラスでは、誰かが別のスレッドで作業を行うつもりでしたが、Thread.start() と、呼び出し元のコードと同じスレッドでコードを実行する Thread.run() を混同しました。

IntelliJ IDEA の静的アナライザーは、設計時にこれについて警告します。

Depurando Aplicativos Inativos

負荷の高い作業 (この場合は大量のスリープ) を実行するメソッドが UI スレッドで呼び出され、メソッドが終了するまでブロックされます。そのため、ボタン N をクリックした後、しばらく UI で何もできなくなります。

ホットスワップ

バグの原因が判明したので、問題を修正しましょう。

プログラムを停止し、コードを再コンパイルして、再度実行することもできます。ただし、ちょっとした変更のためだけにアプリケーション全体を再折りたたみするのが必ずしも便利であるとは限りません。

賢い方法でこれをやりましょう。まず、提案されているクイックフィックスを使用してコードを修正します。

Depurando Aplicativos Inativos

コードの準備ができたら、[実行] をクリックします。 アクションのデバッグ | 変更されたクラスを再ロードします。新しいコードが VM に到達したことを確認するメッセージが表示されます。

Depurando Aplicativos Inativos

アプリに戻って確認してみましょう。 ボタン N をクリックしてもアプリがクラッシュしなくなりました。

ヒント: HotSwap には制限があることに注意してください。 HotSwap の拡張機能に興味がある場合は、DCEVM や JRebel などの高度なツールを検討してみるとよいでしょう。

まとめ

推論といくつかのデバッガー機能を使用して、プロジェクト内で UI のフリーズを引き起こしているコードを特定することができました。その後、実際のプロジェクトでは時間のかかる再コンパイルや再デプロイに時間を無駄にすることなく、コードの修正に進みます。

ここで説明したテクニックがお役に立てば幸いです。ご意見をお聞かせください。

デバッグとプロファイリングに関連する他の記事に興味がある場合は、私の他の記事をいくつかチェックしてください:

  • Debugger.godMode() – デバッガーを使用して JVM アプリケーションをハックします
  • デバッガーの遅さのトラブルシューティング
  • ブレークポイントを使用しないデバッグ
  • createDirectories() の何が問題ですか? - CPU プロファイル ガイド

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

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? 会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? Apr 19, 2025 pm 04:51 PM

一部のアプリケーションが適切に機能しないようにする会社のセキュリティソフトウェアのトラブルシューティングとソリューション。多くの企業は、内部ネットワークセキュリティを確保するためにセキュリティソフトウェアを展開します。 ...

名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? 名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? Apr 19, 2025 pm 11:30 PM

多くのアプリケーションシナリオでソートを実装するために名前を数値に変換するソリューションでは、ユーザーはグループ、特に1つでソートする必要がある場合があります...

MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? Apr 19, 2025 pm 06:21 PM

システムドッキングでのフィールドマッピング処理は、システムドッキングを実行する際に難しい問題に遭遇することがよくあります。システムのインターフェイスフィールドを効果的にマッピングする方法A ...

Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Apr 19, 2025 pm 11:45 PM

intellijideaultimatiateバージョンを使用してスプリングを開始します...

エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? Apr 19, 2025 pm 11:42 PM

データベース操作にMyBatis-Plusまたはその他のORMフレームワークを使用する場合、エンティティクラスの属性名に基づいてクエリ条件を構築する必要があることがよくあります。あなたが毎回手動で...

Javaオブジェクトを配列に安全に変換する方法は? Javaオブジェクトを配列に安全に変換する方法は? Apr 19, 2025 pm 11:33 PM

Javaオブジェクトと配列の変換:リスクの詳細な議論と鋳造タイプ変換の正しい方法多くのJava初心者は、オブジェクトのアレイへの変換に遭遇します...

eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? Apr 19, 2025 pm 11:27 PM

eコマースプラットフォーム上のSKUおよびSPUテーブルの設計の詳細な説明この記事では、eコマースプラットフォームでのSKUとSPUのデータベース設計の問題、特にユーザー定義の販売を扱う方法について説明します。

Redisキャッシュソリューションを使用して、製品ランキングリストの要件を効率的に実現する方法は? Redisキャッシュソリューションを使用して、製品ランキングリストの要件を効率的に実現する方法は? Apr 19, 2025 pm 11:36 PM

Redisキャッシュソリューションは、製品ランキングリストの要件をどのように実現しますか?開発プロセス中に、多くの場合、ランキングの要件に対処する必要があります。

See all articles