Visual Studio hata ayıklayıcısını kullanarak bir değer değiştiğinde kes


198

Değişken üzerine bir saat yerleştirmenin ve yalnızca bu değer değiştiğinde Visual Studio ara vermenin bir yolu var mı?

Zor devlet konularını bulmayı çok daha kolay hale getirir.

Bu yapılabilir mi?

Kesme noktası koşulları hala bir kesme noktası kümesine ihtiyaç duyar ve bir saat ayarlamayı ve Visual Studio'nun durum değişikliklerinde kesme noktalarını ayarlamasına izin vermeyi tercih ederim.


ancak kesme noktası, koşul devam etmedikçe hiçbir şeyi etkilemez, böylece kesme noktanızı (Setter gibi) herhangi bir yere koyabilir ve oradan alabilirsiniz. Yoksa bir şey mi kaçırıyorum?
Oskar

6
iyi. onun hata ayıklama vb6 yolu gibi. kesme noktası konumu umurumda değil. sadece pencereyi izlemek için koşullu bir ifade ekleyin ve vb6 koşulun karşılandığı her yerde kırılacağını garanti edecektir ..
Gulzar Nazim

üzgünüm, asla bir yol görmedim, bildiğim kadarıyla setter gitmek için bir yol
Oskar

1
daha iyi haberler bulmayı umuyordum; vs2010 değişiklik olmadığını gösterir msdn.microsoft.com/tr-tr/library/350dyxd0.aspx sadece yerli c ++ daha iyi yapabileceğiniz bu @Scottgu var!
gerryLowry

Yanıtlar:


134

Visual Studio 2005 menüsünde:

Hata ayıklama -> Yeni Kesme Noktası -> Yeni Veri Kesme Noktası

Giriş:

&myVariable

38
yönetilen kod için kullanılabilir mi? Bu seçeneği C # projesi için devre dışı bırakıldığını görüyorum. Bir yerde okumayı unutmayın, özellikle çöp toplayıcı ile yönetilen uygulamalarda hata ayıklamada uygulamak zor bir özelliktir.
Gulzar Nazim

27
Ne yazık ki sadece yönetilmeyen kod için kullanılabilir: msdn.microsoft.com/en-us/library/350dyxd0.aspx
Josh Kodroff

17
Ayrıca, bir alanı geçici olarak bir mülke dönüştürebilir ve alıcıya veya ayarlayıcıya bir kesme noktası koyabilirsiniz.
Jon Davis

12
"Hata Ayıkla -> Yeni Kesme Noktası" altındaki "Veri Kesme Noktası" seçeneği devre dışıdır. Ben gerçekten hata ayıklama olsun ya da olmasın devre dışı kalır. Visual Studio 2015 kullanıyorum.
jbb

2
Biraz geç ama @jbb benim için sadece hata ayıklama sırasında bir kırılma noktasında durdurulduğunda etkinleştirilir.
Allball103

27

Kodda açıkça kırmayı da seçebilirsiniz:

// Assuming C#
if (condition)
{
    System.Diagnostics.Debugger.Break();
}

MSDN'den:

Debugger.Break: Herhangi bir hata ayıklayıcı bağlı değilse, kullanıcılara bir hata ayıklayıcı eklemek isteyip istemedikleri sorulur. Evet ise, hata ayıklayıcı başlatılır. Bir hata ayıklayıcı eklenirse, hata ayıklayıcı bir kullanıcı kesme noktası olayıyla işaretlenir ve hata ayıklayıcı, bir hata ayıklayıcı kesme noktasına vurulmuş gibi işlemin yürütülmesini askıya alır.

Bu sadece bir geri dönüş. Diğer yorumlarda açıklandığı gibi Visual Studio'da koşullu bir kesme noktası ayarlamak daha iyi bir seçimdir.


2
FWIW, düzenleme ve devam ile Bunu şu şekilde yapmayı tercih ediyorum: IME, koşullu kesme noktaları sloooow
Mark Sowul

Bu işe yarıyor - ama çok acı verici - benzer bir şey yaptım - bunu şüphelendiğim her yöntemin üstüne koydum - ve yine altta (sonunda bir maddede) - tam olarak hangisini biliyordum yöntem soruna neden oluyordu - (yani, yönteme girmeden önce verilerin iyi ve sonra çıkmadan önce kötü olduğunu biliyordum).
BrainSlugs83

26

Gerçekten eski yazı ama birinin farkında olmaması durumunda ...

Gelen Visual Studio 2015 , sen bir breakpoint olabilir setBir Otomatik Uygulanan Mülkün erişimcisine ve ayıklayıcı özelliği güncellendiğinde kıracak

public bool IsUpdated
{
    get;
    set;    //set breakpoint on this line
}

Güncelleme

Alternatif olarak; @AbdulRaufMujahid, yorumlarda otomatik olarak uygulanan özellik tek bir satırdaysa, imlecinizi get;veya üzerinde konumlandırabileceğinizi set;ve isabet F9edeceğini ve buna göre bir kesme noktasının yerleştirileceğini belirtti. Güzel!

public bool IsUpdated { get; set; }

5
Otomatik uygulanmış özellik bir satırda olsa bile, ör. Public string UserName {set; almak; }. Kullanıcı alıcı veya ayarlayıcıyı vurgulayabilir ve kesme noktası eklemek için F9 tuşuna basabilir
Abdul Rauf

@AbdulRaufMujahid Harika!
Craig

13

Aşağıdaki deklarasyona sahip A adlı bir sınıfınız olduğunu düşünün.

class A  
{  
    public:  
        A();

    private:
        int m_value;
};

Birisi "m_değeri" değerini değiştirdiğinde programın durmasını istiyorsunuz.

Sınıf tanımına gidin ve A'nın yapıcısına bir kesme noktası koyun.

A::A()
{
    ... // set breakpoint here
}

Programı durdurduktan sonra:

Hata ayıklama -> Yeni Kesme Noktası -> Yeni Veri Kesme Noktası ...

Adres: & (this-> m_value)
Bayt Sayısı: 4 ( int'de 4 bayt olduğu için)

Şimdi programa devam edebiliriz. Değer değiştirildiğinde hata ayıklayıcı durur.

Aynısını kalıtsal sınıflar veya bileşik sınıflar için de yapabilirsiniz.

class B
{
   private:
       A m_a;
};

Adres: & (this-> m_a.m_value)

İncelemek istediğiniz değişkenin bayt sayısını bilmiyorsanız, sizeof işlecini kullanabilirsiniz.

Örneğin:

// to know the size of the word processor,  
// if you want to inspect a pointer.
int wordTam = sizeof (void* ); 

"Çağrı yığını" na bakarsanız, değişkenin değerini değiştiren fonksiyonu görebilirsiniz.


1
Peki, aradığım şey kendi sınıfımda değilse tam olarak ne yapardın? Örneğin, bir kontrolün tam olarak nerede etkinleştirildiğini veya devre dışı bırakıldığını bulmaya çalışıyorum? Hata ayıklama sırasında kontrolün Etkin değerine bir saat ekleyebilirim, ancak değişikliği değiştirmeyi ve sonra nerede durduğunu görmenin bir yolu yok.
Nyerguds

2
Harici bir kitaplıkta hata ayıklamaya çalışırsanız, hata ayıklama modunda derlenmiş kitaplığa ihtiyacınız olacaktır. Ben bileşen aşina değilim, ama belki bir "geri arama" özelliği bağlamak ve içine bir kesme noktası koyabilirsiniz. Açıkladığım formun bellek adresine ihtiyacı var, eğer bunu bilmenin bir yolu yoksa, diğer yöntemleri aramak için var.
momboco

9

Değişkeni bir özelliğe değiştirin ve set yöntemine bir kesme noktası ekleyin. Misal:

private bool m_Var = false;
protected bool var
{
    get { 
        return m_var;
    }

    set { 
        m_var = value;
    }
}

3

WPF kullanıyorsanız, harika bir araç var: WPF Inspector .
Kendini bir WPF uygulamasına ekler ve tüm özelliklerle birlikte tüm kontrol ağacını görüntüler, bu da (diğer şeylerin yanı sıra) herhangi bir özellik değişikliğini kırmanıza izin verir.

Ama ne yazık ki, HERHANGİ bir özellik veya değişkenle aynı şeyi yapmanıza izin verecek herhangi bir araç bulamadım.



2

Kesme noktasına sağ tıklamak benim için iyi çalışıyor (gerçi çoğunlukla belirli değişken değerlerde koşullu kesme noktaları için kullanıyorum. Bir iş parçacığı adı içeren ifadeleri kırmak bile, iş parçacığı sorunlarını tespit etmeye çalışıyorsanız çok yararlıdır).


2

Peter Mortensen'in yazdığı gibi:

Visual Studio 2005 menüsünde:

Hata ayıklama -> Yeni Kesme Noktası -> Yeni Veri Kesme Noktası

Şunu girin: & myVariable

Ek bilgi:

Açıkçası, sistem bellekte hangi adresi izleyeceğini bilmelidir. Bu nedenle - sistemi başlatmak myVariable(veya myClass.m_Variable) için normal bir kesme noktası ayarlayın - sistemi çalıştırın ve bu kesme noktasında durana kadar bekleyin. - Şimdi Menü girişi etkinleştirildi ve girerek değişkeni &myVariableveya girerek örneği izleyebilirsiniz &myClass.m_Variable. Şimdi adresler iyi tanımlanmış.

Zaten verilen bir çözümü açıklayarak işleri yanlış yaptığımda özür dilerim. Ama bir yorum ekleyemedim ve bununla ilgili bazı yorumlar var.


1

Yönetilmeyen kodda bir bellek izleme noktası kullanabilirsiniz. Bunların yönetilen kodda mevcut olup olmadığından emin değilim.


1

Muhtemelen DebugBreak () işlevini akıllıca kullanabilirsiniz .


Tam olarak nasıl? Sıkı bir döngüde ayrı bir iş parçacığı çalıştırarak ve bir değişiklikle karşılaşıldığında DebugBreak () öğesini çağırarak?
nalply

@nalpy Örneğin myVariablekullanılan yerleri izleyebilir ve kullandıktan sonra değerlerini yardımcı bir previousValuedeğişkende saklayabilir , ardından DebugBreak () öğesini myVariable!=previousValue; o zaman hangi kod bloklarının myVariabledeğiştiğini bilirsiniz . Ama AShelly'nin çözümünün en iyisi olduğuna katılıyorum.
çalışması devam ediyor

1

İsteğe bağlı olarak değişken için = operatörünü aşırı yükleyebilir ve kesme noktasını aşırı yüklenmiş fonksiyonun içine belirli bir koşulda koyabilirsiniz.


1

2019 yılında güncelleme:

Bu artık .Net Core 3.0 veya üstü için Visual Studio 2019 Önizleme 2'de resmi olarak desteklenmektedir. Elbette, IDE'nin Önizleme sürümünü kullanmanın potansiyel risklerine bazı düşünceler koymanız gerekebilir. Yakın gelecekte bunun resmi Visual Studio'ya dahil edileceğini hayal ediyorum.

https://blogs.msdn.microsoft.com/visualstudio/2019/02/12/break-when-value-changes-data-breakpoints-for-net-core-in-visual-studio-2019/

Neyse ki, veri kesme noktaları artık Visual Studio 2019 Önizleme 2'de .NET Core (3.0 veya üstü) için kullanılabilir oldukları için artık C ++ özel değil!

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.