Visual Studio'da hata ayıklama sırasında dönmeden önce dönüş değerini bulabilir miyim?


387

Aşağıdaki işlevi alın:

DataTable go() {
    return someTableAdapter.getSomeData();
}

Bu işlevde bir kesme noktası ayarladığımda, döndürülen değeri inceleme olanağı var mı? go()doğrudan bir .aspxsayfadaki veri ızgarasına bağlanır .

Döndürülen veri tablosunu incelemenin tek yolu geçici bir değişken kullanmaktır. Ancak, bu biraz rahatsız edici. Başka bir yol yok mu?


1
Arama yığınını geri taşırsanız saat ekleyebilirsiniz
Chris S

Bunu VB6'da yapabildin, hatırlıyorum. Ama o zamanlar fonksiyonların sözdizimi, işlevin değerini dönüş değerine ayarlamayı içeriyordu ...
Neil Barnwell

5
Visual C ++ kullanıcıları için yorum: Hemen Pencereye veya İzleme Penceresine $ ReturnValue yazın. En azından benim VS 2010 üzerinde çalıştı!
sergiol

9
VS2015 için $ ReturnValue1 kullanın .. aşağıdaki 20 cevap ve 100 yorum okumak istemiyorsanız!
felickz

3
Tüm bunların 2019 cevabı nedir? Bu cevaplar süper tarihli.
dylanh724

Yanıtlar:


264

Bildiğim kadarıyla hayır. Eğer varsa o Not yapmak bir değişken eklemek, bu sürümde derleyici tarafından kaldırılır alacak zaten kurar ...

Güncelleme: Bu işlev VS2013'e eklendi . Dönüş değerlerini otomatik pencerelerde görebilir veya $ReturnValueizleme / anlık pencerede kullanabilirsiniz.

Değer yalnızca işlevden döndükten sonra doğrudan görülebilir, bu nedenle ona erişmenin en kolay yolu işlev çağrısına bir kesme noktası koymak ve çağrının (F10) üzerine basmaktır.


VS2015 için güncelleme: boo! ne yazık ki, VS2015 (devenv v14)
VS2017 Güncellemesi'nde görünmüyor: geri döndü. (devenv v15)


12
Sıcaklıktan vazgeçmenin nedeni, verimlilik değil, okunabilirlik ve stil.
orip

8
VS 2010'dan beri IntelliTrace ile mümkündür: blogs.msdn.com/b/habibh/archive/2009/10/23/…
Daniel Hilgarth

2
Intellitrace sadece VS Ultimate Edition'da mevcuttur.
JMGH

3
@MarcGravell Yanıtınız yanlış ! Elbette, cevabınızla MS'nin VS13'te bu özelliği yayınlaması arasında altı yıl geçmesine rağmen yine de. Yalnızca "ilave etmişti olsaydın şimdilik bir reddi olarak" ... (Hayır, Geri zekalı değilim O. Olduğu elbette bir şaka Sen sizsiniz, tanrısal dostum..)
Konrad Viltersten

6
VS2015 için @MarcGravell: $ ReturnValue1 çalışıyor! (nihai sürümde test edilmiştir)
GY

58

Bu , müşteri geri bildirim sitesine göre Visual Studio 2013'te CLR 4.5.1 ile yapılabilir . C # için önceki sürümlerde mevcut değildi.

(Visual Studio 2008 ve önceki sürümleri VB.NET için destekledi. C / C ++ geliştiricileri tarafından her zaman kullanılabilir.)


1
Bunu Visual Studio 2010 C ++ ile nasıl yaparsınız?
Kullanıcı

Microsoft Connect, bu kodun güvenilir bir şekilde uygulanmasını engelleyen yönetilen kodla ilgili temel bir sorun olduğunu söylüyor:
Dan Solovay

@DanSolovay Kullandıkları kelimeler "sürekli doğru olanı yapamadık" (VS11 için) ama "bunu geri getirmek istiyorlar" ve "bu soruna bir dizi potansiyel çözüm arıyorlar".
Alex Angas

Bağlantı girişi eski. Özellik terk edilmiş gibi görünüyor: (((
Softlion

1
VS 2010'dan bu yana IntelliTrace ile mümkündür: blogs.msdn.com/b/habibh/archive/2009/10/23/…
Daniel Hilgarth

25

Bunun çok yararlı bir şey olduğuna katılıyorum: sadece çıkmadan önce yöntemin dönüş değerini görmek değil, aynı zamanda az önce atladığım yöntemlerin dönüş değerini de görmek. Visual Studio'nun " OzCode " adlı ticari uzantısının bir parçası olarak uyguladım .

Bununla birlikte, yöntem dönüş değerlerini doğrudan kod düzenleyicide bir çeşit HUD ekran olarak görüntüleyebilirsiniz:

İfade Görselleştirme

Daha fazla bilgi için lütfen bu videoyu izleyin .


23

Microsoft'a göre, bunu yönetilen kodla güvenilir bir şekilde uygulamanın hiçbir yolu yoktur. Bu, farkında oldukları ve üzerinde çalıştıkları bir sorundur:

Yerel C ++ veya VB6 kodunda hata ayıklama deneyimi olanlar için, Autos penceresinde fonksiyon dönüş değerlerinin sizin için sağlandığı bir özellik kullanmış olabilirsiniz. Ne yazık ki, yönetilen kod için bu işlev mevcut değildir. Geri dönüş değerlerini yerel bir değişkene atayarak bu soruna geçici çözüm bulabilirsiniz, ancak kodunuzu değiştirmeyi gerektirdiği için bu uygun değildir. Yönetilen kodda, aştığınız bir işlevin dönüş değerinin ne olduğunu belirlemek çok daha zordur. Burada doğru olanı tutarlı bir şekilde yapamayacağımızı fark ettik ve bu nedenle hata ayıklayıcıda yanlış sonuçlar vermek yerine özelliği kaldırdık. Bununla birlikte, bunu sizin için geri getirmek istiyoruz ve CLR ve Debugger ekiplerimiz bu soruna bir dizi potansiyel çözüm arıyor. Ne yazık ki bu Visual Studio 11'in bir parçası olmayacak.

https://connect.microsoft.com/VisualStudio/feedback/details/597933/add-a-return-pseudo-variable-to-the-visual-studio-debugger-for-net-code


1
Yukarıdaki @Alex başına ( stackoverflow.com/a/3714884/402949 ), bu CLR 4.5 ile VS2013 için kullanılabilir
Dan Solovay

21

Visual Studio 2015 ile ilgili:

Marc Gravell'in şu anda kabul edilen cevabına göre:

Bu işlevsellik Visual Studio 2013'e eklendi . Dönüş değerlerini otomatik pencerelerde görebilir veya izleme / anlık pencerede $ ReturnValue kullanabilirsiniz

Bu yanıt, bu işlevin Visual Studio 2015'te çalışmadığını da belirtti. Bu (tamamen) doğru değil. Açık yöntem aramaların dönüş değerlerini inceleyip aşağıdaki not vardır:

$ ReturnValue değerinin tanınabilmesi için eski ifade değerlendiricilerin açık olması gerekir (Araçlar / Seçenekler / Hata Ayıklama / Eski C # ve VB ifade değerlendiricileri kullanın ). Aksi takdirde, $ ReturnValue1 kullanabilirsiniz .

Bunu Visual Studio 2015 Enterprise'da test ettim:

  • Eski ifade değerlendiricileri kapalıyken: yalnızca $ ReturnValue1 çalışır
  • : Eski ifadesi değerlendiriciler açıkken hem $ DönüşDeğeri ve $ ReturnValue1 çalışmaları

3
Bu artık gerekli görünmüyor. VS 2015 Güncelleme 3'te eski değerlendiriciler devre dışı bırakıldı ve $ReturnValueçalışıyor. Ancak, Use managed compatibility modehata ayıklama seçeneğini etkinleştirdiyseniz dönüş değeri hiçbir yerde görünmez .
Nick

13

AraçlarSeçenekler , IntelliTrace menüsüne gidip olayları ve arama bilgilerini toplamak için ayarı değiştirin.

Önceki çağrı olayına ( Ctrl+ Shift+ F11) geri dönebilir ve otomatikler penceresinde yöntem çağrısından döndürülen geçici değeri, yöntem adının alt öğesi olarak görebilirsiniz.

Bu, içinde bulunduğunuz yöntemin dönüş değerini göstermez. Yalnızca geçerli yöntemde çağrılan son yöntemin dönüş değerini gösterir.

Yani,

DataTable go(){return someTableAdapter.getSomeData();}

size dönüş değerini gösterir someTableAdapter.getSomeData().

Ancak bunun için değil:

int go(){return 100 * 99;}

12

.NET öncesi günlerden gelen eski numara: Registers penceresini açın ve EAX kaydının değerine bakın. Bu, çağrılan son işlevin dönüş değerini içerir.


1
Metal yaklaşımına daha yakın olan eski okul için +1 - ancak bu, tüm dönüş değerleri için işe yaramayacaktır (ve JIT'er'e bağlıdır, açıkçası - EAX'ı kullanmayacağına hangi çılgın optimizasyonu bilebilir? ). İntegral tipler için (çoğunlukla?) Çalışacaktır. Büyük değer türleri farklı bir konudur (ve bazı blog gönderilerinden hatırladığım kadarıyla, bunlar da VS2013'te görüntülenmeyecektir).
JimmiTh

10

Shift-F11 kullanarak go () yönteminden çıkın ve sonra "Autos" hata ayıklama penceresinde, yığının yeni açıldığı yöntem çağrısının dönüş değerini (bu örnekte, go () yöntemi Ne istiyorsunuz). Visual Studio 2005'teki davranış budur; Visual Studio 2008'i kullanmadım, bu yüzden bu sürümde aynı şekilde davranıp davranmadığını bilmiyorum.


Bunu hem VS2005 hem de VS2008'de denedim, ama gerçekten görmüyorum. "Autos" penceresi açık, ama "git" işlevinde, autos-pencere sadece boş. Ayrıca işlevden çıkarken (işlevin kapanma süslü ayracı sarıdır). Bana bir ipucu daha verebilir misin?
doekman

Autos penceresinin go () işlevi İÇİNDE boş olmasını beklerdim. TAMAMEN fonksiyonun dışına çıkmanız gerekir (örneğin, hata ayıklama imleci CALLED go ()) fonksiyonunu göstermelidir ve sonra Autos penceresinde go () için dönüş değerini görmelisiniz.
LeopardSkinPillBoxHat

@LeopardSkinPillBoxHat: Ek ipucunuzla bile bunu çalıştıramazsınız. Visual Basic'te deniyor musunuz? Dönüş değerlerini gözlemlemek ve değiştirmek için daha iyi bir desteğe sahip gibi görünüyor ...
Roman Starkov

@romkyns - "Otomobiller" penceresinde sizin için ne görünür? Son olarak adlandırılan işlevin döndürdüğünü gösteren bir satır göstermiyor mu?
LeopardSkinPillBoxHat

2
@LeopardSkinPillBoxHat: hayır, bunu C # ile yapmaz. PS Wow, bunu tekrar görmem biraz zaman aldı.
Roman Starkov

7

Evet, çok güzel bir yol var. Önemli bir dezavantaj, 5, belki 6 yıl beklemeniz gerektiğidir. Kasım 2008'de yayınladığınızı gördüğüm için, size aaaaaa ...

... aaaait. Ve voilà! Sadece sizin için MS, hata ayıklama modunda çalışırken menülerden erişilebilen varsayılan bir özellik olan en son Visual Studio 2013'ü yayınladı ( Hata AyıklaWindowsAutos menüsü ).


@ Soru Çünkü soru Kasım 2008'de sorulmuştur ve cevabım Eylül 2014'te gelmiştir. Orijinal poster muhtemelen memnun ve krediyi taşımak istemiyor. Ama seninle aynı fikirdeyim - cevabımın üzerinde daha fazla inişli çıkış olmaz. Ben upsies ve rep kazanç seviyorum. :)
Konrad Viltersten

Bugün bu sorunu vardı. İlk sayı 2008 yılı olmasına rağmen 2014'te yanıtladığınız için teşekkür ederiz. Cevabınız aradığım şeydi.
AP

@AP Sorun yok. Bu yayını görmek için bir zaman makinesi gibi geliyor. Geçmişten patlama hehe.
Konrad Viltersten

5

Çok sayıda geçici çözüm var, ancak hiçbiri tatmin edici görünmüyor.

Aşağıdaki John Skeet'i alıntılamak için (şimdi silinmiş bir cevaba yorum yapın):

Yine de bana rahatsız edici görünüyor - özellikle hata ayıklamaya başlamadan önce hangi dönüş değerine ihtiyacınız olacağını bilmiyorsanız. Gerçekten bir şey her döndüğümde kodumu darmadağın geçici bir değişken olması gerekmez. T

Teorik olarak, hata ayıklayıcı returndeğişken olabilir . Sonuçta: yığın üzerinde sadece bir değişken:

unsafe {
  int * sp = stackalloc int[1];
  try {
    return a+b;
  }
  finally {
    Trace.WriteLine("return is " + *(sp+3));
  }
}

Bu nedenle, Visual Studio için bir özellik isteği olarak düşünün.


bir değişken (iyi tanımlanmış bir yerel) ile yığındaki bir değer arasında oldukça büyük bir fark vardır. Yığında bir değerdir, ancak bir değişken değildir (= local).
Marc Gravell

@Marc: CLR'nin nasıl çalıştığından emin değilim, ancak birçok derleyici yığın işaretçisinin (sp) altındaki yığına ve yığıntaki yığın işaretçisinin üzerindeki yerel değişkenlere işlev bağımsız değişkenleri koydu. Sadece göstermeye çalıştığım şey bu. Ve Tamam, dönüş değeri bir referans türü olduğunda, sadece bir işaretçi değeri alırsınız.
doekman

1
Mutlaka yığın üzerinde olması gerekmez. Aslında, Debug -> Kayıtlarını görüntülüyorsanız EAX
Mark Sowul 18:11

5

Visual Studio 2015'te çalışmasını sağlamak için PascalK'ın cevabını genişletmek istedim , çünkü yöntem çağrılarının dönüş değerlerini inceleyin bölümünde belgelenmeyen gizli bir özellik var .

İç içe geçmiş işlev çağrılarınız varsa, sözde değişkenler $ResultValueXotomatik olarak oluşturulur; burada X, işlev çağırma sırasını gösterir. Bu tür bir çağrınız varsa Multiply(Five(), Six()), aşağıdaki sözde değişkenler oluşturulur:

Five()     | $ResultValue1 = 5
Six()      | $ResultValue2 = 6
Multiply() | $ResultValue3 = 30

2

Microsoft Visual C ++ bunu yapıyordu, ancak Visual Studio AFAIK yapmıyor .. :(


2

Bildiğim tek yol, dönüş çizgisine bir kesme noktası yerleştirip Hızlı İzleme penceresini çağırıp döndürülen ifadeyi girmektir:

someTableAdapter.getSomeData();

Ancak bu yalnızca çağrı herhangi bir nesnenin durumunu değiştirmezse çalışır (çünkü yürütmeyi sürdürdüğünüzde aynı yönteme ikinci bir çağrı olacaktır).


5
Bu yalnızca ifadenizde lambda yoksa işe yarar.
Roman Starkov

1

Ayrıca, bayrakları veya diğer değişkenleri ayarlamaz, ancak yalnızca bir şey döndürürse, ara pencerede de değeri değerlendirmeyi isteyebilirsiniz.


Anında pencereyi çok
Chris S

1

Kayıtlar penceresindeki (Debug / Windows / Registers) RAX kaydına bakarak bunu belirleyebileceğinizi düşünüyorum. İşlevden çıktıktan sonra (SHIFT + F11), RAX kaydını kontrol edin. Bir gerçek için bilmiyorum, ama bir kez bir kayıt (.NET gün öncesi) kontrol ve orada dönüş değerini görebilirsiniz. RAX ve RBX, vb. Kombinasyonu da olabilir.


1

Hata Ayıkla → Otomobiller penceresini açmak sizi kapatır. Gerçek dönüş değerini göstermez, ancak dönüş ifadesinde nelerin değerlendirildiğini gösterir.


2
Böyle bir şey göstermek için VS2008 otomobil penceresi alınamadı. Lütfen açıklığa kavuşturabilir misiniz?
Roman Starkov

return x + y; Demek istediğim, bu satırda bir kesme noktası ayarlarsanız, Debug-Autos pencereniz x ve y için geçerli değerleri görüntüler. Dediğim gibi, sadece seni yaklaştırıyor. sadece yardımcı olmaya çalışıyorum. Bunun bir iniş hakkını hak ettiğini düşünmüyorum.
GeekyMonkey

1

Evet, VB.NET'e geçerek. ; P (Sadece "Visual Studio" dedin.)

Hatırlayabildiğim sürece (Visual Basic'ten VB.NET'in tüm sürümlerine kadar), işlev adını sorgulayabilirsiniz. Fonksiyonun başlangıcında dolaylı olarak bildirilen bir yerel değişken gibi "işlev görür" ve bunun geçerli değeri, fonksiyon geri dönüşsüz ifade aracıyla (yani Exit Functionveya sadece düştüğünde) ve elbette, return ifadesi kullanılır.

Ayrıca return ifadesinin ifadesine ayarlanır. Tıpkı yerel bir değişken gibi, değeri fonksiyonun içindeki herhangi bir yürütme noktasında denetlenebilir (return deyimi yürütüldükten sonra dahil). C # buna sahip değildir ve olmalıdır.

(Artı O küçük VB.NET özelliği Exit Functiononu sağlayan deyim - diğer özellik C # var ve gerektiği değil) bir formda çok yararlıdır defansif programlama Ben her zaman olduğu gibi başarısızlık / varsayılan değere işlev adı başlatmak nerede uygulamada ilk ifade. Daha sonra, herhangi bir başarısızlık noktasında (normalde başarı noktalarından çok daha sık görülür), sadece Exit Functionifadeyi çağırabilirim (yani hata / varsayılan ifadeyi veya sabit / değişken adını çoğaltmak zorunda kalmadan).


1

Kabul edilen yanıt Visual Studio 2015 ile düzgün çalışmıyor, ancak yöntemin son satırına bir kesme noktası yerleştirip düğmesine basarak F10, dönüş değerinin tüm ifadelerini yerel pencereye koyacaktır.


Muhtemelen, yorumlarınızı dahil etmek için kabul edilen yanıtı düzenleyebilirsiniz.
doekman

0

Seçmeyi deneyebilir "someTableAdapter.getSomeData();", sağ tıklayabilir ve Hızlı İzleme'ye gidebilirsiniz .


-1

Dönüş ifadesini bir izleme penceresine sürükleyip bırakın.

Örneğin, açıklamada

return someTableAdapter.getSomeData();

sürükle ve bırak

someTableAdapter.getSomeData()

bir izleme penceresine girdiğinizde değeri görürsünüz.

Bunu herhangi bir ifade için yapabilirsiniz.


2
Bununla ilgili sorun: ifade iki kez değerlendirilir.
doekman

6
Watch ifadeleri, oldukça az kullandığım lambda ifadeleri içeremez.
Steve Crane
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.