Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
DbgPrintEx, vDbgPrintEx, vDbgPrintExWithPrefix ve KdPrintEx yordamları, belirttiğiniz koşullar altında çekirdek hata ayıklayıcısına bir ileti gönderir. Bu yordam, düşük öncelikli iletileri filtrelemenizi sağlar.
Uyarı
Microsoft Windows Server 2003 ve Windows'un önceki sürümlerinde DbgPrint ve KdPrint yordamları, çekirdek hata ayıklayıcısına koşulsuz olarak ileti gönderir. Windows Vista'da ve Windows'un sonraki sürümlerinde, bu yordamlar dbgPrintEx ve KdPrintEx gibi iletileri koşullu olarak gönderir. Windows'un hangi sürümünü kullanıyorsanız kullanın, DbgPrintEx, vDbgPrintEx, vDbgPrintExWithPrefix ve KdPrintEx kullanmanız gerekir, çünkü bu yordamlar iletinin gönderildiği koşulları denetlemenizi sağlar.
Hata ayıklama iletilerini filtrelemek için
Hata ayıklayıcıya göndermek istediğiniz her ileti için sürücünüzün kodunda DbgPrintEx, vDbgPrintEx, vDbgPrintExWithPrefix veya KdPrintEx kullanın. Uygun bileşen adını ComponentId parametresine geçirin ve Level parametresine bu iletinin önem derecesini veya niteliğini yansıtan bir değer geçirin. İletinin kendisi, printf ile aynı söz dizimi kullanılarak Biçim ve bağımsız değişken parametrelerine geçirilir.
Uygun bileşen filtre maskesinin değerini ayarlayın. Her bileşenin farklı bir maskesi vardır. Maske değeri, bu bileşenin iletilerinden hangilerinin görüntülendiğini gösterir. Kayıt defteri düzenleyicisini kullanarak veya çekirdek hata ayıklayıcısı kullanarak bellekte bileşen filtre maskesini ayarlayabilirsiniz.
Bilgisayara bir çekirdek hata ayıklayıcısı ekleyin. Sürücünüz DbgPrintEx, vDbgPrintEx, vDbgPrintExWithPrefix veya KdPrintEx'e her ileti geçirdiğinde, ComponentId ve Level'e geçirilen değerler ilgili bileşen filtre maskesinin değeriyle karşılaştırılır. Bu değerler belirli ölçütleri karşılarsa, ileti çekirdek hata ayıklayıcısına gönderilir ve görüntülenir. Aksi takdirde ileti gönderilmez.
Uyarı
Bu sayfadaki DbgPrintEx'e yapılan tüm başvurular KdPrintEx, vDbgPrintEx ve vDbgPrintExWithPrefix'e eşit olarak uygulanır.
Bileşen Adını Tanımlama
Her bileşenin ayrı bir filtre maskesi vardır. Bu, hata ayıklayıcının her bileşen için filtreyi ayrı olarak yapılandırmasına olanak tanır.
Her bileşen, bağlama bağlı olarak farklı şekillerde başvurulur. DbgPrintEx'inComponentId parametresinde, bileşen adı "DPFLTR_" ön ekine ve "_ID" ile son eklenmiştir. Kayıt defterinde, bileşen filtre maskesi, bileşenin kendisiyle aynı ismi taşır. Hata ayıklayıcıda, bileşen filtre maskesi "Kd_" önekiyle başlar ve "_Mask" sonekiyle biter.
Microsoft Windows Driver Kit (WDK) üst bilgisinde dpfilter.h tüm bileşen adlarının (DPFLTR_XXXX_ID biçiminde) tam listesi vardır. Bu bileşen adlarının çoğu Windows ve Microsoft tarafından yazılan sürücüler için ayrılmıştır.
Bağımsız donanım satıcıları için ayrılmış altı bileşen adı vardır. Sürücünüzün çıkışını Windows bileşenlerinin çıkışıyla karıştırmamak için aşağıdaki bileşen adlarından birini kullanmanız gerekir:
Bileşen adı | Sürücü türü |
---|---|
IHVVIDEO | Video sürücüsü |
IHVAUDIO | Ses sürücüsü |
IHVNETWORK | Ağ sürücüsü |
IHVSTREAMING | Çekirdek akış sürücüsü |
IHVBUS | Otobüs şoförü |
IHVDRIVER | Başka bir sürücü türü |
Örneğin, bir video sürücüsü yazıyorsanız, DbgPrintEx'inComponentId parametresi olarak DPFLTR_IHVVIDEO_ID kullanabilir, kayıt defterinde IHVVIDEO değer adını kullanabilir ve hata ayıklayıcıdaki Kd_IHVVIDEO_Mask başvurabilirsiniz.
DbgPrint ve KdPrint tarafından gönderilen tüm iletiler DEFAULT bileşeniyle ilişkilendirilir.
Doğru Düzeyi Seçme
DbgPrintEx yordamının Level parametresi DWORD türündedir. Önem derecesi bit alanını belirlemek için kullanılır. Level parametresi ile bu bit alanı arasındaki bağlantı, Level boyutuna bağlıdır.
Düzey 0 ile 31 (dahil) arasında bir sayıya eşitse, bit kaydırması olarak yorumlanır. Önem derecesi bit alanı 1 <<Düzey değerine ayarlanır. Bu nedenle Düzey için 0 ile 31 arasında bir değer seçmek, tam olarak bir bit kümesine sahip bir bit alanında sonuç verir. Düzey 0 ise, bit alanı 0x00000001 eşdeğerdir; Düzey 31 ise, bit alanı 0x80000000 eşdeğerdir.
Düzey 32 ile 0xFFFFFFFF (dahil) arasında bir sayıysa, önem derecesi bit alanı Düzey'in değerine ayarlanır.
Bu nedenle, bit alanını 0x00004000 olarak ayarlamak isterseniz Düzey'i 0x00004000 veya yalnızca 14 olarak belirtebilirsiniz. Tamamen sıfır olan bir bit alanı dahil olmak üzere belirli bit alanı değerlerinin bu sistem tarafından mümkün olmadığını unutmayın.
Aşağıdaki sabitler Düzey değerini ayarlamak için yararlı olabilir. Bunlar, Microsoft Windows Driver Kit (WDK) başlık dosyası dpfilter.h ve Windows SDK başlık dosyası ntrtl.h dosyalarında tanımlanmıştır.
#define DPFLTR_ERROR_LEVEL 0
#define DPFLTR_WARNING_LEVEL 1
#define DPFLTR_TRACE_LEVEL 2
#define DPFLTR_INFO_LEVEL 3
#define DPFLTR_MASK 0x80000000
Level parametresini kullanmanın kolay yollarından biri, 0 ile 31 arasındaki değerleri her zaman kullanmaktır; 0, 1, 2, 3 bitlerini DPFLTR_XXXX_LEVEL tarafından verilen anlamla ve diğer bitleri de seçtiğiniz anlamla kullanmaktır.
Level parametresini kullanmanın bir diğer kolay yolu da her zaman açık bit alanlarını kullanmaktır. Bu yöntemi seçerseniz, bit alanınızla DPFLTR_MASK değerini OR (VEYA) yapabilirsiniz; bu, yanlışlıkla 32'den küçük bir değer kullanma riskini ortadan kaldırır.
Sürücünüzü Windows'un ileti düzeylerini kullanma biçimiyle uyumlu hale getirmek için önemli bit alanının yalnızca en düşük bitini (0x1) ciddi bir hata oluşursa ayarlamanız gerekir. 32'den küçük Düzey değerleri kullanıyorsanız, bu DPFLTR_ERROR_LEVEL karşılık gelir. Bu bit ayarlanırsa, sürücünüzün çalıştığı bilgisayara birisi çekirdek hata ayıklayıcısı bağladığında iletiniz her zaman görüntülenecektir.
Uyarı, izleme ve bilgi düzeyleri uygun durumlarda kullanılmalıdır. Diğer bitler, yararlı bulduğunuz herhangi bir amaç için serbestçe kullanılabilir. Bu, seçmeli olarak görülebilen veya gizlenebilen çok çeşitli ileti türlerine sahip olmanıza olanak tanır.
DbgPrint ve KdPrint tarafından gönderilen tüm iletiler, DPFLTR_INFO_LEVEL'e eşit Düzey ile DbgPrintEx ve KdPrintEx iletileri gibi davranır. Başka bir deyişle, bu iletiler önem derecesi bit alanı kümesinin üçüncü bitini alır.
Bileşen Filtre Maskesini Ayarlama
Bileşen filtre maskesi ayarlamanın iki yolu vardır:
Bileşen filtre maskesine HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filterkayıt defteri anahtarından erişilebilir. Bir kayıt defteri düzenleyicisi kullanarak bu anahtarı oluşturun veya açın. Bu anahtarın altında, istenen bileşenin adıyla büyük harfle bir değer oluşturun. Bileşen filtre maskesi olarak kullanmak istediğiniz DWORD değerine eşit olarak ayarlayın.
Bir çekirdek hata ayıklayıcısı etkinse, Kd_XXXX_Mask simgesinde depolanan adresin başvurusunu çözerek bileşen filtre maskesi değerine erişebilir; burada XXXX istenen bileşen adıdır. Bu maskenin değerini WinDbg veya KD'de dd (DWORD Görüntüle) komutuyla görüntüleyebilir veya ed (DWORD Girin) komutuyla yeni bir bileşen filtre maskesi girebilirsiniz. Sembol belirsizliği tehlikesi varsa, bu simgeyi nt!Kd_XXXX_Mask olarak belirtmek isteyebilirsiniz.
Kayıt defterinde depolanan filtre maskeleri önyükleme sırasında etkili olur. Hata ayıklayıcısı tarafından oluşturulan filtre maskeleri hemen etkinleşir ve Windows yeniden başlatılana kadar kalıcı olur. Kayıt defterinde ayarlanan bir değer hata ayıklayıcı tarafından geçersiz kılınabilir, ancak sistem yeniden başlatılırsa bileşen filtre maskesi kayıt defterinde belirtilen değere döner.
Ayrıca WIN2000 adlı sistem genelinde bir maske de vardır. Bu, varsayılan olarak 0x1 eşittir, ancak kayıt defteri veya hata ayıklayıcı aracılığıyla diğer tüm bileşenler gibi değiştirilebilir. Filtreleme gerçekleştirilirken, her bileşen filtre maskesi ilk olarak WIN2000 maskesiyle ORed'dir. Özellikle bu, maskeleri hiç belirtilmemiş bileşenlerin varsayılan olarak 0x1 olduğu anlamına gelir.
Mesajı Görüntüleme Kriterleri
DbgPrintEx çekirdek modu kodunda çağrıldığında, Windows Düzey tarafından belirtilen ileti önem düzeyi bit alanını ComponentId tarafından belirtilen bileşenin filtre maskesiyle karşılaştırır.
Uyarı
Level parametresi 0 ile 31 arasında olduğunda, önem bit alanı 1 <<Düzey'e eşittir, bunu unutmayın. Ancak Düzey parametresi 32 veya daha yüksek olduğunda, bit alanı önem düzeyine eşittir.
Windows, önem derecesi bit alanı ve bileşen filtre maskesi üzerinde bir AND işlemi gerçekleştirir. Sonuç sıfır değilse, ileti hata ayıklayıcıya gönderilir.
Hata Ayıklama Filtresi Örneği
Son önyüklemeden önce Hata Ayıklama Yazdırma Filtresi anahtarında aşağıdaki değerleri oluşturduğunuzu varsayalım:
DWORD 0x2 değerine eşit olan IHVVIDEO
IHVBUS, DWORD 0x7FF'e eşit
Şimdi çekirdek hata ayıklayıcısında aşağıdaki komutları yayımlarsınız:
kd> ed Kd_IHVVIDEO_Mask 0x8
kd> ed Kd_IHVAUDIO_Mask 0x7
Bu noktada IHVVIDEO bileşeninde 0x8 filtre maskesi, IHVAUDIO bileşeninde 0x7 filtre maskesi ve IHVBUS bileşeninde 0x7FF filtre maskesi bulunur.
Ancak, bu maskeler WIN2000 sistem çapında maske (genellikle 0x1'e eşittir) ile otomatik olarak OR işlemi yapıldığından dolayı, IHVVIDEO maskesi etkili olarak 0x9'a eşittir. Aslında, filtre maskeleri hiç ayarlanmamış olan bileşenler (örneğin, IHVSTREAMING veya DEFAULT) 0x1 filtre maskesine sahip olur.
Şimdi aşağıdaki işlev çağrılarının çeşitli sürücülerde gerçekleştiğini varsayalım:
DbgPrintEx( DPFLTR_IHVVIDEO_ID, DPFLTR_INFO_LEVEL, "First message.\n");
DbgPrintEx( DPFLTR_IHVAUDIO_ID, 7, "Second message.\n");
DbgPrintEx( DPFLTR_IHVBUS_ID, DPFLTR_MASK | 0x10, "Third message.\n");
DbgPrint( "Fourth message.\n");
İlk iletinin Düzey parametresi DPFLTR_INFO_LEVEL'e eşittir ve bu da 3'dür. Bu değer 32'den küçük olduğundan, bit kayması olarak değerlendirilir ve bu da 0x8 önemli bir bit alanıyla sonuçlanır. Bu değer daha sonra 0x9 etkin IHVVIDEO bileşen filtresi maskesiyle AND edilir ve sıfır olmayan bir sonuç verir. Bu nedenle ilk ileti hata ayıklayıcıya iletilir.
İkinci iletinin Düzey parametresi 7'ye eşittir. Bu, bir bit kayması olarak değerlendirilir ve bu da 0x80 önemli bir bit alanıyla sonuçlanır. IHVAUDIO bileşen filtre maskesi 0x7 ile AND işlemi uygulanır ve bu da sıfır sonucunu verir. Bu nedenle ikinci ileti iletilmez.
Üçüncü iletinin Düzey parametresi DPFLTR_MASK | değerine eşit 0x10. Bu değer 31'den büyüktür ve bu nedenle önem derecesi bit alanı Düzey değerine eşit , başka bir deyişle 0x80000010 olarak ayarlanır. Bu daha sonra 0x7FF IHVBUS bileşen filtre maskesi ile AND edilir ve sıfır olmayan bir sonuç verir. Bu nedenle üçüncü ileti hata ayıklayıcıya iletilir.
Dördüncü ileti DbgPrintEx yerine DbgPrint'e geçirildi. Windows Server 2003 ve Windows'un önceki sürümlerinde, bu yordama iletilen mesajlar her zaman aktarılır. Windows Vista ve Windows'un sonraki sürümlerinde, bu yordama geçirilen iletilere her zaman varsayılan bir filtre verilir. Önem seviyesi bit alanı, 0x00000008 olan 1 << DPFLTR_INFO_LEVEL'e eşittir. Bu yordamın bileşeni DEFAULT'dir. DEFAULT bileşen filtre maskesini ayarlamadığınızdan, 0x1 değerine sahiptir. Bu, önem bit alanıyla AND işlemi uygulandığında, sonuç sıfırdır. Dolayısıyla dördüncü ileti iletilmez.
DbgPrint tamponu ve hata ayıklayıcı
DbgPrint, DbgPrintEx, vDbgPrintEx, vDbgPrintExWithPrefix, KdPrint veya KdPrintEx yordamı hata ayıklayıcıya bir ileti ilettiğinde, biçimlendirilmiş dize DbgPrint arabelleğine gönderilir. GFlags'in Buffer DbgPrint Output seçeneğini kullanarak bu görüntüyü devre dışı bırakmadığı sürece, bu arabelleğin içeriği hemen Hata Ayıklayıcı Komut penceresinde görüntülenir.
Yerel çekirdek hata ayıklaması sırasında ve bu ekran başka herhangi bir zamanda devre dışı bırakıldığında, DbgPrint arabelleğinin içeriği yalnızca !dbgprint ek komutu kullanılarak görüntülenebilir.
DbgPrint, DbgPrintEx, vDbgPrintEx, vDbgPrintExWithPrefix, KdPrint veya KdPrintEx'e yapılan tek bir çağrı yalnızca 512 bayt bilgi iletir. 512 bayttan uzun tüm çıkışlar kaybolur. DbgPrint arabelleğinin kendisi, ücretsiz bir Windows derlemesinde 4 KB'a kadar ve denetlenen bir Windows derlemesinde 32 KB'a kadar veri tutabilir. Windows Server 2003 ve sonraki Windows sürümlerinde, DbgPrint arabelleğinin boyutunu değiştirmek için KDbgCtrl aracını kullanabilirsiniz. Bu araç, Windows için Hata Ayıklama Araçları'nın bir parçasıdır.
Uyarı
Denetlenen derlemeler, Windows 10 sürüm 1803'ün önceki sürümlerinde kullanılabilirdi. Windows'un sonraki sürümlerinde sürücü kodunu denetlemek için Sürücü Doğrulayıcı ve GFlags gibi araçları kullanın.
Bir ileti ComponentId ve Düzey değerleri nedeniyle filtrelenmişse, hata ayıklama bağlantısı üzerinden iletilmez. Bu nedenle, hata ayıklayıcıda bu iletiyi görüntülemenin bir yolu yoktur.