「現在の方法のコードが最適化されているため、式を評価できません。」平均?

StackOverflow https://stackoverflow.com/questions/131628

質問

再帰を多く含むコードをいくつか書きましたが、完了するまでにかなりの時間がかかります。何が起こっているかを見るために実行を「一時停止」すると、次のような結果が得られます。

現在のメソッドのコードが最適化されているため、式を評価できません。

それが何を意味するのか理解できると思います。しかし、私を困惑させたのは、ステップに到達した後、コードが「最適化」されなくなり、変数を確認できることです。これはどうして起こるのでしょうか?最適化されたコードと最適化されていないコードの間でコードをどのように切り替えることができるのでしょうか?

役に立ちましたか?

解決

デバッガーは FuncEval を使用して変数を「確認」できるようにします。FuncEval では、マネージド コード内のスレッドを GarbageCollector の安全なポイントで停止する必要があります。IDE で実行を手動で「一時停止」すると、すべてのスレッドができるだけ早く停止します。再帰性の高いコードは、安全でないポイントで停止する傾向があります。したがって、デバッガーは式を評価できません。

F10 を押すと、次の Funceval Safe ポイントに移動し、関数評価が有効になります。

詳細については、を参照してください。 FuncEval のルール.

他のヒント

Debug.Break() 行がコールスタックの最上位にある間は、式を評価することはできません。それはそのラインが最適化されているからです。F10 を押して次の行 (有効なコード行) に移動すると、時計が動作します。

おそらく、デバッグ モードではなくリリース モードでアプリをデバッグしようとしているか、コンパイル設定で最適化がオンになっていると考えられます。

コードが最適化されてコンパイルされると、特定の変数は関数内で使用されなくなると破棄されるため、このメッセージが表示されます。最適化を無効にしたデバッグ モードでは、そのエラーは発生しないはずです。

これには私は気が狂いました。マネージコードとネイティブコードを使用してアタッチしようとしましたが、ダメでした。

これは私にとってはうまくいき、最終的にすべての式を評価することができました。

  • プロジェクト/プロパティに移動します
  • ビルド]タブを選択し、[Advanced]をクリックします...
  • デバッグ情報が「完全」に設定されていることを確認してください(PDBのみではありません)
  • プロジェクトをデバッグします - 出来上がりです!

以下は私にとってうまくいきました、ありがとう@Vin。

VS 2015 を使用していたときにこの問題が発生しました。私の解決策:設定では (デバッグ) が選択されています。チェックを外すことで解決しました Optimize Code プロジェクトプロパティの下のプロパティ。

プロジェクト (右クリック) => プロパティ => ビルド (タブ) => コー​​ドの最適化のチェックを外します

多くのパラメーターを含む関数呼び出しを探し、デバッグが戻るまで数値を減らしてみます。

そのようなことがないように注意してください

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]

あなたの中で AssemblyInfo

Microsoft の友人の友人が次のメッセージを送信しました。http://blogs.msdn.com/rmbyers/archive/2008/08/16/Func_2D00_eval-can-fail-while-stopped-in-a-non_2D00_optimized-managed-method-that-pushes-more-than-256-引数-バイト-.aspx

最も考えられる問題は、メソッド シグネチャが大きすぎるためにコール スタックが最適化されていることです。

同じ問題がありましたが、デバッガーで例外トラップをオフにすることで解決できました。[デバッグ][例外]をクリックし、例外を「ユーザー未処理」に設定します。

普段はこれをオフにしていますが、時々便利です。終わったら忘れずにオフにする必要があります。

VS 2010 を使用していたときにこの問題が発生しました。私のソリューション構成では (デバッグ) が選択されています。この問題は、プロジェクトのプロパティで [コードを最適化] プロパティのチェックを外すことで解決しました。プロジェクト (右クリック) => プロパティ => ビルド (タブ) => コー​​ドの最適化のチェックを外します

私の場合、ソリューションに 2 つのプロジェクトがあり、スタートアップ プロジェクトではないプロジェクトを実行していました。それをスタートアッププロジェクトに変更すると、デバッグが再び機能し始めました。

誰かの役に立てば幸いです。

評価:

.NET では、「関数評価 (funceval)」とは、デバッグ対象がどこかで停止している間に任意の呼び出しを挿入する CLR の機能です。Funceval は、デバッガーが選択したスレッドを担当して、要求されたメソッドを実行します。funceval が終了すると、デバッグ イベントが発生します。技術的には、CLR はデバッガが funceval を発行する方法を定義しました。

CLR では、GC セーフ ポイント (つまり、GC セーフ ポイント) にあるスレッドでのみ funceval を開始できます。スレッドが GC をブロックしない場合) と Funceval Safe (FESafe) ポイント (すなわち、ここで、CLR は実際に funceval のハイジャックを行うことができます。) を一緒に行います。したがって、CLR の考えられるシナリオでは、スレッドは次のようになっている必要があります。

  1. マネージ コード内 (および GC 安全なポイント) で停止します。これは、ネイティブ コードでは funceval を実行できないことを意味します。ネイティブ コードは CLR の制御外にあるため、関数をセットアップできません。

  2. 最初のチャンスまたは未処理のマネージド例外 (および GC セーフ ポイント) で停止します。つまり、例外が発生したときに、その例外が発生した理由を判断するために可能な限り検査します。(例えば:デバッガは、発生した例外の Message プロパティを評価して確認しようとする場合があります。)

全体として、マネージ コードで停止する一般的な方法には、ブレークポイント、ステップ、Debugger.Break 呼び出しでの停止、例外のインターセプト、またはスレッドの開始での停止が含まれます。これは、メソッドと式を評価するのに役立ちます。

考えられる解決策:評価に基づいて、スレッドが FESafe ポイントと GCSafe ポイントにない場合、CLR はスレッドをハイジャックして funceval を開始できません。一般に、次のことは、期待どおりに funceval を開始するのに役立ちます。

ステップ1:

「リリース」ビルドをデバッグしようとしていないことを確認してください。リリースは完全に最適化されているため、議論に誤りが生じる可能性があります。標準ツールバーまたは構成マネージャーを使用すると、デバッグとリリースを切り替えることができます。

ステップ2:

それでもエラーが発生する場合は、最適化のために [デバッグ] オプションが設定されている可能性があります。プロジェクトの「プロパティ」の下にある「コードの最適化」プロパティを確認してチェックを外します。

プロジェクト]オプションを右クリックして「プロパティ」を[ビルド]タブに移動して、チェックボックス「最適化コード」をチェックします

ステップ 3:

それでもエラーが発生する場合は、デバッグ情報モードが正しくない可能性があります。「詳細なビルド設定」を確認して「フル」に設定します。

プロジェクト]オプションを右クリックして「プロパティ」[ビルド]タブに移動します[[詳細]ボタンを[デバッグ情報]設定「フル」として設定します

ステップ 4:

それでも問題が解決しない場合は、次のことを試してください。

デバッグ中に「クリーン」を行い、ソリューションファイルを「再構築」します。モジュール]ウィンドウ(vsメニュー - > debug-> windows->モジュール)に移動します。ロードされたモジュールのリストにアセンブリを見つけます。ロードされたアセンブリに対してリストされているパスをチェックすることは、ファイルの変更されたタイムスタンプをチェックすることを期待するものです。

結論:

これはエラーではなく、特定の設定に基づいた情報であり、.NET ランタイムの動作方法に基づいて設計されています。

私の場合、リリースモードにありましたが、デバッグするために変更したものはすべて機能しました

私も同様の問題を抱えていましたが、デバッグ モードでソリューションをビルドし、実行パスの pdb ファイルを置き換えると解決されました。

あなたが見ているものは最適化の結果であると思います - 変数が再利用されることもあります - 特にスタック上に作成された変数は。たとえば、2 つの (ローカル) 整数を使用するメソッドがあるとします。最初の整数はメソッドの開始時に宣言され、ループのカウンターとしてのみ使用されます。2 番目の整数はループの完了後に使用され、後でファイルに書き出される計算結果が保存されます。この場合、オプティマイザは最初の整数を再利用して、2 番目の整数に必要なコードを保存することを決定してもよい(MAY)。早い段階で 2 番目の整数を見ようとすると、「式を評価できません」というメッセージが表示されます。正確な状況を説明することはできませんが、オプティマイザーが 2 番目の整数の値を後で別のスタック項目に転送する可能性があり、その結果、デバッガーからその値にアクセスできるようになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top