したがって、特定のAPIまたはWindowsメッセージにブレークポイントを設定したいとします。 Delphiのバージョンでコードを記述することなく簡単に行う方法はありません。 メモリアクセスにブレークポイントを置くことができるのと同様の方法がありますか?デバッグ中に特定のWindowsメッセージまたはAPIですばやく停止する方法はありますか?
答えて
API関数の呼び出し時に停止するには、Windows.pas(または関心関数が宣言されているところ)のどこかで、それを見つけてブレークポイントを設定します。これは、ロード時の動的リンクで使用する関数を処理します。実行時の動的リンク(LoadLibrary
およびGetProcAddress
)には、別の手法が必要です。 GetProcAddress
という結果を得た変数は、ブレークしたいアドレスを保持しますが、そのアドレスにブレークポイントを設定する方法はわかりません。
メッセージを多くの場所で取得できるので、ウィンドウメッセージでの停止は手間がかかります。代わりに、条件付きブレークポイントを使用する必要があります。
ほとんどのポストされたメッセージをキャッチするには、PeekMessage
を呼び出した後に最初の行にあるTApplication.HandleMessage
にブレークポイントを設定します。条件をMsg.Message = x
に設定します。 HandleMessage
は、メインスレッドのメッセージキューに送信されたメッセージのうち、Application.Run
メッセージループとVCLのモーダルメッセージループのメッセージを処理します。ただし、他のモーダルダイアログ(Windows.MessageBox
など)では使用しません。
観察を送信したメッセージは、OSがターゲットウィンドウプロシージャに直接ディスパッチするため、より困難です。関心のあるすべてのウィンドウクラスのウィンドウプロシージャにブレークポイントを設定する必要があります。ほとんどのVCLウィンドウクラスは、条件付きブレークポイントをClasses.StdWndProc
に置くことで得ることができます。
条件付きブレークポイントは非常に遅い可能性があることに注意してください。デバッガは、を無条件でブレークポイントに設定し、OSがトリガすると、デバッガが引き継ぎ、条件をチェックして、条件が満たされなくなった場合に実行を再開します。これには、デバッガとアプリケーションの間の切り替えが多くなります。プログラムはのメッセージを受信します。のメッセージがあるので、デバッガがプログラムを中断してのどれかを確認しないようにするには、のすべてを実行します。
デバッグしようとしていることが実現できない場合は、本当に解決しようとしている問題を説明する新しい質問を投稿することをおすすめします。
オプションに移動する必要があります。リンカを開き、 "Debug DCUs"をチェックします。デフォルトではこれはチェックされていないので、作業中にデバッガがVCL全体をステップ実行しません。
これは有効で重要なコメントです。私はVCLをデバッグする方法を求めていません。あなたは低い評判でコメントすることはできません...それはクールではありません。知っている... :( – EMBarbosa
- 1. 特定のポートでhttp-serverを停止する方法はありますか?
- 2. Visual Studioでは、バックグラウンドスレッドを一時停止せずにWeb APIリクエストをデバッグする方法はありますか?
- 3. 特定のRowtestをデバッグする方法はありますか
- 4. 特定の条件でa4j:supportで指定されたイベントを停止する方法はありますか?
- 5. concurrent.futuresで実行中のプロセスを停止する方法はありますか?
- 6. XPathで特定のクラスに到達したときにクエリを停止する方法はありますか?
- 7. 特定の位置に達したときにタッチイベントを停止する方法はありますか?
- 8. スポットアピで一時停止する方法はありますか?
- 9. プログラムでスクロールを停止する方法はありますか?
- 10. 希望の期間中アプリを停止する方法はありますか?
- 11. RabbitMQ STOMPが以前にACKするまでメッセージの消費を停止する方法はありますか?
- 12. bashスクリプトで特定の値を停止し強制的に入力する方法はありますか?
- 13. SKActionsを一時停止する方法はありますか?
- 14. Magentoインデクサープロセスを停止する方法はありますか?
- 15. couchdbインデクサープロセスを停止する方法はありますか?
- 16. パフォーマンスに問題がなくSKSceneを一時停止および停止する方法はありますか?
- 17. キャプチャフィルタでDirectShow put_Enableコール中に不特定のエラー($ 80004005)をデバッグする方法はありますか?
- 18. 特定の時刻に2日後にアラームサービスを停止する方法はありますか?
- 19. Windowsで休止状態または中断モードを起動するWin32 APIはありますか?
- 20. 特定の条件で実行可能タイマーを停止する方法はありますか?
- 21. 特定のデータ構造をデバッグする方法はありますか?
- 22. 特定のzPosition以下のすべてのスプライトを一時停止する方法はありますか?
- 23. xamarinアンドロイドアプリケーションをすばやくデバッグするオプションはありますか?
- 24. githubのフォークにすばやく移動する方法はありますか?
- 25. クラッシュ/強制停止後にDATA_CHANGEDデータAPIイベントを正しく登録する方法はありますか?
- 26. ユーザーがドラッグを停止したときにボトムシートスクロールを停止する方法はありますか?
- 27. スクリプト内で一時停止または待つ方法がありますか?
- 28. データセットの特定の実行タイムスライスを一時停止する方法はありますか?
- 29. HDFSにデータをすばやくアップロードする方法はありますか?
- 30. デバッグ中にタイマーを停止する方法
ブレークポイントを特定のアドレスに追加することができます。ブレークポイント(GetProcAddressの呼び出し時など)でアプリケーションを実行した後にブレークポイントウィンドウに移動し、プロシージャのアドレスを取得しますどういうわけか、ブレークポイントのウインドウを開き、右クリックし、「追加」>「アドレスブレークポイント」と選択します。あなたはそのアドレスに入れます。デバッガは、そのアドレスにヒットしたときにブレークする必要があります。注意:アドレスは、実行可能ファイルの1回の呼び出しに対してのみ有効です。 – Nat
+1。この質問は、新しいDelphiユーザーである新しい同僚によって動機づけられました。彼は、Visual Basicでは、「次のユーザーの動きを追跡する」(デバッグ、ユーザーのクリックでデバッガの停止、入力など)を行うことができるという事実を見逃していました。コールスタックを使用して、私はそれの必要性を感じることはありません。しかし、私はWindowsAPIとメッセージでBPを使用していくつかの奇妙なバグを解決できることに気付きました。別の先進的なデバッガでは、コンソールウィンドウで 'BPX WM_GETTEXTA'を実行することができたことを思い出したので、私はDelphiの方が簡単なのか疑問に思いました。 – EMBarbosa
@Nat hmmm ...新しいDelphiデバッガのAPIを使ってそのタスクを自動化できるかもしれません...しかし、私はあまりそれに精通していません...これは良い質問でしょうか? – EMBarbosa