Tidak dapat memperoleh nilai lokal atau argumen karena tidak tersedia pada penunjuk instruksi ini, mungkin karena telah dioptimalkan

212

Visual Studio 2010 membunuh (tidak ada kata lain) data di salah satu argumen fungsi di blok tidak aman. Apa yang bisa menyebabkan kesalahan ini? Pesan berikut ini ditunjukkan oleh debugger.

Cannot obtain value of local or argument as it is not available at this instruction pointer, possibly because it has been optimized away.
rasa ingin tahu
sumber
2
Saya memiliki masalah yang sama persis dan saya menggunakan Debug build. 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
19
Ups, saya baru saja merilisnya secara tidak sengaja ..
Daniel Little
Saya mengalami masalah ini di VS 2017 dan saya telah mengikuti semua instruksi di posting di bawah ini. Apakah ada opsi lain?
Matt W
Jangan lupa Menu Build -> Configuration Manager. Konfigurasi perlu diatur ke Debug di sana atau Anda masih mendapatkan masalah.
Bob Clegg

Jawaban:

346

Pergi ke Properti Proyek dan di bawah Bangun Pastikan bahwa kotak centang "Kode Optimasi" tidak dicentang.

Juga, setel tarik turun "Info Debug" ke "Penuh" di Opsi Lanjut (Di bawah tab Bangun).

Karthik
sumber
129
Pertama, periksa apakah Konfigurasi Build adalah Debug, bukan Release.
ApceH Hypocrite
Omong-omong, jika Anda ingin mengujinya dalam mode Rilis, Anda dapat menambahkan "Debugger.Launch ();" dalam kode
Jason
Melakukan kedua langkah dan mengubah konfigurasi dari "Lepaskan" ke "Bangun". Bekerja pada Visual Studio 2017 Community Edition.
Neo
1
Jika Anda memiliki VS 2017, jawaban yang diterima dan jawaban oleh xyq.384.b akan membantu. Bagi saya jawaban xyq.384.b adalah perbaikan karena itu adalah JIT debugger yang menekan pointer ... Maaf JIT "dioptimalkan" itu ...
BillRuhl
Setelah beralih ke konfigurasi debug saya menemukan kotak kode optim sudah tidak dicentang. Hal yang dipelajari: Jangan men-debug dalam mode konfigurasi rilis.
eliteproxy
135

Juga Dalam VS 2015 Edisi Komunitas

pergi ke Debug-> Opsi atau Alat-> Opsi

dan periksa Debugging-> Umum-> Suppress JIT optimization on load module (Managed only)

xyq.384.b
sumber
7
Ini menyelesaikan masalah saya setelah menerapkan semua solusi yang disebutkan di atas.
masih
1
Tidak ada jawaban yang disarankan bekerja untuk saya. Variabel saya masih dioptimalkan jauh ...
Sushi271
Tidak tahu mengapa ini tiba-tiba mulai terjadi .. tetapi ini memperbaikinya!
Murphybro2
Aduh, ini juga memperbaikinya bagi saya di Komunitas VS2017! Tidak tahu kapan atau bagaimana opsi ini terpilih ...
Ian Kemp
Bekerja seperti jagoan!
BillRuhl
59

Jika Anda mengkompilasi dengan optimasi yang diaktifkan, maka banyak variabel akan dihapus; sebagai contoh:

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

di sini variabel lokal valuebiasanya akan dihapus, menjaga nilai pada stack - agak seperti seolah-olah Anda telah menulis:

DoSomething(GetValue());

Juga, jika nilai kembali tidak digunakan sama sekali , maka akan dijatuhkan melalui "pop" (daripada disimpan di lokal melalui "stloc", dan sekali lagi; lokal tidak akan ada).

Karena itu, dalam build seperti itu debugger tidak bisa mendapatkan nilai saat ini valuekarena tidak ada - hanya ada untuk sekejap antara GetValue()danDoSomething(...) .

Begitu; jika Anda ingin men-debug ... jangan gunakan rilis build! atau setidaknya, nonaktifkan optimisasi saat Anda debug.

Marc Gravell
sumber
4
Terima kasih atas jawaban Anda - tetapi saya memeriksa properti kode Optimalkan dalam proyek saya dan itu tidak dipilih = (
ingin tahu
4
@ Mark - Saya mengerti apa yang Anda katakan, namun, saya menggunakan perpustakaan sumber referensi microsoft untuk kode langkah melalui omong kosong mereka sendiri. Saya berjalan melalui metode sekarang, tetapi saya tidak bisa melihat nilai-nilai penduduk setempat. Apa gunanya men-debug sumber .Net? Ada saran? stackoverflow.com/questions/13147132/…
one.beat.consumer
Saya tampaknya melakukan hal yang sama dengan @ one.beat.consumer: mencoba melangkah melalui simbol publik Microsoft untuk memahami mengapa kerangka kerja ASP.NET tidak berfungsi. Dalam kasus saya, model mengikat di MVC 3 ...
bambams
@ one.beat.consumer Saya berasumsi karena referensi microsoft dikompilasi dengan optimasi yang diaktifkan, jadi meskipun Anda dapat mengunduh kode sumber mereka untuk melihatnya melangkah melalui nilai-nilai yang hilang, sama seperti jika Anda mengkompilasi proyek Anda dengan optimasi. diaktifkan. Ini proyek (dll) khusus - jika Anda bisa mendapatkan "debug" versi referensi MS maka Anda akan dapat melihat nilai-nilai. Jangan lupa bahwa jika MS dll direferensikan oleh proyek lain yang dirujuk oleh proyek utama Anda, "subreferensi" mungkin cocok dengan pengaturan proyek lainnya.
drzaus
20

Saya hanya berlari ke ini dan saya sedang menjalankan di bawah Releasemembangun konfigurasi bukannya Debugmembangun konfigurasi. Setelah saya beralih kembali ke Debugvariabel saya muncul di arloji lagi.

JabberwockyDecompiler
sumber
14

Dalam Visual Studio 2017 goto Debug-> Option lalu centang Debugging-> general-> dan centang opsi ini

Pilihan Visual Studio 2017 yang relevan

Zahid Hasan
sumber
Ini adalah jawaban duplikat dari satu jawaban dari 2015 di atas: stackoverflow.com/a/34385875/1250319
Daniel
8

Ketika saya dihadapkan dengan masalah yang sama, saya hanya perlu membersihkan solusi saya sebelum membangun kembali. Itu merawatnya untuk saya.

CJe
sumber
6

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 yang 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
1
Saran kedua membuat semuanya bekerja lagi terima kasih!
CodeMilian
1
Di VS 2015, saya tidak melihat Enable unmanaged code debugging. Ada Enable native code debugging, saya mencoba memeriksa ini tetapi tidak ada bedanya.
Al Lelopath
1
Di VS 2015 saya memeriksa Aktifkan "kode asli" di proyek build, Web, Debuggers dan semuanya bekerja.
Mouffette
6

Saya telah menghadapi masalah yang sama dan solusi bagi saya berubah Solution Configurationdari Releasemenjadi Debug. Semoga ini bisa membantu

Hoang Tran
sumber
4

Dalam kasus saya, saya sedang mengerjakan proyek web api dan meskipun proyek diatur dengan benar untuk debug penuh, saya masih melihat kesalahan ini setiap kali saya lampirkan pada proses IIS yang saya coba debug. Kemudian saya menyadari bahwa profil publish diatur untuk menggunakan konfigurasi Release. Jadi satu tempat lagi untuk memeriksa adalah profil publikasi Anda jika Anda menggunakan fitur 'Publikasikan' proyek dotnet web api Anda.

pengguna8683595
sumber
3

Saya menemukan bahwa saya memiliki masalah yang sama ketika saya menjalankan proyek dan debugging dengan melampirkan ke proses IIS. Saya juga menjalankan dalam mode Debug dengan optimasi dimatikan. Sementara saya pikir kode itu dikompilasi dengan baik, ketika saya melepaskan dan mencoba mengkompilasi, salah satu referensi tidak ditemukan. Ini karena pengembang lain di sini yang melakukan modifikasi dan mengubah lokasi referensi. Referensi tidak muncul dengan simbol peringatan, jadi saya pikir semuanya baik-baik saja sampai saya melakukan kompilasi. Setelah memperbaiki referensi dan menjalankannya lagi itu berhasil.

Derreck Dean
sumber
1

Sebagai jawaban tambahan bagi mereka yang mengalami masalah ini saat men-debug aplikasi web situs web Azure:

Ketika menggunakan dari GitHub, misalnya, kode dikompilasi di server Azure dioptimalkan secara default.

Saya memberitahu server untuk mengkompilasi dengan cara debuggable dengan mengatur SCM_BUILD_ARGSke/p:Configuration=Debug

tetapi ada lebih banyak opsi. Lihat ini: http://azure.microsoft.com/blog/2014/05/08/introduction-to-remote-debugging-on-azure-web-sites-part-3-multi-instance-environment-and-git /

diegosasw
sumber
1

Dalam Visual Studio 2012:

Buka properti proyek -> Debug -> Hapus centang "Aktifkan proses hosting Visual Studio"

Milana
sumber
1

Untuk aplikasi web ada masalah lain yang penting dan memilih konfigurasi yang benar selama proses penerbitan aplikasi.

Anda dapat membangun aplikasi dalam mode debug, tetapi itu mungkin terjadi Anda menerbitkannya dalam mode rilis yang menambah kode secara default tetapi IDE dapat menyesatkan Anda karena itu menunjukkan mode debug saat kode yang diterbitkan berada dalam mode rilis. Anda dapat melihat detail di foto di bawah ini: masukkan deskripsi gambar di sini

VSB
sumber
0

Periksa untuk melihat apakah Anda memiliki atribut Debuggable di file AssemblyInfo Anda. Jika ada, hapus dan buat kembali solusi Anda untuk melihat apakah variabel lokal tersedia.

Atribut debuggable saya disetel ke: DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints yang menurut artikel MSDN ini memberitahu kompiler JIT untuk menggunakan pengoptimalan. Saya menghapus baris ini dari file AssemblyInfo.cs saya dan variabel lokal tersedia.

Nick
sumber
0

Dalam Visual Studio 2017 atau 2015:

Pergi ke Solusi klik kanan pada solusi kemudian pilih Properties-> pilih semua Configuration-> Debug kemudian klik OK. Setelah itu Rebuild and Run, solusi ini bekerja untuk saya.

Kalyan
sumber
0

Saya memiliki masalah yang sama. Mencoba semua hal di atas dan mendapati bahwa saya juga harus menghapus semua yang ada di dalam {PROJECT_ROOT} \ bin \ Release \ netcoreapp2.2 dan {PROJECT_ROOT} \ obj \ Release \ netcoreapp2.2 untuk proyek saya. Yang pasti dirilis untuk penerbitan karena walaupun saya menggunakan alat penyebaran / bitbucket di Azure Web App saya, saya memang mencoba Build >> Publish >> Publish to Azure karena saya ingin memeriksa file mana yang sebenarnya digunakan.

ozzy432836
sumber
0

Punya masalah yang sama sebelumnya dengan aplikasi WPF dan semua solusi di sini TIDAK menyelesaikan masalah . Masalahnya adalah Modul sudah dioptimalkan sehingga solusi berikut JANGAN BEKERJA (atau tidak cukup untuk menyelesaikan masalah):

  • " Optimalkan KodeKotak centang " tidak dicentang
  • " Menekan optimisasi JIT pada muatan modul " dicentang
  • Konfigurasi solusi pada DEBUG

Modul ini masih dimuat Dioptimalkan. Lihat tangkapan layar berikut: Modul yang dioptimalkan


Untuk mengatasi masalah ini, Anda harus menghapus modul yang dioptimalkan. Untuk menemukan jalur modul yang dioptimalkan, Anda dapat menggunakan alat seperti Process Hacker .

Klik dua kali program Anda di " Panel proses " lalu di jendela baru buka tab " .NET Assemblies ". Kemudian di kolom " Jalur gambar asli " Anda menemukan semua jalur Modul yang dioptimalkan . Temukan yang Anda ingin de-optimalkan dan hapus folder (lihat screenshot di bawah): masukkan deskripsi gambar di sini (Saya mengaburkan nama perusahaan saya untuk alasan yang jelas)

Mulai ulang aplikasi Anda (dengan kotak centang pada langkah 1 dicentang dengan benar) dan itu akan berfungsi.

Catatan : File mungkin dikunci karena dibuka oleh proses lain, coba tutup Visual Studio. Jika file masih terkunci, Anda dapat menggunakan program seperti Lock Hunter

Ludovic Feltz
sumber