web-dev-qa-db-ja.com

ネイティブC ++、マネージドc ++ cli、およびc#ソリューションを使用した混合モードでのデバッグ

作業中のマルチスレッドプロジェクトがあり、スタートアッププロジェクトは、UIを実行するc#プロジェクトに設定されています。次に、マネージドC++/CLIプロジェクトによってC#に接続されている一連の基礎となるc ++ネイティブプロジェクトがあります。 c#起動プロジェクト「Enable Unmanaged debug」で有効にしました。ネイティブコードをデバッグしようとすると、設定したブレークポイントに到達できます。しかし、再度実行してブレークポイントにヒットしようとすると、ハングします。たとえば、ループがある場合、各反復でループ内をヒットしようとします。2回目の反復の後、プログラムがハングし、強制的に終了する必要があります。私はVisual Studio 2010で働いています。この速度ではデバッグがあまり役に立たないことがわかってきました。この問題を回避する方法はありますか?

30
jamie

ネイティブコードとC++/CLIをデバッグする場合は、次のようにします。

  1. C#アプリケーションで、Allow unsafe code [ビルド]タブおよびEnable unmanaged code debuggingプロジェクトプロパティの[デバッグ]タブ。
  2. C++/CLI dllプロジェクトの場合、プロパティの[デバッグ]タブで、[デバッガータイプ]をMixedに設定します。
33
Tae-Sung Shin

また、複雑な混合コードアプリケーションのデバッグに問題があり、これらの状況ではVisual Studioの信頼性が低いことがわかりました。私の提案は:

  • ネイティブコードの一部をデバッグする場合は、ネイティブプロジェクトをデバッガの起動アプリケーションとして使用してみてください。プロジェクト設定の「デバッグ」タブで「デバッガーの種類」を「混合」に設定します。これは時々助けになります(ネイティブプロジェクトはDLLプロジェクト設定のデバッグターゲットとして);

  • WinDbgを使用すると、マネージ/アンマネージ混合コードアプリケーションの両方をより確実にデバッグできます。

8
floyd73

マネージドからアンマネージドコードにステップインしようとしたときに同じ問題が発生したため、代わりに、マネージド側のすべてのブレークポイントを削除して、次のようにしました。

1)ファイル->開く->ファイル(つまり、私のsource.cpp)で管理されていないソースファイルを開きます。

2)そこにブレークポイントを設定します

3)マネージコードのデバッグを開始する([再生]ボタン)

それはあなたの管理されていないコードに直接侵入するはずです...少なくとも私にとってはうまくいきます...

2
roboto1986