ローカルまたは引数の値を取得できません。この命令ポインターでは使用できないため、最適化されている可能性があります。


211

Visual Studio 2010は、安全でないブロックの関数の引数の1つにあるデータを削除します(他の単語はありません)。このエラーの原因は何ですか?次のメッセージはデバッガによって表示されます。

Cannot obtain value of local or argument as it is not available at this instruction pointer, possibly because it has been optimized away.

2
私はまったく同じ問題を抱えており、デバッグビルドを使用しています。Cannot obtain value of local or argument '<this>' as it is not available at this instruction pointer, possibly because it has been optimized away. System.Threading.Tasks.TaskExceptionHolder
javapowered 2012年

19
誤って選択おっと私だけだったリリース...
ダニエル・リトル

VS 2017でこの問題が発生し、以下の投稿のすべての指示に従いました。他のオプションはありますか?
マットW

メニューのビルド->設定マネージャを忘れないでください。設定はそこでデバッグするように設定する必要があります。そうしないと問題が発生します。
ボブクレッグ

回答:


343

[プロジェクトのプロパティ]に移動し、[ビルド]で[コードの最適化]チェックボックスがオフになっていることを確認します。

また、詳細オプション([ビルド]タブの下)の[デバッグ情報]ドロップダウンを[完全]に設定します。


128
まず、ビルド構成がリリースではなくデバッグであることを確認します。
ApceH Hypocrite 2017

ちなみに、リリースモードでテストする場合は、「Debugger.Launch();」を追加できます。コード内
Jason

両方のステップを実行し、構成を「リリース」から「ビルド」に変更しました。Visual Studio 2017 Community Editionで作業しました。
Neo

1
VS 2017をお持ちの場合、承認された回答とxyq.384.bによる回答の両方が役立ちます。私にとってxyq.384.bの答えは、ポインターを抑制していたのがJITデバッガーだったので修正でした... JITが「最適化」して申し訳ありません...
BillRuhl

デバッグ構成に切り替えた後、最適化コードボックスが既にオフになっていることを発見しました。教訓:リリース構成モードではデバッグしないでください。
eliteproxy

135

また、VS 2015 Community Edition

Debug-> OptionsまたはTools-> Optionsに移動します

そして、Debugging-> General-> Suppress JIT optimization on module load(Managed only)をチェックします。


7
これは、上記のすべてのソリューションを適用した後で私の問題を解決しました。
masih 2016年

1
提案された回答のどれも私にとってはうまくいきません。私の変数はまだ最適化されています...
Sushi271

なぜこれが突然始まったのかはわかりませんが、これで解決しました。
Murphybro2

神聖ながらくた、これはVS2017コミュニティで私のためにもそれを修正しました!このオプションがいつ、どのように選択解除されたかはわかりません...
Ian Kemp

チャンピオンのように機能します!
BillRuhl

59

最適化を有効にしてコンパイルすると、多くの変数が削除されます。例えば:

SomeType value = GetValue();
DoSomething(value);

ここではローカル変数valueは通常削除され、代わりにスタックに値を保持します-作成したかのように少し:

DoSomething(GetValue());

また、戻り値がまったく使用されない場合、「pop」を介してドロップされます(「stloc」を介してローカルに格納されるのではなく、ローカルは存在しません)。

このため、そのようなビルドでデバッガは、現在の値を取得することはできませんvalueので、それは存在しませんが -それが唯一の間の短い瞬間のために存在するGetValue()DoSomething(...)

そう; デバッグしたい場合...リリースビルドを使用しないでください!少なくとも、デバッグ中は最適化を無効にします。


4
回答ありがとうございます。ただし、プロジェクトの[Optimize code]プロパティを確認しましたが、選択されていません=(
curiousity

4
@Marc-私はあなたの言っていることを理解していますが、私はマイクロソフトのリファレンスソースライブラリを使用して、独自のがらくたをコード化しています。私は現在、方法を歩いていますが、地元の人々の価値観を見ることができません。では、.Netソースをデバッグする意味は何ですか?助言がありますか?stackoverflow.com/questions/13147132/...
one.beat.consumer

私は@ one.beat.consumerと同じことをしているようです。Microsoftのパブリックシンボルをステップ実行して、ASP.NETフレームワークが機能していない理由を理解しようとしています。私の場合、MVC 3でのモデルバインディング...
2014

@ one.beat.consumerマイクロソフトのリファレンスは最適化を有効にしてコンパイルされているため、ソースコードをダウンロードして値をステップ実行できるかどうかを確認できますが、最適化を使用してプロジェクトをコンパイルする場合と同じです。有効。これはプロジェクト(dll)固有です。MS参照の「デバッグ」バージョンを取得できる場合は、値を確認できます。MS dllがメインプロジェクトが参照している別のプロジェクトによって参照されている場合、「サブリファレンス」が他のプロジェクトの設定と一致する場合があることを忘れないでください。
drzaus

22

http://www.guntucomputerhacks.blogspot.com.au/2014/07/cannot-obtain-value-of-local-or.html

これはビジュアルスタジオ2013で私のために働いた。

あなたがしなければならないすべては..

  1. デバッグできないプロジェクトを右クリックします。
  2. プロジェクト所有権に移動します。
  3. ビルドメニューをクリックします。
  4. 詳細ボタンをクリックします。
  5. デバッグ情報のドロップダウン値をフルに設定します。
  6. プロジェクトをリビルドします。

20

私はこれに遭遇し、Releaseビルド構成ではなくビルド構成で実行していましたDebugDebug変数に戻ると、再び時計に表示された変数に戻りました。


14

Visual Studio 2017で、[デバッグ]-> [オプション]に移動し、[デバッグ]-> [一般]をチェックして、このオプションをチェックします。

関連するVisual Studio 2017オプション


これは、上記の2015年の1つの回答の重複した回答です。stackoverflow.com
Daniel

8

同じ問題に直面したとき、再構築する前にソリューションをクリーンアップする必要がありました。それは私のためにそれを世話しました。


6

「コードの最適化」プロパティのチェックが解除されているにもかかわらず、コードが最適化されたままコンパイルされる問題について:すべてを試した後、最終的に私を助けたのは、同じ設定ページ(プロジェクトプロパティ-デバッグ)の[アンマネージコードのデバッグを有効にする]チェックボックスをオンにすることでした。コードの最適化とは直接関係ありませんが、これを有効にすると、VSはライブラリを最適化しなくなり、デバッグできます。


1
2番目の提案により、すべてが再び機能するようになりました。ありがとうございました。
CodeMilian 2014

1
VS 2015では、表示されませんEnable unmanaged code debugging。ありますがEnable native code debugging、チェックしてみましたが違いはありませんでした。
Al Lelopath 2016年

1
VS 2015では、プロジェクトビルド、Web、デバッガーで「ネイティブコード」を有効にすることを確認しましたが、すべて機能しました。
Mouffette 2016

6

同じ問題に直面しており、解決策はSolution ConfigurationからReleaseに変更することDebugです。それが役に立てば幸い


4

私の場合、私はWeb APIプロジェクトで作業しており、プロジェクトは正しく完全デバッグに設定されていましたが、デバッグしようとしたIISプロセスに接続するたびに、このエラーが引き続き表示されました。次に、公開プロファイルがリリース構成を使用するように設定されていることに気付きました。したがって、dotnet Web APIプロジェクトの「公開」機能を使用している場合は、もう1つ確認する場所が公開プロファイルです。


3

IISプロセスに接続してプロジェクトを実行してデバッグしているときにも、同じ問題が発生することがわかりました。また、最適化をオフにしてデバッグモードで実行していました。コードは正常にコンパイルされたと思いましたが、デタッチしてコンパイルしようとしたところ、参照の1つが見つかりませんでした。これは、ここで別の開発者が修正を行い、参照の場所を変更したためです。リファレンスにはアラートシンボルが表示されなかったので、コンパイルを行うまではすべて問題ないと思いました。参照を修正して再度実行すると、うまくいきました。


1

Azure WebサイトのWebアプリをデバッグするときにこの問題が発生する人のための追加の回答として:

たとえば、GitHubからデプロイする場合、コードはデフォルトで最適化されたAzureサーバーでコンパイルれます。

私は設定して、デバッグの方法でコンパイルするサーバーを教えSCM_BUILD_ARGS/p:Configuration=Debug

しかし、より多くのオプションがあります。これを参照してください:http : //azure.microsoft.com/blog/2014/05/08/introduction-to-remote-debugging-on-azure-web-sites-part-3-multi-instance-environment-and-git /


1

Visual Studio 2012の場合:

プロジェクトのプロパティ->デバッグ-> [Visual Studioホスティングプロセスを有効にする]をオフにします。


1

Webアプリケーションの場合、もう1つ重要な問題があり、アプリケーションの発行プロセス中に正しい構成を選択しています。

アプリをデバッグモードでビルドできますが、デフォルトでコードを使用しないリリースモードでアプリを公開する場合がありますが、公開されたコードがリリースモードのときにIDEがデバッグモードを表示するため、誤解を招く可能性があります。以下のスナップショットで詳細を確認できます。 ここに画像の説明を入力してください


0

AssemblyInfoファイルにDebuggable属性があるかどうかを確認します。存在する場合は、それを削除してソリューションを再構築し、ローカル変数が使用可能になるかどうかを確認します。

私のデバッグ可能な属性は、DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePointsに設定されていました。このMSDNの記事によれば、最適化を使用するようJITコンパイラーに指示しています。AssemblyInfo.csファイルからこの行を削除すると、ローカル変数が使用可能になりました。


0

Visual Studio 2017または2015の場合:

ソリューションに移動し、ソリューションを右クリックして、[プロパティ]-> [すべての構成]-> [デバッグ]を選択し、[OK]をクリックします。その再構築と実行の後、このソリューションは私にとってうまくいきました。


0

同じ問題がありました。上記のすべてを試してみたところ、プロジェクトの{PROJECT_ROOT} \ bin \ Release \ netcoreapp2.2および{PROJECT_ROOT} \ obj \ Release \ netcoreapp2.2内のすべても削除する必要があることがわかりました。Azure Webアプリで展開ツール/ビットバケットを使用していますが、実際に展開されているファイルを確認したかったので、ビルド>>公開>> Azureに公開を試しました。


0

以前にWPFアプリケーションで同じ問題を抱えていましたが、ここでのすべての解決策は問題を解決しませんでした。問題は、次のソリューションがようモジュールがすでに最適化されたということでしたWORKSていない(または、問題を解決するには十分ではありません):

  • コードの最適化」チェックボックスがオフ
  • モジュールのロード時にJIT最適化を抑制する」がチェックされている
  • DEBUGのソリューション構成

モジュールはまだ最適化されてロードされています。次のスクリーンショットを参照してください。 最適化されたモジュール


この問題を解決するには、最適化されたモジュールを削除する必要があります。最適化されたモジュールパスを見つけるには、Process Hackerなどのツールを使用できます。

プロセスパネル」でプログラムをダブルクリックし、新しいウィンドウで「.NETアセンブリ」タブを開きます。次に、「ネイティブイメージパス」の列に、すべての最適化されたモジュールのパスが表示されます。最適化を解除するフォルダーを見つけて、フォルダー削除します(下のスクリーンショットを参照):( ここに画像の説明を入力してください 明らかな理由で会社名をぼかしました)

アプリケーションを再起動し(手順1のチェックボックスを正しくオンにして)、動作するはずです。

:別のプロセスによって開かれたため、ファイルがロックされている可能性があります。VisualStudioを閉じてみてください。ファイルがまだロックされている場合は、Lock Hunterなどのプログラムを使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.