Aracılığıyla paylaş


Belirsiz kesme noktası çözümlemesi

Hata ayıklayıcı altyapısının 10.0.25310.1001 ve sonraki sürümlerinde artık belirsiz kesme noktası çözümlemesi desteklenmektedir.

Belirsiz kesme noktaları, hata ayıklayıcının bir kesme noktası ifadesinin birden çok konuma çözümlendiği belirli senaryolarda kesme noktaları ayarlamasına olanak sağlar. Örneğin, bu durum şu durumlarda oluşabilir:

  • Bir işlevin birden çok aşırı yüklemesi.
  • Kesme noktası ifadesiyle eşleşen birden çok simge vardır.
  • Aynı simge adı birden çok konum için kullanılır.
  • Simgeler satır içine alınmış.
  • Kaynak pencerede birden çok örnekleme içeren bir şablon işlevinde kesme noktası ayarlama.

Etkinleştirildiğinde, hata ayıklayıcı belirli bir kesme noktası ifadesi için her sembol eşleşmesinde bir kesme noktası ayarlar. Hata ayıklayıcı, belirli ölçütlere uyulsa sembol eşleşmelerini de filtreleyecektir.

Kesme noktalarını kullanma hakkında genel bilgi için bkz. Kesme Noktalarını Kullanma.

Belirsiz kesme noktası çözümlemesini etkinleştirme

Varsayılan olarak, belirsiz kesme noktaları devre dışı bırakılır. Bunu bir hata ayıklayıcı oturumunda etkinleştirmek için WinDbg konsolunda şu komutu çalıştırın:

dx @$debuggerRootNamespace.Debugger.Settings.EngineInitialization.ResolveAmbiguousBreakpoints = true;

Belirsiz kesme noktaları ayarının etkin olduğunu onaylamak için:

0:010> dx @$debuggerRootNamespace.Debugger.Settings.EngineInitialization.ResolveAmbiguousBreakpoints
@$debuggerRootNamespace.Debugger.Settings.EngineInitialization.ResolveAmbiguousBreakpoints                 : true

dx komutunu kullanma hakkında daha fazla bilgi için bkz. dx (Debugger Nesne Modeli İfadesini Görüntüle).

Özelliği devre dışı bırakmak için yukarıdaki değeri olarak falseayarlayın. Ayarın oturumlar arasında kalıcı olduğundan emin olmak için seçeneğine tıklayıp File -> Settings -> Debugger Settings işaretli Persist engine settings across debugger sessionskutuyu işaretlediğinden emin olun.

Kullanım tekil kesme noktası için geçerlidir.

Belirsiz kesme noktası ifadelerini çözümlemek yalnızca hata ayıklayıcıda tek bir kesme noktası ayarlamak için kesme noktası komutunu çalıştırmak için geçerlidir. Başka bir deyişle, bm komutuyla birden çok kesme noktası ayarlamak her zamanki gibi çalışmaya devam eder. Bu özelliğin etkin olduğu durumda komut çalıştırıldığında, tekil kesme noktaları için yeni bir kesme noktası davranışı ortaya çıkar.

Kesme noktası komutları hakkında genel bilgi için bkz. bp, bu, bm (Kesme Noktasını Ayarla).

Hiyerarşik kesme noktaları

Hiyerarşik kesme noktaları, belirsiz bir kesme noktası ifadesini birden çok kesme noktasına çözümlemenin sonucunu temsil eder. Bir ifade kesme noktası ayarlamak için kullanılacak iki veya daha fazla eşleşmeyle sonuçlanırsa, kesme noktası kümesini denetleyecek başka bir kesme noktası oluşturulur. Hiyerarşik kesme noktası olan bu ileri gelen kesme noktası, normal bir kesme noktası gibi etkinleştirilebilir, devre dışı bırakılabilir, temizlenebilir ve listelenebilir. Aynı zamanda, sahip olduğu kesme noktalarında da aynı işlemleri gerçekleştirme yeteneği bulunur.

Örneğin, komutu bp foo!bar çalıştırılırsa ve simgesiyle bariki eşleşme elde edilirse, iki eşleşmeyi denetleyecek hiyerarşik bir kesme noktası oluşturulur. Hiyerarşi etkinleştirildiğinde/devre dışı bırakıldığında/temizlendiğinde, eşleşen kesme noktaları da aynı şekilde etkilenecektir.

.bpcmds(Kesme Noktası Komutlarını Görüntüle), her kesme noktasını ayarlamak için kullanılabilecek kesme noktası komutunu listeler. Hiyerarşik bir ara noktasına ait olan ara noktalar, adresinde bir ara noktası belirleyecek geçerli bir bp komutunu listelemeye devam eder. Hiyerarşik kesme noktaları da çıkışta listelenir ve tek bir kesme noktası yerine tüm kesme noktaları kümesini yeniden oluşturmak için kullanılabilecek komutu görüntüler.

Belirsiz simgeler

Simge adında kesme noktası ayarlamak, simge şu şekildeyse aşağıdaki davranışa neden olmalıdır:

  • Aşırı yükleme: Sembolle eşleşen her aşırı yüklemenin bir kesme noktası olmalıdır.

  • Şablon işlevi:

    • İfadede belirtilen tüm şablon parametreleri varsa (örneğin bp foo!bar<int>), şablon işlevinin belirli uygulamasında bir kesme noktası ayarlanır.

    • İfadede belirtilen bir tür uygulaması yoksa (örneğin bp foo!bar), kesme noktaları ayarlanamaz. Bu durumda, bm şablon işlevinde kesme noktaları ayarlamak için kullanılmalıdır.

    • Kısmi şablon belirtimleri hata ayıklayıcı tarafından desteklenmez ve bu durumda hiçbir kesme noktası ayarlanmaz.

  • Satır içi işlev: Her satır içi konumun bir kesme noktası vardır

Simge ifadesi hata ayıklayıcı tarafından daha fazla değerlendirme gerektiren işleçler veya uzaklıklar içerdiğinde birden çok kesme noktasının ayarlanmadığını unutmayın. Örneğin, simge foo birden çok konuma çözümlenirse ancak ifade foo+5 değerlendirilirse hata ayıklayıcı, ayarlanacak kesme noktaları için tüm konumları çözümlemeye çalışmaz.

Kesme noktası kodu örnekleri

Aşağıdaki kod parçacığı göz önünde bulundurulduğunda:

class BikeCatalog
{
public:
    void GetNumberOfBikes()
    {
        std::cout << "There are 42 bikes." << std::endl;
    }
    int GetNumberOfBikes(int num)
    {
        std::cout << "There are " << num << " bikes." << std::endl;
        return num;
    }
}; 

Komutun bu BikeCatalog::GetNumberOfBikes çağrılması, her aşırı yükleme için bir tane olmak üzere iki kesme noktası oluşturulmasına neden olur. Kesme noktalarının listelenmesi aşağıdaki çıkışa neden olur:

0:000> bl
     2 e Disable Clear  <hierarchical breakpoint>     0001 (0001)  0:**** {BikeCatalog!BikeCatalog::GetNumberOfBikes}
         0 e Disable Clear  00007ff6`c6f52200  [C:\BikeCatalog\BikeCatalog.cpp @ 13]     0001 (0001)  0:**** BikeCatalog!BikeCatalog::GetNumberOfBikes
         1 e Disable Clear  00007ff6`c6f522a0  [C:\BikeCatalog\BikeCatalog.cpp @ 9]     0001 (0001)  0:**** BikeCatalog!BikeCatalog::GetNumberOfBikes

Belirsiz kaynak satırları

Kaynak satırında kesme noktası ayarlamak, kaynak satırda gerçekleşmesi gereken aşağıdaki davranış ile karşılaşılmalıdır:

  • Derleyici için iyileştirilmiş bir işlev: Derleyici iyileştirmeleri nedeniyle satır birden çok konuma bölünürse, belirtilen satıra karşılık gelen işlev içinde en düşük konumda bir kesme noktası ayarlanır.
  • Satır içi işlev: Belirtilen satır, satır içi bir parçası olarak optimizasyon sırasında kaldırılmadığı sürece, çağrı noktalarının her biri için bir kesme noktası ayarlanır.
  • Birden çok konuma çözümlendi: Yukarıdaki koşullar karşılanmazsa, her adres için aşağıdaki koşullara sahip bir kesme noktası ayarlanır:
    • İfadedeki kaynak satırla eşleşen bir N adres kümesi varsa ve bu N adreslerinin içerisinde, ifadedeki kaynak satırdan sıfır kaynak satır yer değiştirmesine sahip bir M alt kümesi bulunuyorsa, yalnızca M adresleri kesme noktalarına sahip olur.
    • N adresleri kümesinde ifadedeki kaynak satırdan sıfır kaynak satırı yer değiştirmesi olan hiçbir adres yoksa, tüm N adresleri kesme noktalarına sahip olur.

Sembol dizinine göre filtreleme

Her simgenin benzersiz bir simge dizini olmalıdır. Simgelerin yapısı hakkında ayrıntılı bilgi için bkz. SYMBOL_INFO yapısı.

Hata ayıklayıcı, sıfır kaynak satır yer değiştirmesi olan birden çok adres durumunda yinelenen eşleşmelerin filtrelenmiş olduğundan emin olmak için sembol dizinini kullanır.

Şablon ve aşırı yüklenmiş işlevlere örnekler

Şablon işlevleri

Şablon işlevinin tanımı için kaynak satırda kesme noktası ayarlamak, şablon işlevinin her uygulaması için bir kesme noktası oluşturur. BikeCatalog.cpp konumundaki 19. satırdaki aşağıdaki şablon işlevi dikkate alındığında:

template <class T>
void RegisterBike(T id)
{
    std::cout << "Registered bike " << id << std::endl;
}

Ve kullanımları:

catalog.RegisterBike("gravel bike");
catalog.RegisterBike(1234);

Eğer komut bp `BikeCatalog.cpp:19` çağrılırsa, dosyada daha sonra kullanılan şablon işlevinin uygulamalarını belirleyecek iki durdurma noktası ayarlanır. Bunun yerine kullanıcının işlev üzerinde tek bir kesme noktası ayarlamak istemesi durumunda, şablon işlevinin uygulamasının belirli kaynak satırında bir kesme noktası ayarlaması veya şablon işlevinin simgesinde uygun tür bilgileriyle (örn. bp BikeCatalog::RegisterBike<int>) bir kesme noktası ayarlaması gerekir.

Kesme noktalarının listelenmesi aşağıdaki çıkışla sonuç döndürür:

0:000> bl
     2 e Disable Clear  <hierarchical breakpoint>     0001 (0001)  0:**** {BikeCatalog!BikeCatalog::RegisterBike&lt;int&gt;}
         0 e Disable Clear  00007ff7`6b691dd0  [C:\BikeCatalog\BikeCatalog.cpp @ 20]     0001 (0001)  0:**** BikeCatalog!BikeCatalog::RegisterBike<int>
         1 e Disable Clear  00007ff7`6b691e60  [C:\BikeCatalog\BikeCatalog.cpp @ 20]     0001 (0001)  0:**** BikeCatalog!BikeCatalog::RegisterBike<char const *>

Aşırı yüklenmiş işlevler

Aşırı yüklenmiş bir işlevin tanımı için kaynak satırda kesme noktası ayarlamak, aşırı yüklenmiş işlevin tanımında yalnızca bir kesme noktasıyla sonuçlanır. Yukarıdaki kod parçacığı, ilk satır 5. satırdan başlayarak yeniden kullanılsın:

class BikeCatalog
{
public:
    void GetNumberOfBikes()
    {
        std::cout << "There are 42 bikes." << std::endl;
    }
    int GetNumberOfBikes(int num)
    {
        std::cout << "There are " << num << " bikes." << std::endl;
        return num;
    }
}; 

Komut bp `BikeCatalog.cpp:9` çağrıldığında, GetNumberOfBikes satırındaki void uygulaması için tek bir kesme noktası ayarlayacaktır. Kesme noktalarının listelenmesi aşağıdaki çıkışla sonuç döndürür:

0:000> bl
     0 e Disable Clear  00007ff7`6b691ec0  [C:\BikeCatalog\BikeCatalog.cpp @ 9]     0001 (0001)  0:**** BikeCatalog!BikeCatalog::GetNumberOfBikes

satır içi fonksiyonlar

Bir satır içi işlevin çağrı sitesi için kaynak satırda kesme noktası ayarlamak, aynı işlevde başka bir çağrı sitesi olsa bile söz konusu çağrı sitesinde yalnızca bir kesme noktasıyla sonuçlanır.

Birden çok hiyerarşik kesme noktası

Hiyerarşik kesme noktaları, aşağıdakiler dışında kendi kümesindeki her kesme noktasına sahip olur:

Kümesindeki bir kesme noktası kaldırıldı

  • Hiyerarşik kesme noktası temizlendi.
  • Başka bir hiyerarşik kesme noktası oluşturulur ve bu, mevcut hiyerarşik kesme noktasının kümesinde bir kesme noktası içerir.

Bunu düşünmenin başka bir yolu, kesme noktalarının yalnızca bir hiyerarşik kesme noktası sahibi olması ve en son kesme noktası komutunun kesme noktası listesinin durumunu belirlemesidir.

Ayrıca, hiyerarşik kesme noktası başka bir hiyerarşik kesme noktasına sahip olamaz.

Önceden var olan kesme noktalarının dahil edilmesi

Bir kesme noktası A kendi başına varsa ve sonra A,B kesme noktaları oluşturmak için belirsiz bir kesme noktası ifadesi çözümlenirse, A yeni kesme noktası kümesine B ile eklenir.

Hiyerarşik kırılma noktası kümelerinin kesişimlerini kapsama

Hiyerarşik kesme noktası A , B, C kesme noktalarına sahipse ve kesme noktaları oluşturmak için belirsiz bir kesme noktası ifadesi çözümlenir:

  • B, C, D: Kesme noktaları B, C kesme noktası D ile yeni hiyerarşik kesme noktası grubuna katılır ve hiyerarşik kesme noktası A temizlenir.

  • C, D veya B, D: Kesme noktalarından biri yeni hiyerarşik kesme noktası grubunu D kesme noktasıyla birleştirir ve hiyerarşik kesme noktası A , yeni gruba katılmayan kalan bir kesme noktasıyla varolmaya devam eder.

Ayrıca bakınız

Kesme Noktalarını Kullanarak

Kesme Noktası Söz Dizimi

bp, bu, bm (Kesme Noktasını Ayarla)

Çözümlenmemiş Kesme Noktaları (bu Kesme Noktaları)