Bu talimat işaretçisinde bulunmadığından, büyük olasılıkla optimize edilmiş olduğundan yerel veya bağımsız değişken değeri alınamıyor


211

Visual Studio 2010, güvenli olmayan bloktaki işlevin bağımsız değişkenlerinden birinde verileri (başka sözcük yok) öldürür. Bu hataya ne sebep olabilir? Aşağıdaki mesaj hata ayıklayıcı tarafından gösterilir.

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

2
Ben tam olarak aynı sorunu var ve Debug build kullanıyorum. 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
39'da javapowered

19
Hata! Sadece yanlışlıkla seçilmiş sürüm vardı ..
Daniel Little

VS 2017'de bu sorunu yaşıyorum ve aşağıdaki yayınlardaki tüm talimatları izledim. Başka seçenek var mı?
Matt W

Menü Oluşturma -> Yapılandırma Yöneticisi'ni unutmayın. Konfigürasyonun orada Hata Ayıkla olarak ayarlanması gerekiyor, ancak yine de sorunu alıyorsunuz.
Bob Clegg

Yanıtlar:


344

Proje Özellikleri'ne gidin ve Oluştur altında "Kodu En İyileştir" onay kutusunun işaretli olmadığından emin olun.

Ayrıca, Gelişmiş Seçenekler'de (Yapı sekmesi altında) "Hata Ayıklama Bilgisi" açılır menüsünü "Tam" olarak ayarlayın.


128
İlk olarak, Yapılandırma Yapılandırmasının Sürüm değil Hata Ayıklama olduğunu kontrol edin.
ApceH Hipokrit

Bu arada, Release modunda test etmek isterseniz "Debugger.Launch ();" kodda
Jason

Her iki adımı da yaptı ve yapılandırmayı "Release" den "Build" olarak değiştirdi. Visual Studio 2017 Topluluk Sürümü'nde çalıştı.
Neo

1
VS 2017'niz varsa, hem kabul edilen cevap hem de xyq.384.b'nin yanıtı yardımcı olacaktır. Benim için xyq.384.b cevap işaretçi bastırıyor JIT hata ayıklayıcı olduğu gibi düzeltme oldu ... Üzgünüm JIT "optimize" o ...
BillRuhl

Hata ayıklama yapılandırmasına geçtikten sonra, kod optimizasyon kutusunun zaten işaretli olmadığını keşfettim. Alınan ders: Sürüm yapılandırma modunda hata ayıklama.
eliteproxy

135

Ayrıca VS 2015 Topluluk Sürümünde

Hata Ayıkla-> Seçenekler veya Araçlar-> Seçenekler'e gidin

ve hata ayıklama-> Genel-> modül yükünde JIT optimizasyonunu bastırın (sadece yönetilir)


7
Bu, yukarıda belirtilen tüm çözümleri uyguladıktan sonra sorunumu çözdü.
masih

1
Önerilen cevapların hiçbiri benim için işe yaramıyor. Değişkenlerim hala optimize edildi ...
Sushi271

Bunun neden birdenbire olmaya başladığı hakkında bir fikrim yok .. ama bu düzeltildi
Murphybro2

Kutsal saçmalık, bu da VS2017 Topluluğunda benim için düzeltti! Bu seçeneğin ne zaman veya nasıl seçili olmadığına dair hiçbir fikrim yok ...
Ian Kemp

Şampiyon gibi çalışır!
BillRuhl

59

Etkinleştirmeler etkinleştirildiğinde derlerseniz, birçok değişken kaldırılır; Örneğin:

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

burada yerel değişken valuetipik olarak kaldırılır ve değer yığını üzerinde kalır - sanki yazmışsınız gibi:

DoSomething(GetValue());

Ayrıca, bir dönüş değeri hiç kullanılmazsa, "pop" ile bırakılacaktır (yerel olarak "stloc" ile depolanmak yerine tekrar ve yerel olmayacaktır).

Bu nedenle, böyle bir yapı içinde ayıklayıcı geçerli değerini alamayan valueçünkü o yok - yalnızca arasındaki kısa anlığına varGetValue() ve DoSomething(...).

Yani; hata ayıklamak istiyorsanız ... sürüm derleme kullanmayın! veya en azından hata ayıklama sırasında optimizasyonları devre dışı bırakın.


4
Cevabınız için teşekkür ederiz - ancak projemdeki Kod özelliğini optimize et seçeneğini işaretliyorum ve seçili değil = (
merak

4
@Marc - Ne dediğini anlıyorum, ancak kendi bok adımlarını kodlamak için microsoft'un referans kaynak kitaplıklarını kullanıyorum. Şu anda yöntemlerden geçiyorum, ancak Yerliler'in değerlerinden hiçbirini izleyemiyorum. O zaman .Net kaynağında hata ayıklamanın anlamı nedir? Baska öneri? stackoverflow.com/questions/13147132/…
one.beat.consumer

@ One.beat.consumer ile aynı şeyi yapıyor gibi görünüyorum: ASP.NET çerçevesinin neden çalışmadığını anlamak için Microsoft genel sembolleri aracılığıyla adım atmaya çalışıyorum. Benim durumumda, MVC 3 model bağlama ...
bambams

@ one.beat.consumer microsoft referanslarının optimizasyon etkinken derlendiği için varsayıyorum, bu yüzden projelerinizi optimizasyonlarla derlemiş olduğunuz gibi, değerler arasında adım atmak için kaynak kodunu indirebilseniz bile sağladı. Projeye (dll) özgüdür - MS referanslarının "hata ayıklama" sürümlerini alabiliyorsanız değerleri görebilirsiniz. MS dll ana projeniz başvurulan başka bir proje tarafından başvurulduysa, "alt başvuru" diğer projenin ayarları eşleşebilir unutmayın.
drzaus


20

Ben sadece bu koştu ve Releaseyapı yapılandırma yerine yapı yapılandırma altında çalışıyordu Debug. Bir kez saatimde tekrar Debuggösterilen değişkenime döndüm .



8

Aynı sorunla karşılaştığımda, yeniden inşa etmeden önce çözümümü temizlemek zorunda kaldım. Bu benim için halletti.


6

"Kodu optimize et" özelliğinin henüz KONTROL EDİLMEMİŞ sorunuyla ilgili olarak kod hala optimize edilmiş olarak derleniyor: Sonunda her şeyi denedikten sonra bana yardımcı olan şey, aynı ayarlar sayfasındaki (Proje özellikleri - Hata Ayıklama) "Yönetilmeyen kod hata ayıklamasını etkinleştir" onay kutusunu işaretlemektir. Doğrudan kod optimizasyonu ile ilgili değildir, ancak bu etkinleştirildiğinde VS artık kütüphanemi optimize etmez ve hata ayıklayabilirim.


1
İkinci öneri, tekrar çalışmasını sağladı teşekkür ederim!
CodeMilian

1
VS 2015'te görmüyorum Enable unmanaged code debugging. Var Enable native code debugging, bunu kontrol etmeyi denedim ama hiçbir fark yaratmadı.
Al Lelopath

1
VS 2015'te, Web, Hata Ayıklayıcıları proje derlemesinde Etkinleştir "Yerel kodu" işaretledim ve hepsi çalıştı.
Mouffette

6

Ben aynı sorunu ile karşı karşıya kaldılar ve benim için çözüm değişimdir Solution Configurationgelen Releaseetmek Debug. Umarım yardımcı olur


4

Benim durumumda, bir web api projesi üzerinde çalışıyordum ve proje tam hata ayıklamaya doğru ayarlanmış olsa da, IIS işlemine her eklediğimde hata ayıklamaya çalıştığımda hala bu hatayı görüyordum. Sonra yayınlama profilinin Release konfigürasyonunu kullanacak şekilde ayarlandığını fark ettim. Dotnet web api projenizin 'Yayınla' özelliğini kullanıyorsanız, kontrol etmeniz gereken bir yer de yayınlama profilinizdir.


3

Bir proje çalıştırırken ve bir IIS işlemine ekleyerek hata ayıklarken aynı sorunu yaşadım. Ayrıca optimizasyonlar kapalıyken Hata Ayıklama modunda çalışıyordum. Kodun iyi derlendiğini düşünürken, ayırdığımda ve derlemeye çalıştığımda, referanslardan biri bulunamadı. Bu, burada değişiklikler yapan ve referansın konumunu değiştiren başka bir geliştiriciden kaynaklanıyordu. Referans uyarı sembolü ile gelmedi, bu yüzden derleme yapana kadar her şeyin yolunda olduğunu düşündüm. Referansı düzelttikten ve tekrar çalıştıktan sonra çalıştı.


1

Bir Azure web sitelerinin web uygulamasında hata ayıklarken bu sorunu yaşayanlar için ek bir yanıt olarak:

Örneğin GitHub'dan dağıtım yaparken, kod optimize edilmiş Azure sunucusunda derlenir varsayılan olarak .

Ben ayarlayarak debuggable şekilde derlemek için sunucu söyle SCM_BUILD_ARGSiçin/p:Configuration=Debug

ama daha fazla seçenek var. Şuna bakın: 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'de:

Proje özelliklerine gidin -> Hata Ayıkla -> "Visual Studio barındırma işlemini etkinleştir" seçeneğinin işaretini kaldırın


1

Web uygulamaları için önemli olan başka bir sorun vardır ve uygulama yayınlama işlemi sırasında doğru yapılandırmayı seçmektir.

Uygulamanızı hata ayıklama modunda oluşturabilirsiniz, ancak varsayılan olarak kodu atlayan yayınlama modunda yayınlayabilirsiniz, ancak yayınlanan kod yayınlama modundayken hata ayıklama modunu gösterdiğinden IDE sizi yanıltabilir. Ayrıntıları aşağıdaki anlık görüntüde görebilirsiniz: resim açıklamasını buraya girin


0

AssemblyInfo dosyanızda bir Hata Ayıklama özniteliğine sahip olup olmadığınızı kontrol edin. Varsa, yerel değişkenlerin kullanılabilir olup olmadığını görmek için onu kaldırın ve çözümünüzü yeniden oluşturun.

Hata ayıklanabilir özniteliğim şu şekilde ayarlandı: DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints, bu MSDN makalesine göre JIT derleyicisine optimizasyonları kullanmasını söyler. Bu satırı AssemblyInfo.cs dosyasından kaldırdım ve yerel değişkenler mevcuttu.


0

Visual Studio 2017 veya 2015'te:

Çözüme sağ tıklayın, ardından özüm seçin- Özellikler-> tüm Yapılandırmayı seçin-> Hata Ayıkla'yı ve ardından Tamam'ı tıklayın. Bundan sonra Yeniden Oluştur ve Çalıştır, bu çözüm benim için çalıştı.


0

Aynı sorunu yaşadım. Yukarıdakilerin tümünü denedim ve projem için {PROJECT_ROOT} \ bin \ Release \ netcoreapp2.2 ve {PROJECT_ROOT} \ obj \ Release \ netcoreapp2.2 içindeki her şeyi silmem gerektiğini buldum. Kesinlikle yayınlama ile ilgili çünkü Azure Web Uygulamamda Dağıtım araçlarını / bitbucket'i kullanmamıza rağmen, hangi dosyaların gerçekten dağıtıldığını incelemek istediğim için Build >> Publish >> Azure'da Yayınla'yı denedim.


0

Daha önce bir WPF uygulaması ile aynı sorunu vardı ve burada tüm çözümler sorunu çözmedi . Sorun, Modülün zaten optimize edilmiş olmasıydı, böylece aşağıdaki çözümler ÇALIŞMADI (veya sorunu çözmek için yeterli değil):

  • " Kodu Optimize Edin " onay kutusunun işareti kaldırıldı
  • " Modül yükünde JIT optimizasyonunu bastır " işaretli
  • DEBUG üzerinde çözüm yapılandırması

Modül hala yüklü Optimize edilmiş. Aşağıdaki ekran görüntüsüne bakın: Optimize edilmiş modül


Bu sorunu çözmek için optimize edilmiş modülü silmelisiniz. Optimize edilmiş modül yolunu bulmak için Process Hacker gibi bir araç kullanabilirsiniz .

" İşlem panelinde " programınıza çift tıklayın, ardından yeni pencerede " .NET Assemblies " sekmesini açın . Sonra " Yerel görüntü yolu " sütununda tüm Optimize edilmiş modül yollarını bulabilirsiniz . Optimize etmek istediğiniz klasörü bulun ve silin (aşağıdaki ekran görüntüsüne bakın): resim açıklamasını buraya girin (Açık nedenlerle şirket adımı bulanıklaştırdım)

Uygulamanızı yeniden başlatın (1. adımdaki onay kutusu doğru şekilde işaretlenmişse) ve çalışması gerekir.

Not : Dosya başka bir işlem tarafından açıldığı için kilitlenmiş olabilir , Visual Studio'yu kapatmayı deneyin. Dosya hala kilitliyse Lock Hunter gibi bir program kullanabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.