Aracılığıyla paylaş


WinDbg ve diğer Windows hata ayıklayıcılarında koşullu kesme noktaları

WinDbg ve diğer Windows hata ayıklayıcılarındaki koşullu kesme noktaları, yalnızca belirli bir koşul karşılandığında içeri girmeniz gerektiğinde yararlıdır.

Bp (Kesme Noktasını Ayarla) veya başka bir kesme noktası komutu için "/w" parametresiyle bir koşullu kesme noktası oluşturulur. Komutun temel söz dizimi şöyledir:

0:000> bp /w "(Condition)" Address

Kesme noktası yalnızca belirtilen koşul true olduğunda hata ayıklayıcıda bir kesmeye neden olur. "w", "when" kısaltmasıdır. Koşul ifadesi , dx (Görüntü Hata Ayıklayıcısı Nesne Modeli İfadesi) komutuyla kullanılabilen herhangi bir şey olabilir. Buna karşılaştırmalar, aritmetik, işaretçi işlemleri ve diğerleri dahil olmak üzere çoğu C++ stil ifadesi dahildir. Örneğin, yalnızca bir değişken 20'den büyük olduğunda devreye giren temel bir koşullu durma noktası şöyle yazılabilir:

0:000> bp /w "MyVar > 20" `mysource.cpp:143`

Koşul hata ayıklayıcısı nesne modeli kullanılarak değerlendirildiğinden NatVis desteği gibi şeylerden de yararlanabilirsiniz. Örneğin, myVec öğesinin bir std::vector<int>olduğunu varsayarsak, şöyle bir koşul oluşturabilirsiniz:

0:000> bp /w "myVec.Count() == 4" `mysource.cpp:143`

mysource.cpp dosyasının 143. satırı çalıştırıldığında ve myVec değişkeni 4 öğe içerdiğinde hata verecek.

Natvis'in ötesinde bir JavaScript işlevi de çağırabilirsiniz. WinDbg betik penceresini veya "myFunc" adlı bir işlevi içeren .scriptload (Load Script) komutunu kullanarak bir betik yüklerseniz, şuna benzer bir kesme noktası ayarlayabilirsiniz:

0:000> bp /w "@$scriptContents.myFunc()" `mysource.cpp:143`

Hata ayıklayıcıda JavaScript işlevleri ve uzantıları yazma hakkında daha fazla bilgi için bkz. JavaScript Hata Ayıklayıcısı Betiği Oluşturma

Yüksek düzeyli ifadeler genellikle en kullanışlı ifade olsa da, bu ifadeleri kullanarak yazmaçları değerlendirmek de mümkündür. Örneğin, yalnızca yığın işaretçisi belirli bir eşiğe ulaştığında tetikleyen bir kesme noktası oluşturabilirsiniz:

0:000> bp /w "@esp < 0x6ff9f8" `mysource.cpp:143`

Eski koşullu kesme noktası söz dizimi

Kesme noktası komutlarında "/w" parametresi kullanılabilir olmadan önce, koşullu kesme noktalarını ayarlamanın önerilen yolu j (Execute If - Else) komutunu veya .if belirtecini ve ardından gc (Koşullu Kesme Noktasından Git) komutunu kullanmaktı. Koşullu kesme noktaları ayarlamaya yönelik bu yöntemler artık önerilmez, ancak yine de çalışırlar ve bu söz dizimine diğer kaynaklarda başvuruldu.

j komutunu kullanan bir koşullu kesme noktasının temel söz dizimi aşağıdaki gibidir:

0:000> bp Address "j (Condition) 'OptionalCommands'; 'gc' "

.if belirtecini kullanan bir koşullu kesme noktasının temel söz dizimi aşağıdaki gibidir:

0:000> bp Address ".if (Condition) {OptionalCommands} .else {gc}"