Aracılığıyla paylaş


LINQ'i hata ayıklayıcı nesneleriyle kullanma

LINQ söz dizimi, verileri aramak ve işlemek için hata ayıklayıcı nesneleriyle birlikte kullanılabilir. dx komutuyla LINQ söz dizimini kullanmak, hata ayıklayıcı komutlarını kullanmaya kıyasla daha tutarlı bir deneyim sağlar. Hangi hata ayıklayıcı nesnesine bakarsanız bakın, seçenekler ve çıktılar tutarlıdır. LINQ sorguları, "En çok iş parçacığı çalıştıran ilk 5 işlem nelerdir?" gibi sorular sormanıza olanak sağlar.

Hata ayıklayıcısı nesneleri, "Debugger" dizininde kök olarak bulunan bir ad alanına yansıtılır. İşlemler, modüller, iş parçacıkları, yığınlar, yığın çerçeveleri ve yerel değişkenlerin tümü LINQ sorgusunda kullanılabilir.

LINQ, veritabanlarını sorgulamak için kullanılan Yapılandırılmış Sorgu Dili'ne (SQL) kavramsal olarak benzerdir. Hata ayıklama verilerini aramak, filtrelemek ve ayrıştırmak için bir dizi LINQ yöntemi kullanabilirsiniz. LINQ C# yöntemi söz dizimi kullanılır. LINQ ve LINQ C# söz dizimi hakkında daha fazla bilgi için bkz. C# dilinde LINQ kullanmaya başlama

Hata ayıklayıcı desteğinde kullanılan LINQ, "sorgu söz dizimi"ni değil LINQ'un "yöntem söz dizimini" kullanır. LINQ (Language-Integrated Query) arasındaki farklar hakkında daha fazla ayrıntı bulabilirsiniz.

Hata ayıklayıcı nesneleriyle aşağıdaki gibi LINQ komutları kullanılabilir. Tüm. Herhangi. Saymak. Birinci. Düzleştir. GroupBy, . Son. OrderBy, . OrderByDescending, . ve öğesini seçin. Nerede. Bu yöntemler C# LINQ yöntem formunu izler (mümkün olduğunca yakın).

Yerel hata ayıklayıcı nesneleri

Yerel hata ayıklayıcı nesneleri, hata ayıklayıcı ortamının çeşitli yapılarını ve davranışlarını temsil eder. Örnek hata ayıklayıcı nesneleri aşağıdakileri içerir.

  • Oturum
  • İş Parçacıkları / İş Parçacığı
  • İşlemler / İşlemler
  • Yığın Çerçeveleri / Yığın Çerçevesi
  • Yerel Değişkenler
  • Modüller / Modül
  • Fayda
  • Devlet
  • Ayarlar

Hata ayıklayıcı nesneleriyle NatVis ile de çalışabilirsiniz. Daha fazla bilgi için bkz. NatVis'te Yerel Hata Ayıklayıcı Nesneleri. JavaScript ile hata ayıklayıcı nesnelerini kullanma hakkında bilgi için bkz. JavaScript Uzantılarında Yerel Hata Ayıklayıcı Nesneleri. C++ ve sürücü nesneleriyle çalışma hakkında bilgi için bkz. Hata Ayıklayıcı Veri Modeli C++ Genel Bakış.

Dx komutu

Burada gösterilen örneklerde dx komutu kullanılmaktadır. dx komutuyla çalışmak hakkında daha fazla bilgi edinmek için bkz. dx (Hata Ayıklayıcı Nesne Modeli İfadesini Görüntüle).

LINQ Sorgusu Geliştirme

LINQ hata ayıklayıcısı nesne sorgusu geliştirmenin bir yolu, önce sorguda kullanılacak hata ayıklayıcı nesnesini bulmak üzere veri modelini araştırmak için görüntülenen DML bağlantılarını kullanmaktır.

Bu örnekte, çekirdek hata ayıklama oturumundaki işlemlerin listesini ve bu işlemlerin her biri için iş parçacığı sayısını görüntülemek istiyoruz.

Araştırmamıza başlamak için dx komutunu kullanarak en üst düzey hata ayıklayıcı nesnesini görüntüleyebiliriz.

0: kd> dx Debugger
Debugger
    Sessions
    Settings
    State
    Utility

En üst düzey konuları seçtikten sonra Oturumlar'ın en ilginç göründüğünü belirleriz, bu nedenle İşlemler içerdiğini göstermek için DML bağlantısını seçeriz.

0: kd> dx -r1 Debugger.Sessions[0]
Debugger.Sessions[0]                 : Remote KD: KdSrv:Server=@{<Local>},Trans=@{NET:Port=50005,Key=MyKey}
    Processes
    Id               : 0
    Attributes

Ardından belirli bir işleme bakmak için daha aşağıya doğru seçim yapıyoruz ve bu işlemle ilişkili İş Parçacıklarının kullanılabilir olduğunu görüyoruz. İşlemlerden biri için İş Parçacıkları'nı seçtiğimizde, bu işlemle ilişkili tüm iş parçacıklarının kullanılabilir olduğunu görürüz.

0: kd> dx -r1 Debugger.Sessions[0].Processes[1428].Threads
Debugger.Sessions[0].Processes[1428].Threads
    [0x598]          : <Unable to get stack trace> [Switch To]
    [0x1220]         : <Unable to get stack trace> [Switch To]
    [0x6f8]          : nt!KiSwapContext+0x76 (fffff806`4466a186)  [Switch To]
    [0x128c]         : <Unable to get stack trace> [Switch To]
    [0x27e4]         : nt!KiSwapContext+0x76 (fffff806`4466a186)  [Switch To] 

Artık bir işlemle ilişkili iş parçacığı sayısını görüntülemek için ihtiyacımız olan verilerin hata ayıklayıcı nesne modelinde kullanılabilir olduğunu biliyoruz.

LINQ sorgusunu biraz daha kısa hale getirmek için bu konunun ilerleyen bölümlerinde açıklanan Sistem Tanımlı Değişkenleri kullanarak geçerli oturumla ilişkili işlemleri görüntüleyebilirsiniz.

0: kd> dx @$cursession.Processes
@$cursession.Processes                
    [0x0]            : Idle [Switch To]
    [0x4]            : System [Switch To]
    [0x90]           : Registry [Switch To]
...

Ardından bir select deyimi ekleyin. Başlangıç olarak Ad alanını belirtebiliriz.

0: kd> dx @$cursession.Processes.Select(p => p.Name)
@$cursession.Processes.Select(p => p.Name)                
    [0x0]            : Idle
    [0x4]            : System
    [0x90]           : Registry
...

Senaryomuz için thread sayısına da ihtiyacımız var. C#'nin Kullanıcı Tanımlı Değişkenler'de açıklanan anonim tür söz dizimine benzer bir şekilde, iki alan olduğundan new ile bir adsız tür oluşturun.

dx @$cursession.Processes.Select(p => new {Name = p.Name, Threads = p.Threads})

Bu komutla 'dx' artık adı yazdırmıyor, bu nedenle Ad ve İş Parçacıkları'nı görüntülemek için -r2 (iki düzey yineleme) ekleyin.

dx -r2 @$cursession.Processes.Select(p => new {Name = p.Name, Threads = p.Threads})
@$cursession.Processes.Select(p => new {Name = p.Name, Threads = p.Threads})                
    [0x0]           
        Name             : Idle
        Threads         
    [0x4]           
        Name             : System
        Threads         
    [0x90]          
        Name             : Registry
        Threads       

Bu noktada işlemin adını ve iş parçacıklarının listesini görüntülüyoruz. ThreadCount'ı görüntülemek için kullanın . Count() yöntemi.

0: kd> dx -r2 @$cursession.Processes.Select(p => new {Name = p.Name, ThreadCount = p.Threads.Count()})
@$cursession.Processes.Select(p => new {Name = p.Name, ThreadCount = p.Threads.Count()})                
    [0x0]           
        Name             : Idle
        ThreadCount      : 0x4
    [0x4]           
        Name             : System
        ThreadCount      : 0xe7
    [0x90]          
        Name             : Registry
        ThreadCount      : 0x4
...

Çok sayıda iş parçacığına sahip olan işlemleri görmek için OrderByDescending kullanarak listeyi iş parçacığı sayısına göre sırala.

0: kd> dx -r2 @$cursession.Processes.Select(p => new {Name = p.Name, ThreadCount = p.Threads.Count()}).OrderByDescending(p => p.ThreadCount)
@$cursession.Processes.Select(p => new {Name = p.Name, ThreadCount = p.Threads.Count()}).OrderByDescending(p => p.ThreadCount)                
    [0x4]           
        Name             : System
        ThreadCount      : 0xe7
    [0xa38]         
        Name             : svchost.exe
        ThreadCount      : 0x45
    [0x884]         
        Name             : MemCompression
        ThreadCount      : 0x3e

Biçimlendirilmiş bir kılavuzda görüntülemek için '-r2' öğesini '-g' ile değiştirin. Kılavuz seçeneği sütunları uygun şekilde görüntülediğinden özyineleme düzeyinin belirtilmesi gerekmez. Son olarak, ondalık değerlerin çıkışını almak için ',d' biçim tanımlayıcısını ekleyin.

0: kd> dx -g @$cursession.Processes.Select(p => new {Name = p.Name, ThreadCount = p.Threads.Count()}).OrderByDescending(p => p.ThreadCount),d
===========================================================================================
=            = Name                                                         = ThreadCount =
===========================================================================================
= [4]        - System                                                       - 231         =
= [2616]     - svchost.exe                                                  - 69          =
= [2180]     - MemCompression                                               - 62          =
= [968]      - explorer.exe                                                 - 61          =

Hata Ayıklayıcı Nesneleri Örnekleri

Bu örnekte en çok iş parçacığı çalıştıran ilk 5 işlem gösterilmektedir:

0: kd> dx -r2 Debugger.Sessions.First().Processes.Select(p => new { Name = p.Name, ThreadCount = p.Threads.Count() }).OrderByDescending(p => p.ThreadCount),5
Debugger.Sessions.First().Processes.Select(p => new { Name = p.Name, ThreadCount = p.Threads.Count() }).OrderByDescending(p => p.ThreadCount),5 

: 
    [0x4]            : 
        Name             : <Unknown Image>
        ThreadCount      : 0x73
    [0x708]          : 
        Name             : explorer.exe
        ThreadCount      : 0x2d
    [0x37c]          : 
        Name             : svchost.exe
        ThreadCount      : 0x2c
    [0x6b0]          : 
        Name             : MsMpEng.exe
        ThreadCount      : 0x22
    [0x57c]          : 
        Name             : svchost.exe
        ThreadCount      : 0x15
    [...]       

Bu örnekte, tak çalıştır cihaz ağacındaki cihazlar, fiziksel cihaz nesnesinin sürücüsünün adına göre gruplandırılmış olarak gösterilir. Çıktının tamamı gösterilmedi.

kd> dx -r2 Debugger.Sessions.First().Devices.DeviceTree.Flatten(n => n.Children).GroupBy(n => n.PhysicalDeviceObject->Driver->DriverName.ToDisplayString())
Debugger.Sessions.First().Devices.DeviceTree.Flatten(n => n.Children).GroupBy(n => n.PhysicalDeviceObject->Driver->DriverName.ToDisplayString()) 

: 
    ["\"\\Driver\\PnpManager\""] : 
        [0x0]            : HTREE\ROOT\0
        [0x1]            : ROOT\volmgr\0000 (volmgr)
        [0x2]            : ROOT\BasicDisplay\0000 (BasicDisplay)
        [0x3]            : ROOT\CompositeBus\0000 (CompositeBus)
        [0x4]            : ROOT\vdrvroot\0000 (vdrvroot)
         ...  

Dx Komut Sekmesi Otomatik Tamamlama

Bağlamsal SEKME tuşunun otomatik tamamlaması LINQ sorgu yöntemlerinin farkındadır ve lambda parametreleri için çalışır.

Örneğin, hata ayıklayıcıya aşağıdaki metni yazın (veya kopyalayıp yapıştırın). Ardından, olası tamamlamalar arasında geçiş yapmak için SEKME tuşuna birkaç kez basın.

dx -r2 Debugger.Sessions.First().Processes.Select(p => new {Name = p.Name, ThreadCount = p.Threads.Count() }).OrderByDescending(p => p.

TAB tuşuna ".Name" görünene kadar basın. ")" kapanış parantezini ekleyin ve komutu yürütmek için Enter tuşuna basın.

kd> dx -r2 Debugger.Sessions.First().Processes.Select(p => new {Name = p.Name, ThreadCount = p.Threads.Count() }).OrderByDescending(p => p.Name)
Debugger.Sessions.First().Processes.Select(p => new {Name = p.Name, ThreadCount = p.Threads.Count() }).OrderByDescending(p => p.Name) : 
    [0x274]          : 
        Name             : winlogon.exe
        ThreadCount      : 0x4
    [0x204]          : 
        Name             : wininit.exe
        ThreadCount      : 0x2
    [0x6c4]          : 
        Name             : taskhostex.exe
        ThreadCount      : 0x8
         ...  

Bu örnekte, anahtar karşılaştırıcı yöntemiyle tamamlama gösterilmektedir. Anahtar bir dize olduğundan değiştirme dize yöntemlerini gösterir.

dx -r2 Debugger.Sessions.First().Processes.Select(p => new {Name = p.Name, ThreadCount = p.Threads.Count() }).OrderByDescending(p => p.Name, (a, b) => a.

TAB tuşuna ".Uzunluk" ifadesi görünene kadar basın. Kapanış parantezi ")" ekleyin ve komutu yürütmek için Enter tuşuna basın.

kd> dx -r2 Debugger.Sessions.First().Processes.Select(p => new {Name = p.Name, ThreadCount = p.Threads.Count() }).OrderByDescending(p => p.Name, (a, b) => a.Length)
Debugger.Sessions.First().Processes.Select(p => new {Name = p.Name, ThreadCount = p.Threads.Count() }).OrderByDescending(p => p.Name, (a, b) => a.Length) : 
    [0x544]          : 
        Name             : spoolsv.exe
        ThreadCount      : 0xc
    [0x4d4]          : 
        Name             : svchost.exe
        ThreadCount      : 0xa
    [0x438]          : 
        Name             : svchost.exe

Kullanıcı Tanımlı Değişkenler

Kullanıcı tanımlı bir değişken, değişken adının önüne @$ eklenerek tanımlanabilir. Kullanıcı tanımlı bir değişken, dx'in kullanabildiği her şeye atanabilir, örneğin lambdalar, LINQ sorgularının sonuçları vb.

Bunun gibi bir kullanıcı değişkeninin değerini oluşturabilir ve ayarlayabilirsiniz.

kd> dx @$String1="Test String"

Debugger.State.UserVariables veya @$vars kullanarak tanımlı kullanıcı değişkenlerini görüntüleyebilirsiniz.

kd> dx Debugger.State.UserVariables
Debugger.State.UserVariables : 
    mySessionVar     : 
    String1          : Test String

.Remove kullanarak bir değişkeni kaldırabilirsiniz.

kd> dx @$vars.Remove("String1")

Bu örnekte Debugger.Sesssions'a başvurmak için bir kullanıcı değişkeninin nasıl tanımlanacağı gösterilmektedir.

kd> dx @$mySessionVar = Debugger.Sessions

Kullanıcı tanımlı değişken daha sonra aşağıda gösterildiği gibi kullanılabilir.

kd> dx -r2 @$mySessionVar 
@$mySessionVar   : 
    [0x0]            : Remote KD: KdSrv:Server=@{<Local>},Trans=@{COM:Port=\\.\com3,Baud=115200,Timeout=4000}
        Processes        : 
        Devices     

Sistem Tanımlı Değişkenler

Aşağıdaki sistem tanımlı değişkenler herhangi bir LINQ dx sorgusunda kullanılabilir.

  • @$cursession - Geçerli oturum

  • @$curprocess - Geçerli işlem

  • @$curthread - Mevcut iş parçacığı

Bu örnekte sistem tanımlı değişkenlerin kullanımı gösterilmektedir.

kd> dx @$curprocess.Threads.Count()
@$curprocess.Threads.Count() : 0x4
kd> dx -r1 @$curprocess.Threads
@$curprocess.Threads : 
    [0x4adc]         : 
    [0x1ee8]         : 
    [0x51c8]         : 
    [0x62d8]         : 
     ...

Kullanıcı Tanımlı Değişkenler - Anonim Türler

Bu dinamik nesne oluşturma işlemi C# anonim tür söz dizimi (yeni { ... }) kullanılarak yapılır. Anonim türler hakkında daha fazla bilgi için bkz. Anonim Türler (C# Programlama Kılavuzu). Bu örnek, tamsayı ve dize değeriyle anonim bir tür oluşturur.

kd> dx -r1 new { MyInt = 42, MyString = "Hello World" }
new { MyInt = 42, MyString = "Hello World" } : 
    MyInt            : 42
    MyString         : Hello World

İşlev Nesneleri (Lambda İfadeleri)

Verileri sorgulamak için kullanılan yöntemlerin çoğu, kullanıcı tarafından sağlanan bir işlevi bir koleksiyondaki nesneler arasında tekrar tekrar çalıştırma kavramını temel alır. Hata ayıklayıcıdaki verileri sorgulama ve işleme özelliğini desteklemek için dx komutu eşdeğer C# söz dizimini kullanarak lambda ifadelerini destekler. Lambda ifadesi=> işlecinin kullanımıyla aşağıdaki gibi tanımlanır:

(argümanlar) => (sonuç)

LINQ'in dx ile nasıl kullanıldığını görmek için 5 ve 7'yi bir araya getirmek için bu basit örneği deneyin.

kd> dx ((x, y) => (x + y))(5, 7) 

dx komutu lambda ifadesini geri döndürür ve 12 sonucunu gösterir.

((x, y) => (x + y))(5, 7)  : 12

Bu örnek lambda ifadesi "Hello" ve "World" dizelerini birleştirir.

kd> dx ((x, y) => (x + y))("Hello", "World")
((x, y) => (x + y))("Hello", "World") : HelloWorld

Desteklenen LINQ Sözdizimi - Sorgu Yöntemleri

dx tarafından yinelenebilir olarak tanımlanan herhangi bir nesne (yerel bir dizi, kapsayıcı olarak açıklayan NatVis yazılmış bir tür veya hata ayıklayıcı uzantısı nesnesi) üzerine yansıtılan bir dizi LINQ (veya LINQ eşdeğeri) yöntemine sahiptir. Bu sorgu yöntemleri aşağıda açıklanmıştır. Sorgu yöntemlerinin argüman imzaları tüm sorgu yöntemlerinden sonra listelenir.

Filtreleme Yöntemleri

.Where ( PredicateMethod ): Koşul yönteminin true döndürdüğü giriş koleksiyonundaki her nesneyi içeren yeni bir nesne koleksiyonu geri döndürür.

Projeksiyon Yöntemleri

Flatten ( [KeyProjectorMethod] ): Kapsayıcıların kapsayıcı girişini (bir ağaç) alır ve bu ağacı, her öğenin bulunduğu tek bir kapsayıcıya dönüştürür. İsteğe bağlı anahtar projektör yöntemi sağlanmışsa, ağaç, kendi içinde anahtarları barındıran bir kapsayıcı olarak kabul edilir ve bu anahtarlar, projeksiyon yöntemine yapılan bir çağrı ile belirlenir.

.Select ( KeyProjectorMethod ): Giriş koleksiyonundaki her nesneye projector method uygulanmasının sonucunu içeren yeni bir nesne koleksiyonu döndürür.

Gruplandırma Yöntemleri

.GroupBy ( KeyProjectorMethod, [KeyComparatorMethod] ): Anahtar projektör yöntemi çağrılarak belirlenen anahtara sahip olan giriş koleksiyonundaki tüm nesneleri gruplandırarak yeni bir koleksiyonlar koleksiyonunu döndürür. İsteğe bağlı bir karşılaştırıcı yöntemi sağlanabilir.

Join (InnerCollection, Dış anahtar seçici yöntemi, İç anahtar seçici yöntemi, Sonuç seçici yöntemi, [ComparatorMethod]): Anahtar seçici işlevlerine göre iki diziyi birleştirir ve değer çiftlerini ayıklar. İsteğe bağlı bir karşılaştırıcı yöntemi de belirtilebilir.

Intersect (InnerCollection, [ComparatorMethod]): İki koleksiyonun her birinde görünen öğeler anlamına gelen küme kesişimini döndürür. İsteğe bağlı bir karşılaştırıcı yöntemi de belirtilebilir.

Union (InnerCollection, [ComparatorMethod]): İki koleksiyondan birinde görünen benzersiz öğeler anlamına gelen küme birleşimini döndürür. İsteğe bağlı bir karşılaştırıcı yöntemi de belirtilebilir.

Veri Kümesi Yöntemleri

Contains (Object, [ComparatorMethod]): Bir dizinin belirtilen öğeyi içerip içermediğini belirler. Öğe dizideki bir girişle karşılaştırıldığında her seferinde çağrılacak isteğe bağlı bir karşılaştırıcı yöntemi sağlanabilir.

Distinct ([ComparatorMethod]): Bir koleksiyondan yinelenen değerleri kaldırır. Koleksiyondaki nesnelerin her karşılaştırılması gerektiğinde çağrılmak üzere isteğe bağlı bir karşılaştırıcı yöntemi sağlanabilir.

Except (InnerCollection, [ComparatorMethod]): Küme farkını döndürür; bu, ikinci bir koleksiyonda görünmeyen bir koleksiyonun öğeleri anlamına gelir. İsteğe bağlı bir karşılaştırıcı yöntemi belirtilebilir.

Concat (InnerCollection): bir dizi oluşturmak için iki diziyi birleştirir.

Sıralama Yöntemleri

.OrderBy ( KeyProjectorMethod, [KeyComparatorMethod] ): Giriş koleksiyonundaki her nesne için anahtar projeksiyon yöntemini çağırarak sağlanan anahtara göre koleksiyonu artan sırayla sıralar. İsteğe bağlı bir karşılaştırıcı yöntemi sağlanabilir.

OrderByDescending ( KeyProjectorMethod, [KeyComparatorMethod] ): Giriş koleksiyonundaki her nesnede anahtar projeksiyon yöntemini çağırarak elde edilen anahtara göre koleksiyonu azalan sırayla sıralar. İsteğe bağlı bir karşılaştırıcı yöntemi sağlanabilir.

Toplama Yöntemleri

Count (): Koleksiyondaki öğe sayısını döndüren bir yöntem.

Toplam ([ProjectionMethod]): Koleksiyondaki değerlerin toplamını hesaplar. İsteğe bağlı olarak, toplama gerçekleşmeden önce öğeleri dönüştürmek için bir projektör yöntemi belirtebilir.

Yöntemleri Atla

Atla (Sayı): Öğeleri bir dizide belirtilen konuma kadar atlar.

SkipWhile (PredicateMethod): Bir öğe koşulu karşılamayana kadar koşul işlevini temel alan öğeleri atlar.

Yöntemleri Kullanma

Al (Sayı): Öğeleri bir dizide belirtilen konuma kadar alır.

TakeWhile (PredicateMethod): Bir öğe koşulu karşılamayana kadar koşul işlevini temel alan öğeleri alır.

Karşılaştırma Yöntemleri

SequenceEqual (InnerCollection, [ComparatorMethod]): öğeleri çifte göre karşılaştırarak iki dizinin eşit olup olmadığını belirler. İsteğe bağlı bir karşılaştırıcı belirtilebilir.

Hata İşleme Yöntemleri

AllNonError (PredicateMethod): Bir koleksiyonun tüm hata olmayan öğelerinin belirli bir koşulu karşılayıp karşılamadığını döndürür.

FirstNonError ([PredicateMethod]): Bir koleksiyonun hata olmayan ilk öğesini döndürür.

LastNonError ([PredicateMethod]): Bir koleksiyonun hata olmayan son öğesini döndürür.

Diğer Yöntemler

.All ( PredicateMethod ): Giriş koleksiyonundaki her öğe için belirtilen öngörü yönteminin doğru olup olmadığını döndürür.

.Any ( PredicateMethod ): Giriş koleksiyonundaki herhangi bir öğe üzerinde belirtilen koşul yöntemini uygulamanın sonucunun doğru olup olmadığını döndürür.

First ([PredicateMethod]): Koleksiyondaki ilk öğeyi döndürür. İsteğe bağlı koşul geçirilirse, koşula yapılan çağrının true döndürdüğü koleksiyondaki ilk öğeyi döndürür.

.Last ( [PredicateMethod] ): Koleksiyondaki son öğeyi döndürür. İsteğe bağlı koşul geçirilirse, koşula yapılan çağrının true döndürdüğü koleksiyondaki son öğeyi döndürür.

Min([KeyProjectorMethod]): Koleksiyonun en küçük öğesini döndürür. Her yöntemi başkalarıyla karşılaştırılmadan önce yansıtmak için isteğe bağlı bir projektör yöntemi belirtilebilir.

Max([KeyProjectorMethod]): Koleksiyonun en büyük öğesini döndürür. Her yöntemi başkalarıyla karşılaştırılmadan önce yansıtmak için isteğe bağlı bir projektör yöntemi belirtilebilir.

Single([PredicateMethod]): Listedeki tek öğeyi (veya koleksiyon birden fazla öğe içeriyorsa bir hata) döndürür. Koşul belirtilirse, bu koşulu karşılayan tek öğeyi döndürür (birden fazla öğe bunu karşılarsa işlev bunun yerine bir hata döndürür).

Argümanların İmzaları

KeyProjectorMethod : ( obj => rastgele anahtar ) Koleksiyondaki bir nesneyi alır ve o nesneden bir anahtar döndürür.
KeyComparatorMethod: ( (a, b) => tamsayı değeri ) İki anahtarı alır ve karşılaştırarak bir sonuç döndürür.

-1 if ( a < b )

0 if ( a == b)

1 eğer ( a > b )

PredicateMethod: ( obj => boole değeri ) Koleksiyonun bir nesnesini alır ve bu nesnenin belirli ölçütleri karşılayıp karşılamadığına bağlı olarak true veya false döndürür.

Desteklenen LINQ Sözdizimi - Dize Düzenleme

Tüm dize nesnelerinin, kullanılabilir olmaları için bunlara aşağıdaki yöntemler yansıtılır:

İlgili Yöntemleri ve Özellikleri Sorgulama

.Contains ( OtherString ): Giriş dizesinin OtherString'i içerip içermediğini belirten bir boole değeri döndürür.

.EndsWith ( OtherString ): Giriş dizesinin OtherString ile bitip bitmediğini belirten bir boole değeri döndürür.

Uzunluk: Dizenin uzunluğunu döndüren bir özellik.

.StartsWith ( OtherString ): Giriş dizesinin OtherString ile başlayıp başlamadığını belirten bir boolean değeri döndürür.

.Substring ( StartPos, [Uzunluk] ): Verilen başlangıç konumundan başlayarak giriş dizesi içinde bir alt dize döndüren metod. İsteğe bağlı uzunluk sağlanırsa, döndürülen alt dize belirtilen uzunlukta olur; aksi takdirde dizenin sonuna gider.

Çeşitli Yöntemler

.IndexOf ( OtherString ): Giriş dizesi içinde OtherString'in ilk geçişinin dizinini döndürür.

.LastIndexOf ( OtherString ): Giriş dizisi içinde OtherString'in son oluşumunun dizinini döndürür.

Biçimlendirme Yöntemleri

.PadLeft ( TotalWidth ): Dizenin toplam uzunluğunu belirtilen genişliğe getirmek için dizenin sol tarafına gerektiği kadar boşluk ekler.

.PadRight ( TotalWidth ): Dizginin toplam uzunluğunu belirtilen genişliğe getirmek için dizginin sağ tarafına gerektiği kadar boşluk ekler.

Remove ( StartPos, [Length] ): Belirtilen başlangıç konumundan itibaren giriş dizesinden karakterleri kaldırır. İsteğe bağlı uzunluk parametresi sağlanırsa, bu karakter sayısı kaldırılır; aksi takdirde, dizenin sonundaki tüm karakterler kaldırılır.

.Replace ( SearchString, ReplaceString ): Giriş dizesinde, SearchString'in her bir meydana gelişini belirtilen ReplaceString ile değiştirir.

Dize Nesnesi Projeksiyonları

Doğrudan dize nesnelerine yansıtılan yöntemlere ek olarak, dize dönüştürmesi olan herhangi bir nesnenin üzerine aşağıdaki yöntem yansıtılır ve bu yöntem kullanılabilir hale getirilir:

.ToDisplayString ( ): Nesnenin dize dönüşümünü döndürür. Bu, bir nesne için dx çağrısında gösterilecek bir dize dönüşümüdür. ToDisplayString'in çıkışını biçimlendirmek için bir biçimlendirme tanımlayıcısı sağlayabilirsiniz. Daha fazla bilgi için bkz. Visual Studio hata ayıklayıcısında C++ için biçim tanımlayıcıları

Aşağıdaki örneklerde biçim tanımlayıcılarının kullanımı gösterilmektedir.

kd> dx (10).ToDisplayString("d")
(10).ToDisplayString("d") : 10

kd> dx (10).ToDisplayString("x")
(10).ToDisplayString("x") : 0xa

kd> dx (10).ToDisplayString("o")
(10).ToDisplayString("o") : 012

kd> dx (10).ToDisplayString("b") 
(10).ToDisplayString("b")  : 0y1010

kd> dx ("some wchar string here").ToDisplayString("su") 
("some wchar string here").ToDisplayString("su")  : "some wchar string here"

kd> dx ("some wchar string here").ToDisplayString("sub") 
("some wchar string here").ToDisplayString("sub")  : some wchar string here

Tak Çalıştır Hata Ayıklama Örneği

Bu bölümde, LINQ sorguları ile kullanılan yerleşik hata ayıklayıcı nesnelerinin tak çalıştır nesnelerinde hata ayıklamak için nasıl kullanılabileceğini gösterilmektedir.

Tüm cihazları görüntüleme

Tüm cihazları görüntülemek için cihaz ağacında Düzleştirme'yi kullanın.

 1: kd> dx @$cursession.Devices.DeviceTree.Flatten(n => n.Children)
@$cursession.Devices.DeviceTree.Flatten(n => n.Children)                
    [0x0]            : HTREE\ROOT\0
    [0x1]            : ROOT\volmgr\0000 (volmgr)
    [0x2]            : ROOT\BasicDisplay\0000 (BasicDisplay)
    [0x3]            : ROOT\CompositeBus\0000 (CompositeBus)
    [0x4]            : ROOT\vdrvroot\0000 (vdrvroot)
    [0x5]            : ROOT\spaceport\0000 (spaceport)
    [0x6]            : ROOT\KDNIC\0000 (kdnic)
    [0x7]            : ROOT\UMBUS\0000 (umbus)
    [0x8]            : ROOT\ACPI_HAL\0000
...

Izgara Görünümü

Diğer dx komutlarda olduğu gibi, yürütüldükten sonra bir komutu seçip tutabilir (veya sağ tıklayabilir) ve "Kılavuz olarak görüntüle" seçeneğini belirleyebilir veya sonuçların kılavuz görünümünü almak için komuta "-g" ekleyebilirsiniz.

# 0: kd> dx -g @$cursession.Devices.DeviceTree.Flatten(n => n.Children)
=====================================================================================================================================================================================================================================================================================================================
# =                                                              = (+) DeviceNodeObject = InstancePath                                                 = ServiceName               = (+) PhysicalDeviceObject                                    = State                          = (+) Resources = (+) Children       =
=====================================================================================================================================================================================================================================================================================================================
= [0x0] : HTREE\ROOT\0                                         - {...}                - HTREE\ROOT\0                                                 -                           - 0xffffb6075614be40 : Device for "\Driver\PnpManager"        - DeviceNodeStarted (776)        - {...}        - [object Object]    =
= [0x1] : ROOT\volmgr\0000 (volmgr)                            - {...}                - ROOT\volmgr\0000                                             - volmgr                    - 0xffffb607561fbe40 : Device for "\Driver\PnpManager"        - DeviceNodeStarted (776)        - {...}        - [object Object]    =
= [0x2] : ROOT\BasicDisplay\0000 (BasicDisplay)                - {...}                - ROOT\BasicDisplay\0000                                       - BasicDisplay              - 0xffffb607560739b0 : Device for "\Driver\PnpManager"        - DeviceNodeStarted (776)        - {...}        - [object Object]    =
= [0x3] : ROOT\CompositeBus\0000 (CompositeBus)                - {...}                - ROOT\CompositeBus\0000                                       - CompositeBus              - 0xffffb607561f9060 : Device for "\Driver\PnpManager"        - DeviceNodeStarted (776)        - {...}        - [object Object]    =
...

Cihazları Duruma Göre Görüntüleme

Belirli bir cihaz durumunu belirtmek için Where kullanın.

dx @$cursession.Devices.DeviceTree.Flatten(n => n.Children).Where(n => n.State <operator> <state number>)

Örneğin Cihazları DeviceNodeStarted durumunda görüntülemek için bu komutu kullanın.

1: kd>  dx @$cursession.Devices.DeviceTree.Flatten(n => n.Children).Where(n => n.State == 776)
@$cursession.Devices.DeviceTree.Flatten(n => n.Children).Where(n => n.State == 776)                
    [0x0]            : HTREE\ROOT\0
    [0x1]            : ROOT\volmgr\0000 (volmgr)
    [0x2]            : ROOT\BasicDisplay\0000 (BasicDisplay)
    [0x3]            : ROOT\CompositeBus\0000 (CompositeBus)
    [0x4]            : ROOT\vdrvroot\0000 (vdrvroot)
...

Başlatılmayan Cihazları Görüntüle

DeviceNodeStarted durumunda olmayan cihazları görüntülemek için bu komutu kullanın.

1: kd>  dx @$cursession.Devices.DeviceTree.Flatten(n => n.Children).Where(n => n.State != 776)
@$cursession.Devices.DeviceTree.Flatten(n => n.Children).Where(n => n.State != 776)                
    [0x0]            : ACPI\PNP0C01\1
    [0x1]            : ACPI\PNP0000\4&215d0f95&0
    [0x2]            : ACPI\PNP0200\4&215d0f95&0
    [0x3]            : ACPI\PNP0100\4&215d0f95&0
    [0x4]            : ACPI\PNP0800\4&215d0f95&0
    [0x5]            : ACPI\PNP0C04\4&215d0f95&0
    [0x6]            : ACPI\PNP0700\4&215d0f95&0 (fdc)
    [0x7]            : ACPI\PNP0C02\1
    [0x8]            : ACPI\PNP0C02\2

Cihazları Sorun Koduna Göre Görüntüleme

Belirli sorun kodları olan cihazları görüntülemek için DeviceNodeObject.Problem nesnesini kullanın.

dx @$cursession.Devices.DeviceTree.Flatten(n => n.Children).Where(n => n.DeviceNodeObject.Problem <operator> <problemCode>)

Örneğin, sıfır sorun kodu olmayan cihazları görüntülemek için bu komutu kullanın. Bu, "!devnode 0 21" ile benzer bilgiler sağlar.

1: kd> dx @$cursession.Devices.DeviceTree.Flatten(n => n.Children).Where(n => n.DeviceNodeObject.Problem != 0)
@$cursession.Devices.DeviceTree.Flatten(n => n.Children).Where(n => n.DeviceNodeObject.Problem != 0)                
    [0x0]            : HTREE\ROOT\0
    [0x1]            : ACPI\PNP0700\4&215d0f95&0 (fdc)

Tüm Cihazları Sorunsuz Görüntüle

Tüm cihazları sorunsuz görüntülemek için bu komutu kullanın

1: kd> dx @$cursession.Devices.DeviceTree.Flatten(n => n.Children).Where(n => n.DeviceNodeObject.Problem == 0)
@$cursession.Devices.DeviceTree.Flatten(n => n.Children).Where(n => n.DeviceNodeObject.Problem == 0)                
    [0x0]            : ROOT\volmgr\0000 (volmgr)
    [0x1]            : ROOT\BasicDisplay\0000 (BasicDisplay)
    [0x2]            : ROOT\CompositeBus\0000 (CompositeBus)
    [0x3]            : ROOT\vdrvroot\0000 (vdrvroot)
...

Belirli bir sorunla tüm cihazları görüntüleme

Sorun durumu 0x16 olan cihazları görüntülemek için bu komutu kullanın.

1: kd> dx @$cursession.Devices.DeviceTree.Flatten(n => n.Children).Where(n => n.DeviceNodeObject.Problem == 0x16)
@$cursession.Devices.DeviceTree.Flatten(n => n.Children).Where(n => n.DeviceNodeObject.Problem == 0x16)                
    [0x0]            : HTREE\ROOT\0
    [0x1]            : ACPI\PNP0700\4&215d0f95&0 (fdc)

Cihazları İşlev Sürücüsüne Göre Görüntüleme

Cihazları işlev sürücüsüne göre görüntülemek için bu komutu kullanın.

dx @$cursession.Devices.DeviceTree.Flatten(n => n.Children).Where(n => n.ServiceName <operator> <service name>)

Cihazları atapi gibi belirli bir işlev sürücüsü kullanarak görüntülemek için bu komutu kullanın.

1: kd> dx @$cursession.Devices.DeviceTree.Flatten(n => n.Children).Where(n => n.ServiceName == "atapi")
@$cursession.Devices.DeviceTree.Flatten(n => n.Children).Where(n => n.ServiceName == "atapi")                
    [0x0]            : PCIIDE\IDEChannel\4&10bf2f88&0&0 (atapi)
    [0x1]            : PCIIDE\IDEChannel\4&10bf2f88&0&1 (atapi)

Önyükleme Başlangıç Sürücülerinin Listesini Görüntüleme

Winload tarafından önyükleme başlangıç sürücüleri olarak yüklenenlerin listesini görüntülemek için, LoaderBlock'a erişiminizin olduğu ve LoaderBlock'un hala mevcut olduğu bir bağlamda olmanız gerekir. Örneğin, nt!IopInitializeBootDrivers sırasında. Kesme noktası, bu bağlamda durdurmak için ayarlanabilir.

1: kd> g
Breakpoint 0 hit
nt!IopInitializeBootDrivers:
8225c634 8bff            mov     edi,edi

?? kullanın Önyükleme sürücüsü yapısını görüntülemek için komut.

1: kd> ?? LoaderBlock->BootDriverListHead
struct _LIST_ENTRY
 [ 0x808c9960 - 0x808c8728 ]
   +0x000 Flink            : 0x808c9960 _LIST_ENTRY [ 0x808c93e8 - 0x808a2e18 ]
   +0x004 Blink            : 0x808c8728 _LIST_ENTRY [ 0x808a2e18 - 0x808c8de0 ]

Nt!_LIST_ENTRY yapısının başlangıç adresini kullanarak verileri görüntülemek için Debugger.Utility.Collections.FromListEntry hata ayıklayıcısı nesnesini kullanın.

1: kd> dx Debugger.Utility.Collections.FromListEntry(*(nt!_LIST_ENTRY *)0x808c9960, "nt!_BOOT_DRIVER_LIST_ENTRY", "Link")
Debugger.Utility.Collections.FromListEntry(*(nt!_LIST_ENTRY *)0x808c9960, "nt!_BOOT_DRIVER_LIST_ENTRY", "Link")                
    [0x0]            [Type: _BOOT_DRIVER_LIST_ENTRY]
    [0x1]            [Type: _BOOT_DRIVER_LIST_ENTRY]
    [0x2]            [Type: _BOOT_DRIVER_LIST_ENTRY]
    [0x3]            [Type: _BOOT_DRIVER_LIST_ENTRY]
    [0x4]            [Type: _BOOT_DRIVER_LIST_ENTRY]
    [0x5]            [Type: _BOOT_DRIVER_LIST_ENTRY]
...

Verilerin kılavuz görünümünü oluşturmak için -g seçeneğini kullanın.

dx -r1 -g Debugger.Utility.Collections.FromListEntry(*(nt!_LIST_ENTRY *)0x808c9960, "nt!_BOOT_DRIVER_LIST_ENTRY", "Link")

Cihazları Özelliğe göre görüntüleme

DeviceNodeObject.CapabilityFlags nesnesini kullanarak cihazları özelliğe göre görüntüleyin.

dx -r1 @$cursession.Devices.DeviceTree.Flatten(n => n.Children).Where(n => (n.DeviceNodeObject.CapabilityFlags & <flag>) != 0)

Bu tabloda, ortak cihaz yetenek bayraklarıyla dx komutunun kullanımı özetlenmiştir.

Çıkarılabilir

dbgcmd 0: kd> dx -r1 @$cursession. Devices.DeviceTree.Flatten(n => n.Children). Where(n => (n.DeviceNodeObject.CapabilityFlags &0x10) != 0) @$cursession. Devices.DeviceTree.Flatten(n => n.Children). Where(n => (n.DeviceNodeObject.CapabilityFlags &0x10) != 0)
[0x0] : SWD\PRINTENUM{2F8DBBB6-F246-4D84-BB1D-AA8761353885} [0x1] : SWD\PRINTENUM{F210BC77-55A1-4FCA-AA80-013E2B408378} [0x2] : SWD\PRINTENUM{07940A8E-11F4-46C3-B714-7FF9B87738F8} [0x3] : DISPLAY\Default_Monitor\6&1a097cd8&0&UID5527112 (monitör)

UniqueID

dbgcmd 0: kd> dx -r1 @$cursession. Devices.DeviceTree.Flatten(n => n.Children). Where(n => (n.DeviceNodeObject.CapabilityFlags &0x40) != 0) @$cursession. Devices.DeviceTree.Flatten(n => n.Children). Where(n => (n.DeviceNodeObject.CapabilityFlags &0x40) != 0)
[0x0] : HTREE\ROOT\0 [0x1] : ROOT\volmgr\0000 (volmgr) [0x2] : ROOT\spaceport\0000 (spaceport) ...

Sessiz Kurulum

dbgcmd 0: kd> dx -r1 @$cursession. Devices.DeviceTree.Flatten(n => n.Children). Where(n => (n.DeviceNodeObject.CapabilityFlags &0x80) != 0) @$cursession. Devices.DeviceTree.Flatten(n => n.Children). Where(n => (n.DeviceNodeObject.CapabilityFlags &0x80) != 0)
[0x0] : HTREE\ROOT\0 [0x1] : ROOT\volmgr\0000 (volmgr) [0x2] : ROOT\spaceport\0000 (spaceport) ...

RawDeviceOk

dbgcmd 0: kd> dx -r1 @$cursession. Devices.DeviceTree.Flatten(n => n.Children). Where(n => (n.DeviceNodeObject.CapabilityFlags &0x100) != 0) @$cursession. Devices.DeviceTree.Flatten(n => n.Children). Where(n => (n.DeviceNodeObject.CapabilityFlags &0x100) != 0)
[0x0] : HTREE\ROOT\0 [0x1] : SWD\MMDEVAPI\MicrosoftGSWavetableSynth [0x2] : SWD\IP_TUNNEL_VBUS\IP_TUNNEL_DEVICE_ROOT ...

SürprizKaldırmaTamam

dbgcmd 0: kd> dx -r1 @$cursession. Devices.DeviceTree.Flatten(n => n.Children). Where(n => (n.DeviceNodeObject.CapabilityFlags &0x200) != 0) @$cursession. Devices.DeviceTree.Flatten(n => n.Children). Where(n => (n.DeviceNodeObject.CapabilityFlags &0x200) != 0)
[0x0] : SWD\MMDEVAPI\MicrosoftGSWavetableSynth [0x1] : SWD\IP_TUNNEL_VBUS\IP_TUNNEL_DEVICE_ROOT [0x2] : SWD\PRINTENUM\PrintQueues ...

CapabilityFlags hakkında daha fazla bilgi için bkz. DEVICE_CAPABILITIES.

Ayrıca bkz.

dx (Display Debugger Object Model İfadesi)

NatVis'teki Yerel Hata Ayıklayıcı Nesneleri

JavaScript Uzantılarında Yerel Debugger Nesneleri