“Tidak dapat mengevaluasi ekspresi karena kode metode saat ini dioptimalkan” di Visual Studio 2010

153

Saya menggunakan Visual Studio 2010 dalam mode debug dan saya memiliki "mengoptimalkan kode" tidak dicentang. Saya tidak bisa menonton cepat (atau mengarahkan) variabel apa pun di debugger. Saya mendapatkan kesalahan ini "Tidak dapat mengevaluasi ekspresi karena kode metode saat ini dioptimalkan".

Bahkan baris seperti: int i = -3, melakukan pengamatan cepat pada saya, saya mendapatkan "Tidak dapat memperoleh nilai lokal atau argumen 'i' karena tidak tersedia di petunjuk instruksi ini, mungkin karena telah dioptimalkan jauh."

Tautan ini dirujuk dalam pertanyaan serupa tampaknya tidak berlaku.

Apakah ada pengaturan yang saya lewatkan?

Tony_Henrich
sumber
4
torulflundgren.blogspot.com.au/2010/03/... Ini adalah solusi terbaik yang saya temukan untuk ini. Saya menguji ini di visual studio 2013. dan bekerja ....
Dulanjana Wickramatantri

Jawaban:

167

Sementara proyek dalam mode debug, solusinya tidak. Ketika saya mengubahnya, itu berhasil.

Tony_Henrich
sumber
9
Saya memiliki masalah ini di VS2012, namun solusi dan semua proyek diatur ke Debug tanpa optimasi. Saya membersihkan solusi / membangunnya untuk saya.
saarp
20
Jadi ... Bagaimana Anda mengatur solusi ke mode non-debug?
user1431072
user1431072 - Anda mengklik kanan pada solusi atau proyek Anda dan memilih properti, maka Anda dapat mengaturnya menjadi mode debug
Yevgraf Andreyevich Zhivago
48

Saya memiliki masalah ini ketika saya menggunakan VS 2010. Konfigurasi solusi saya telah (Debug) dipilih. Saya menyelesaikan ini dengan menghapus centang properti Kode Optimasi di bawah properti proyek. Project (Klik kanan) => Properties => Build (tab) => hapus centang kode Optimalkan

Vin
sumber
29

Sepertinya Anda sedang men-debug bangunan yang dioptimalkan / rilis, meskipun kotak yang dioptimalkan tidak dicentang. Hal yang dapat Anda coba adalah:

  • Lakukan rekondisi lengkap dari file solusi Anda (klik kanan pada solusi dan pilih Rebuild all)
  • Saat debugging buka jendela modul (Debug -> Windows -> Modul) dan temukan unit Anda dalam daftar modul yang dimuat. Periksa apakah Path terdaftar pada rakitan Anda yang dimuat sesuai dengan yang Anda harapkan, dan stempel waktu yang dimodifikasi pada file menunjukkan bahwa rakitan itu benar-benar dibangun kembali.
  • Jendela modul juga harus memberi tahu Anda apakah modul yang dimuat dioptimalkan atau tidak - pastikan bahwa jendela modul menunjukkan bahwa modul tersebut tidak dioptimalkan.

Jika Anda tidak dapat melihat item menu Modul di Debug -> menu Windows maka Anda mungkin perlu menambahkannya di menu "Kustomisasi ...".

Justin
sumber
2
Solusinya dibangun kembali. Jendela modul menunjukkan bahwa perakitan dioptimalkan. Saya memiliki centang pada kotak centang Optimalkan sehingga saya tidak tahu mengapa perakitan selalu dioptimalkan. Solusinya memiliki proyek web tetapi kode yang saya lihat adalah dalam proyek perpustakaan kelas dalam mode debug.
Tony_Henrich
@Tony - Pertanyaan konyol, tetapi apakah perpustakaan kelas memiliki kotak centang "Dioptimalkan" tidak dipilih?
Justin
Iya. Saya menyebutkan fakta ini dalam pertanyaan saya. Saya sudah menjawab pertanyaan saya sendiri.
Tony_Henrich
1
Saya Project.Webmemiliki Optimization unticked namun masih menunjukkan sebagai Optimized ketika saya melihat perakitan di Debug > Modules:(
J86
Satu-satunya cara yang saya temukan untuk memaksa VS untuk memperbarui info debugging adalah untuk meningkatkan versi perakitan modul yang masih dianggap dioptimalkan sedangkan opsi tidak dicentang.
alphanoch
14

Dalam VS2013 pergi ke: Alat -> Opsi -> Debugging -> Umum dan aktifkan 'Gunakan mode kompatibilitas terkelola'. Ini menonaktifkan perilaku evaluasi fungsi baru.

Jesse
sumber
Terima kasih! Dari solusi lain yang ditawarkan, inilah yang penting bagi saya. Hal aneh adalah hal itu terjadi secara tiba-tiba, saya bertanya-tanya apa yang menyebabkannya berubah.
squid808
10

Cobalah untuk menjalankan dalam mode debug. Jika Anda menjalankan dalam mode rilis Anda akan mendapatkan pesan ini.

thejustv
sumber
5
Pertanyaannya mengatakan, sederhana seperti siang hari, "Saya menggunakan Visual Studio 2010 dalam mode debug dan saya memiliki" optimalkan kode "tidak dicentang." ... Anda harus menghapus non-jawaban ini.
Jim Balter
Serius. Dia mengatakannya dalam pertanyaan bahwa dia menjalankan debug. Saya tidak mengerti mengapa upvotes. Jawaban ini mencemari resolusi yang mungkin
John Demetriou
1
FWIW, pertanyaan ini berperingkat tinggi di Google ketika Anda mencari pesan kesalahan ini. Jawaban ini benar untuk saya (saya tidak menyadari saya dalam mode rilis).
Nate Barbettini
Dia mungkin memiliki lebih dari satu rakitan dan di manajer konfigurasi rakitan yang dia debug dapat diatur untuk melepaskan atau sth.
madoxdev
8

Situasi saya tidak tercakup oleh jawaban di atas. Saya menemukan yang berikut: Artikel MSDN pada threading yang menjelaskan bahwa ketika terjebak dalam beberapa operasi threading asli primitif, debugger tidak dapat mengakses data. Sebagai contoh, ketika utas sedang duduk di Task.Wait (), ini muncul.

Alan Baljeu
sumber
8

Saya memiliki masalah yang sama. Tetapi dalam kasus saya, Debuggableatribut tersebut sulit dikodekan dalam AssemblyInfo.csfile proyek saya dan karenanya tidak (over-) ditulis oleh kompilasi. Ini berhasil setelah menghapus garis yang menentukan Debuggableatribut.

riQQ
sumber
8

Bagi saya itu terjadi di VS2017 dan VS2019. Itu berhenti terjadi setelah saya memilih opsi "Suppressed JIT optimization on load module".

masukkan deskripsi gambar di sini

farfareast
sumber
+1, ini adalah penyebab masalah saya. VS sepertinya tidak terlalu pandai benar-benar memahami opsi csproj karena saya telah mengoptimalkan dimatikan dalam XML ketika konfigurasi berakhir dengan "Debug". Ini berfungsi dengan baik ketika memanggil MSBuild secara langsung tetapi tidak tepat di VS itu sendiri.
TheBeardedQuack
5

Saya memiliki masalah yang sama di VS2008. Dalam kasus saya itu diselesaikan melalui solusi-rebuild.

Ingmar
sumber
4

Terlepas dari @ Kragen yang disebutkan, Jika Anda men-debug proyek web

tutup studio visual dan coba hapus file sementara di C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files

penguji
sumber
Solusinya memiliki proyek web tetapi kode dalam proyek perpustakaan kelas. Saya telah menghapus file sementara berkali-kali.
Tony_Henrich
4

Satu hal lain yang dapat Anda lakukan adalah, buat file dengan nama yang sama dengan dll yang dioptimalkan tetapi dengan ekstensi ini dan tambahkan yang berikut ke dalamnya:

[.NET Framework Debugging Control]
GenerateTrackingInfo = 1
AllowOptimize = 0

Ini akan memberitahu JIT untuk tidak mengoptimalkan variabel Anda.

Perhatikan bahwa Anda masih membutuhkan pdb, sehingga Anda akan berakhir dengan sesuatu seperti ini: yourDll.dll yourDll.pdb yourDll.ini

Ini berfungsi khusus dengan baik dalam skenario ketika Anda tidak memiliki akses untuk membuat kembali dll dengan opsi debug.

http://www.hanselman.com/blog/DebugVsReleaseTheBestOfBothWorlds.aspx

Bongo Sharp
sumber
4

Ketika Anda melihat pesan " Tidak dapat mengevaluasi ekspresi karena kode metode saat ini dioptimalkan. " Setelah mengeluarkan Debugger.Break()pernyataan, pastikan Anda menekan F10 untuk melangkah ke pernyataan berikutnya.

Setelah melangkah ke pernyataan berikutnya, dan dengan asumsi Anda menjalankan Debug build, pesan ini akan hilang.

Jeroen Ritmeijer
sumber
2
Itu dia. Saya sudah mencoba semua solusi di atas dan hal kecil ini berhasil .. Terima kasih telah berbagi, saya akan menghabiskan lebih banyak waktu tanpa melihat petunjuk sepele ini ..
Krzysztof Szynter
Tidak. Tidak bekerja. VS17 masih berpikir saya sedang debug membangun rilis
John Demetriou
3

Mengenai masalah dengan properti "Optimalkan kode" yang TIDAK DIHAPUS namun kode masih dikompilasi sebagai dioptimalkan: Apa yang akhirnya membantu saya setelah mencoba semuanya memeriksa kotak centang "Aktifkan debug kode tidak dikelola" pada halaman pengaturan yang sama (Properti proyek - Debug). Itu tidak secara langsung berhubungan dengan optimasi kode, tetapi dengan ini diaktifkan, VS tidak lagi mengoptimalkan perpustakaan saya dan saya bisa men-debug.

Miloš
sumber
3

Saya memiliki masalah yang sama saat men-debug perpustakaan kelas dari aplikasi web yang diuji. Saya merujuk versi rilis di testbed dan yang ditetapkan untuk dioptimalkan di properti perpustakaan kelas.

Hapus centang pada kotak centang optimalkan kode untuk versi rilis di properti pustaka kelas, tepat saat saya menulisnya, telah memecahkan masalah.

puzzleegirl
sumber
Terima kasih sudah melakukannya. Anda dapat menemukan kotak centang ini dengan mengklik kanan ke setiap proyek dan memilih opsi menua "Properties", lalu tab "Build".
goamn
3

Saya menyadari ini adalah jawaban nanti, tetapi saya menemukan referensi lain tentang cara untuk mengatasi masalah ini yang mungkin dapat membantu orang lain di masa depan. Halaman web ini menjelaskan pengaturan variabel lingkungan (COMPLUS_ZapDisable = 1) yang mencegah pengoptimalan, setidaknya itu berlaku untuk saya! (Jangan lupa bagian kedua menonaktifkan proses hosting Visual Studio.) Dalam kasus saya, ini mungkin bahkan lebih relevan karena saya men-debug DLL eksternal melalui server simbol, tapi saya tidak yakin.

Michael Bray
sumber
3

Saya punya masalah dengan proyek F # yang telah ada di sana-sini antara Visual Studio dan MonoDevelop, mungkin berasal dari yang terakhir (saya lupa). Dalam VS, kotak optimisasi tidak dicentang, namun optimisasi tampaknya terjadi sejauh menyangkut debugger.

Setelah membandingkan XML file proyek dengan file yang sehat, masalahnya jelas: proyek sehat memiliki <optimize>false</optimize>garis eksplisit , sedangkan yang buruk benar-benar hilang. VS jelas menyimpulkan dari ketiadaannya bahwa optimasi dinonaktifkan, sedangkan kompiler melakukan yang sebaliknya.

Solusinya adalah menambahkan properti ini ke file proyek, dan memuat ulang.

Jason Holloway
sumber
1

Saya mulai menerima pesan ini ketika saya bermigrasi ke Visual Studio 2017. Tidak ada satu pun ide di halaman ini yang saya coba untuk saya. Pada posting lain saya menemukan saran ini dan TIDAK berfungsi - hapus:

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

... dari file AssemblyInfo Anda.

Kucing gila
sumber
Aku mencintaimu @Crazy Cat. Itu terjadi pada saya ketika saya bermigrasi ke VS2019.
Antonio Rodríguez
0

Saya memiliki masalah yang sama di VS 2010. Membersihkan dan membangun kembali solusi dan berhasil.

Sanjay Gupta
sumber
0

Komentar vickramds di atas, merujuk pada http://torulflundgren.blogspot.com.au/2010/03/cannot-obtain-value-of-local-or.html , melakukannya untuk saya. Saya memeriksa semuanya - menghapus semua dll, file pdb dari folder bin lokal, Clean, Rebuild, membersihkan semua folder Temporary ASP.NET Files, memastikan flag TRACE / DEBUG diatur, memeriksa jalur DLL, dll.

Untuk meletakkannya agar tidak hilang, untuk proyek yang terkena:

Properti Proyek -> Build -> Advanced -> Info Debug: Lengkap.

Anda ingin memeriksa apakah Anda memiliki konfigurasi Debug yang dipilih sebelum Anda melakukan ini, kecuali tentu saja, Anda bermaksud sebaliknya.

Mayyit
sumber
0

Jika Anda mencoba men-debug proyek ASP.NET, pastikan properti Properties> Web> Server dropdown diatur ke "IIS Express" (selain memeriksa semua yang lain di sini).

Tuan Zurg
sumber
0

Saya telah mencampur dll c ++ / cli mfc ekstensi, yang dioptimalkan bahkan jika konfigurasi debug (dilihat dari VS 2017 Modul jendela). Seperti jawaban sebelumnya menyarankan saya mengubah "Pada VS2013 pergi ke: Alat -> Pilihan -> Debugging -> Umum dan aktifkan 'Gunakan mode kompatibilitas terkelola'. Ini menonaktifkan perilaku evaluasi fungsi baru." Pengaturan itu juga ditemukan di VS 2017.

Tapi itu tidak cukup, jadi saya juga menyalin pengaturan UseDebugLibraries dari file proyek aplikasi MFC lain ke file proyek dll ekstensi.

    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
      ...
      <UseDebugLibraries>true</UseDebugLibraries>

Kemudian bangun kembali dan itu memperbaiki masalah.

owluCoder
sumber
0

Di Visual Studio 2012 mengaktifkan opsi " Dikelola " dari Alat> Debugging> Just-In-Time bekerja untuk saya.

masukkan deskripsi gambar di sini

QMaster
sumber