4

多数のC#、C ++ / CLI、およびネイティブC++プロジェクトで構成されるアプリケーションを継承しました。

アプリはMFCアプリケーションとして起動しますが、起動時にCLRを読み込みます(プロセスを介して、まだ完全に理解しているかどうかはわかりません)。

ネイティブC++コードにブレークポイントを配置でき、これらは期待どおりに機能することがわかりました。ただし、マネージコードのブレークポイントは機能しません。

C#では次のようになります。

「現在、ブレークポイントはヒットしません。このドキュメントのシンボルはロードされていません」。

C ++/CLIでは次のようになります。

「現在、ブレークポイントはヒットしません。この行に実行可能コードは関連付けられていません。考えられる原因には、プリプロセッサディレクティブまたはコンパイラ/リンカーの最適化が含まれます。」

同じC++ファイルに2つのブレークポイントを設定して、作業を1つだけにすることもできます。

#pragma unmanaged

int CMyClass::UnmanagedFunc()
{
    // Breakpoint here works
    return 1
}

#pragma managed

int CMyClass::ManagedFunc()
{
    // Breakpoint here DOES NOT WORK!!
    return 2
}

「アンマネージコードのデバッグを有効にする」(マネージライブラリプロジェクト内)のプロジェクト設定は、これらのブレークポイントには影響しません。コードベースの管理された部分を中断してステップスルーできるようにするために行う設定や構成などはありますか?



:プロセスはをロードし、、、、、、およびをmscoree.dll含む複雑なルーチンをCLRCreateInstance含みます。ICLRMetaHostICLRRuntimeHostGetRuntime(..)Start()ExecuteInDefaultAppDomain(..)

4

3 に答える 3

12

メインのEXEはネイティブプログラムであるため、デバッガーはアンマネージモードで起動し、マネージコードへのブレークポイントの設定をサポートしない可能性があります。プロジェクト+プロパティ、デバッグ、デバッガタイプの設定。デフォルトの自動から混合または管理のみに変更します。混合デバッグは、32ビットモードでのみ機能します。

更新:VS2012以降、デバッガーにレガシーマネージコードデバッグエンジン(C ++ / CLIを引き続きサポートするエンジン)を使用するように強制する必要もあります。[ツール]>[オプション]>[デバッグ]>[一般]>[管理された互換モードを使用する]設定。

于 2012-11-12T18:12:27.443 に答える
1

私にとって重要なのは、デバッガーの種類をAutoからMixedに変更することでしたが、スタートアップアプリケーションでは、C ++ / CLIコードを含むライブラリではありませんでした(これは私がやろうとしていたことです)。

于 2019-07-04T20:45:07.250 に答える
0

同じエラーで、デバッガーの種類を次のように指定したときに機能します。

混合または自動ではなく、 「ネイティブのみ」または「管理のみ」!!!

于 2017-04-07T11:19:39.700 に答える