答えて

12

API関数の呼び出し時に停止するには、Windows.pas(または関心関数が宣言されているところ)のどこかで、それを見つけてブレークポイントを設定します。これは、ロード時の動的リンクで使用する関数を処理します。実行時の動的リンク(LoadLibraryおよびGetProcAddress)には、別の手法が必要です。 GetProcAddressという結果を得た変数は、ブレークしたいアドレスを保持しますが、そのアドレスにブレークポイントを設定する方法はわかりません。

メッセージを多くの場所で取得できるので、ウィンドウメッセージでの停止は手間がかかります。代わりに、条件付きブレークポイントを使用する必要があります。

ほとんどのポストされたメッセージをキャッチするには、PeekMessageを呼び出した後に最初の行にあるTApplication.HandleMessageにブレークポイントを設定します。条件をMsg.Message = xに設定します。 HandleMessageは、メインスレッドのメッセージキューに送信されたメッセージのうち、Application.RunメッセージループとVCLのモーダルメッセージループのメッセージを処理します。ただし、他のモーダルダイアログ(Windows.MessageBoxなど)では使用しません。

観察を送信したメッセージは、OSがターゲットウィンドウプロシージャに直接ディスパッチするため、より困難です。関心のあるすべてのウィンドウクラスのウィンドウプロシージャにブレークポイントを設定する必要があります。ほとんどのVCLウィンドウクラスは、条件付きブレークポイントをClasses.StdWndProcに置くことで得ることができます。

条件付きブレークポイントは非常に遅い可能性があることに注意してください。デバッガは、を無条件でブレークポイントに設定し、OSがトリガすると、デバッガが引き継ぎ、条件をチェックして、条件が満たされなくなった場合に実行を再開します。これには、デバッガとアプリケーションの間の切り替えが多くなります。プログラムはのメッセージを受信します。のメッセージがあるので、デバッガがプログラムを中断してのどれかを確認しないようにするには、のすべてを実行します。

デバッグしようとしていることが実現できない場合は、本当に解決しようとしている問題を説明する新しい質問を投稿することをおすすめします。

+4

ブレークポイントを特定のアドレスに追加することができます。ブレークポイント(GetProcAddressの呼び出し時など)でアプリケーションを実行した後にブレークポイントウィンドウに移動し、プロシージャのアドレスを取得しますどういうわけか、ブレークポイントのウインドウを開き、右クリックし、「追加」>「アドレスブレークポイント」と選択します。あなたはそのアドレスに入れます。デバッガは、そのアドレスにヒットしたときにブレークする必要があります。注意:アドレスは、実行可能ファイルの1回の呼び出しに対してのみ有効です。 – Nat

+0

+1。この質問は、新しいDelphiユーザーである新しい同僚によって動機づけられました。彼は、Visual Basicでは、「次のユーザーの動きを追跡する」(デバッグ、ユーザーのクリックでデバッガの停止、入力など)を行うことができるという事実を見逃していました。コールスタックを使用して、私はそれの必要性を感じることはありません。しかし、私はWindowsAPIとメッセージでBPを使用していくつかの奇妙なバグを解決できることに気付きました。別の先進的なデバッガでは、コンソールウィンドウで 'BPX WM_GETTEXTA'を実行することができたことを思い出したので、私はDelphiの方が簡単なのか疑問に思いました。 – EMBarbosa

+0

@Nat hmmm ...新しいDelphiデバッガのAPIを使ってそのタスクを自動化できるかもしれません...しかし、私はあまりそれに精通していません...これは良い質問でしょうか? – EMBarbosa

1

オプションに移動する必要があります。リンカを開き、 "Debug DCUs"をチェックします。デフォルトではこれはチェックされていないので、作業中にデバッガがVCL全体をステップ実行しません。

+0

これは有効で重要なコメントです。私はVCLをデバッグする方法を求めていません。あなたは低い評判でコメントすることはできません...それはクールではありません。知っている... :( – EMBarbosa

関連する問題