18

C# コードから呼び出す C++ 関数呼び出しのラッパーがあります。Visual Studio でデバッガーをアタッチして、ネイティブ C++ コードにステップインするにはどうすればよいですか?

これは、C++ ファイルで定義された GetData() を呼び出すラッパーです。

    [DllImport("Unmanaged.dll", CallingConvention=CallingConvention.Cdecl, 
               EntryPoint = "GetData", BestFitMapping = false)]
        public static extern String GetData(String url);

コードがクラッシュしており、根本的な原因を調査したいと考えています。

ありがとう、ニキル

4

4 に答える 4

23

プロジェクトのプロパティ ページの [デバッグ] タブを確認します。「アンマネージ コードのデバッグを有効にする」チェックボックスが必要です。これは、古い C++ DLL 用の新しい .NET UI を開発したときにうまくいきました。

アンマネージ DLL が別のプロジェクトからビルドされている場合 (しばらくの間、私たちのプロジェクトは VS6 を使用してビルドされていました)、DLL の pdb ファイルがデバッグに便利であることを確認してください。

もう 1 つの方法は、C# exe をターゲット exe として使用して DLL プロジェクトから実行することです。その後、DLL を通常どおりにデバッグできます。

于 2008-09-11T23:02:02.393 に答える
8

デバッガーを起動するためのLouのアドバイスに加えて、[プロセスにアタッチ]ダイアログで[選択...]をクリックし、[マネージコード]と[マネージコード]の両方を選択することで、既存のプロセスにアタッチするときに使用するデバッグエンジンを選択できます。ネイティブコード」。

この方法でのデバッグは、混合モードデバッグと呼ばれます。ヒントについては、このブログ投稿を参照してください。

これは64ビットプロセスではサポートされていないと思います...その点では間違っていると思いますが。

于 2008-09-11T23:10:39.393 に答える
2

WinDbg を使用しているすべての人へ:

1>設定記号

これらのコマンドを見てください。(ヘルプ: コンソール内 .hh < コマンド> )

.sympath
.sympath+ 
.symfix

2>ソースパスの設定

.srcpath

3>管理/混合モード プログラムをデバッグするために SOS エクステンションをロードします。

(拡張パスが正しく設定されていることを確認してください)

以下を使用して x86 用に Microsoft.NET\Framework\v2.0.50727 を追加します。

.extpath 

ロードする clr のブレークポイントを設定します。

sxe ld:mscorwks

(F5 / g) (mscorwks.dll の ModLoad BP を待ちます)

重複した sos エクステンションが既にロードされていないことを確認してください。見る:

.chain

これで、sos エクステンションをロードする準備が整いました。:)

.loadby sos mscorwks

4>すべてのシンボルをリロードします..

.reload

これで準備完了です:)

(YMMV)

于 2008-09-12T13:29:00.813 に答える