3

これは、外部アプリケーションのデバッグにVisualStudio2010を使用した経験のあるプログラマーへの質問です。

現在、私は働いている人々によって作られたプログラムのアドオンを開発しています。このアドオンを外部プログラムで動作させるには、外部プログラムで指定された特定のフォルダーに.dllファイルを配置する必要があります。ビルド設定を構成して、.dllファイルが自動的にコピーされるようにしました。また、.pdbファイルをコピーして、デバッグオプションを有効にします。

このアドオンはクラスライブラリにすぎないため、通常のようにデバッグすることはできません。また、外部アプリケーションのソースコードもありません。このクラスライブラリを適切にデバッグするにはどうすればよいですか?

これは私が試したものです:

1.プロセスへのアタッチ実行中のプロセスへのアタッチを
参照してください。セットアップに数秒かかることを除けば、これは問題なく機能しているようです。ほとんどの例外/ブレークポイントは外部プログラムの開始の最初の数秒で発生するため、これは問題です。また、このクラスライブラリを頻繁にデバッグし、しばらくすると時間がかかるため、VisualStudioをプロセスに手動でアタッチするのも面倒になります。

2. Debugger.Launch()
現在、私はDebugger.Launch()を使用してVisualStudioを外部プログラムに接続しています。これにより、Just In Timeプロンプトが表示され、使用するVisualStudioのインスタンスを尋ねられます。これは「プロセスにアタッチ」よりもはるかに遅いと思いますが、このようにして、ブレークポイントが発生する前にデバッガーがアタッチされていることを確認します。#if DEBUGこれをとの間に配置し#end ifて、リリースビルドを作成するときにこのポップアップが表示されないようにします。これも役立ちます。

3.既存のプロジェクトとして追加
プログラムの実行可能ファイルをプロジェクトとしてソリューションに追加しました。これを行うことで、この実行可能ファイルをスタートアッププロジェクトとして設定でき、F5キーを押すと起動します。これの最大の利点は、実行可能ファイルが開始されるとすぐにデバッグできることです。「 VisualStudioソリューションの一部ではない実行可能ファイルのデバッグ」を参照してください。これにより、Visual Studioは例外でブレークしますが、残念ながら、ブレークポイントをロードしていないようです。ブレークポイントを使用しようとすると、次の情報が ブレークポイント 表示されます。モジュールウィンドウに「バイナリはデバッグ情報でビルドされていません。」と表示されます。これは解決できますか?

4.アクションの開始
SilentDocは、[プロパティ]->[デバッグ]->[アクションの開始]を使用して、外部プログラムを開始アクションとして設定することもできることに注意しました。参照:アプリケーションデバッグの開始アクションの変更この方法でブレークポイントを正しくロードするように見えます。ただし、何らかの理由で、これにより、最初に発生したブレークポイント/例外で外部プログラムが5分間フリーズします。凍結が完了すると、期待どおりに機能するように見えます。このフリーズの原因は何ですか?

編集:フリーズは外部プログラムによって引き起こされました。受け入れられた回答のコメントを参照してください。

5.イメージファイル実行オプションhmemcpyが提案したように、デバッガーを自動的
に起動する ために「イメージファイル実行オプション」を使用することもできます。これは、同じJust In Timeプロンプトを表示するため、Debugger.Launch()と同じように見えます。ただし、このジャストインタイムの「デバッガー」はまったくデバッグしません。ブレークポイントと例外は無視されます。また、リリースビルドで作業している場合、JustInTimeプロンプトを単純に無効にすることはできません。

まとめ
オプション1は、ブレークポイントをロードし、ブレークポイント/例外でブレークしますが、時間がかかりすぎます。
オプション2はブレークポイントをロードし、ブレークポイント/例外でブレークしますが、遅すぎます。
オプション3はブレークポイントをロードせず、ブレークポイント/例外でブレークしません。
オプション4はブレークポイントをロードしますが、最初のブレークポイント/例外で5分間フリーズします。
オプション5はブレークポイントをロードせず、ブレークポイント/例外でブレークしません。

追加情報
外部プログラムとクラスライブラリはどちらもVB.NETで記述されており、私はVisual Studio 2010 Ultimateを使用しており、ターゲットフレームワークは.NETFramework4.0です。

オプション1と2は私には有効ですが、しばらくすると、これらのダイアログとプロンプトがすべて煩わしくなり、速度が低下します。オプション3と4の方が私には適しているように思われるので、誰かがそれらを機能させる方法を教えてくれれば、それは素晴らしいことです。オプション5もそれほど面白くないようです。私は、regedit.exeを常に使用したくありません。他に選択肢があれば教えてください。

4

3 に答える 3

1

デバッグ時に、その実行可能ファイルを開始外部プログラムとして設定できませんか?

DLLプロジェクト-プロパティ-デバッグ-外部プログラムの開始..。

編集-申し訳ありませんが、私はあなたがすでにそれをしているのを見ていませんでした:S

于 2012-09-28T09:11:32.017 に答える
1

Image File Execution Optionsこれは、使用が役立つ可能性があるまれなケースの1つである可能性があります。プログラムの起動時にデバッガーをアタッチするための私のお気に入りのトリックの1つ。これは、特に、実行前にデバッガーをアプリケーションにアタッチできるレジストリ機能です。同じトリックで、たとえば、WindowsタスクマネージャーをProcessExplorerまたはNotepad2に置き換えることができます。Notepad.exe

あなたはそれについてのすべてをここで読むことができます。

設定方法は次のとおりです。

  • 走るregedit.exe
  • に移動 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
  • exeという名前の新しいキーを作成します(例:yourprogram.exe)
  • exeの下に新しい文字列値を作成します。文字列値の名前はDebugger、であり、値はvsjitdebugger.exe

実行可能ファイルを実行すると、デバッガーを選択するように求めるJustInTimeプロンプトが表示されます。

vsjitdebugger

デバッグする(または新しいインスタンスを開始する)VisualStudioのインスタンスを選択します。または、この時点で「プロセスにアタッチ」してから、Noボタンでダイアログを閉じて、アタッチさせることもできます。

お役に立てば幸いです。

于 2012-10-08T09:28:49.590 に答える
-1

あなたのアプローチは素晴らしいと思います-dllファイルにそのPDBファイルに関する情報が含まれていること(たとえば、を使用dumpbin /pdbpath:verbose <your dll>)、およびPDBファイルからのソースパスがデバッグマシンで有効であること(たとえば、を使用して)を確認する必要があります、srctool -r <your pdb>)。dllファイルの隣にPDBファイルを配置することも通常は機能するはずです。

少し前に、PDBファイルを操作するためのこれらのツールやその他のツールについて説明した投稿を書いたので、おそらくそれはあなたにとって役立つでしょう:http: //lowleveldesign.wordpress.com/2011/12/09/pdb-file-out-of-デバッガー/

于 2012-09-28T12:17:38.873 に答える