11

私の C# コードは P/Invoke を介してアンマネージ サードパーティ ライブラリ関数を呼び出しており、アンマネージ関数には奇妙な副作用があります。私はそれをデバッグして、それが何をしているのかを見たいと思っています。

C# コードをデバッグし、P/Invoke 呼び出しに「ステップ イン」しようとすると、代わりにステップ オーバーします。そこに驚きはありません -- 私はそれを期待していました。この DLL のソースはありません。また、逆アセンブル ビューを表示しても問題ないとは言いませんでした。

そこで、デバッガーを逆アセンブリ ビューに切り替えます ([デバッグ] > [ウィンドウ] > [逆アセンブリ])。これで、JITted コードに個々の x86 命令が表示されます。もう一度、P/Invoke 呼び出しに踏み込もうとします。繰り返しますが、代わりにステップオーバーします-x86 CALL命令にステップインするように明確に指示しましたが。x86 CALL に足を踏み入れるのはどれくらい難しいですか?

これまでの私のグーグルは、これに影響を与える可能性のあるいくつかのオプションを示しており、すでにそれらを設定しています:

  • [ツール] > [オプション] > [デバッグ] > [全般] で、[マイ コードのみを有効にする] がオフになっています。
  • [プロジェクト] > [プロパティ] > [デバッグ] タブで、[アンマネージ コードのデバッグを有効にする] がオンになっています。

ダメ。Visual Studio はまだ介入を拒否しています。

サードパーティの DLL 用の PDB はありませんが、それは問題ではありません。ソースコードやシンボル情報は気にしません。(まあ、実際にはそれらは本当に素晴らしいものですが、取得できないことはすでにわかっています。)Visual Studioはx86デバッグを実行できます(逆アセンブリビューはそのためのものです)。 x86 コード。

P/Invoke 呼び出し内で x86 命令にステップ インできるように VS を取得するには、他に何をする必要がありますか?

4

4 に答える 4

4

これは問題の解決に役立つ場合があります:(Gravitonによる)

CallingConvention = CallingConvention.Cdecl

また、これは、境界を越えるときにマネージド デバッガーをデタッチし、アンマネージド デバッガーを再アタッチする必要があることにも言及しています。混合デバッガーの機能とその設定を MSDN から確認する必要がある場合があります。

最後に、Ed Dore の回答を使用します。

[Tools.Options] ダイアログで、[Debugging] カテゴリを選択し、[Enable Just My Code] 設定がオフになっていることを確認します。プロジェクトのプロパティから [デバッグ] タブを選択し、[アンマネージ コードのデバッグを有効にする] がオンになっていることを確認します。

これらを解決したら、混合モードのデバッグ サポートを機能させる必要があります。

また、「Debug.Attach To Process」を使用する場合は、「Attach To Process」ダイアログの「Select...」ボタンを押して、マネージ デバッグ サポートとネイティブ デバッグ サポートの両方を選択してください。

于 2011-04-12T07:04:07.603 に答える
1

C#プロジェクトのプロパティの[デバッグ]タブで、[ネイティブコードのデバッグを有効にする]をオンにします。VS2012で私のために働いた。

クレジットはビルボードに送られます。

また、サードパーティのライブラリであるため、[オプション]>[デバッグ]で[コードだけを有効にする]がオフになっていることを確認してください。

于 2012-10-19T23:13:30.803 に答える
1

私が試みることの 1 つは、C# から C++/CLI コードに移行してから、C++ からサードパーティ コードに移行することです。C++ を (そして P/Invoke インフラストラクチャから解放されて) 使用できるようになると、逆アセンブル ビューでうまくいく可能性があります。

于 2009-10-13T01:58:19.267 に答える