Bölüm

Birleştirme Araçları #170 - Hata Ayıklayıcısı - JavaScript Betiği Oluşturma

Defrag Tools'un bu bölümünde Andrew Richards, Windows için Hata Ayıklama Araçları ekibinden Andy Luhrs ve Bill Messmer ile konuşuyor. WDK ve SDK derlemesi 14951 ve daha yeni sürümlerde bulunan WinDbg'deki yeni JavaScript genişletilebilirlik ve betik oluşturma yeteneklerinden bahsediyoruz.

Bill, bu bölümlerde daha önce hata ayıklayıcı nesne modelinden yararlandı:

Zaman Çizelgesi:

[00:00] Hoş geldiniz ve girişler
[00:24] Yeni SDK bırakma
[00:29] Neden JavaScript
[02:07] Yeni komutlar
[03:50] Visual Studio Code
[04:00] Örnek - Merhaba Dünya
[07:15] Hata ayıklayıcısı varsayılan ad alanları
[09:07] Örnek - Tüm iş parçacıklarını yazdırma
[10:26] Örnek - Koşullu kesme noktası
[18:13] 'g' ile 'gc' karşılaştırması – Andrew haklıydı! 'gc', yürütmeyi başlattığı gibi sürdürür. Bu nedenle, 'p' tuşuna basıp içinde 'gc' bulunan bir koşullu kesme noktasına isabet ederseniz, 'gc' yalnızca ilk 'p' işleminizi tamamlar.
[20:40] Örnek - Benzersiz yığınlar
[34:40] Örnek - Ekleme

Sorular/Yorumlar? Bize şu adreste e-posta gönderin: defragtools@microsoft.com

JavaScript MSDN Belgeleri:

Benzersiz Yığınlar Örneği (doğru olan):

"katı kullanma";

class __stackEntry { constructor(frameString) { this.threads = []; this.frameString = frameString; this.children = new Map(); }

display(indent) 
{
    for (var child of this.children.values())
    {
        host.diagnostics.debugLog(indent, child.frameString, " [Threads In Branch: ");
        for (var thread of child.threads)
        {
            host.diagnostics.debugLog(thread.Id, " ");
        }
        host.diagnostics.debugLog("]\n");
        child.display(indent + "    ");
    }
}

}

class __stackMap { constructor(process) { this.__process = process; this.__root = new __stackEntry(""); this.build(); }

build()
{
    for (var thread of this.__process.Threads)
    {
        var current = this.__root;
        var frameNum = 0;

        var frameCount = thread.Stack.Frames.Count();
        for (var frameNum = frameCount - 1; frameNum >= 0; --frameNum) {
            var frame = thread.Stack.Frames[frameNum];
            var frameString = frame.toString();
            if (current.children.has(frameString)) {
                current = current.children.get(frameString);
                current.threads.push(thread);
            }
            else {
                var newEntry = new __stackEntry(frameString);
                current.children.set(frameString, newEntry);
                current = newEntry;
                current.threads.push(thread);
            }
        }
    }
}

findEntry(thread)
{
    var current = this.__root;
    var frameCount = thread.Stack.Frames.Count();
    for (var frameNum = frameCount - 1; frameNum >= 0; --frameNum)
    {
        var frame = thread.Stack.Frames[frameNum];
        var frameString = frame.toString();
        if (!current.children.has(frameString))
        {
            return null;
        }
        current = current.children.get(frameString);
    }
    return current;
}

display()
{
    this.__root.display("");
}

}

class __threadSameStacks { constructor(thread) { this.__thread = thread; }

getDimensionality()
{
    return 1;
}

getValueAt(idx)
{
    for (var idxVal of this)
    {
        var tid = idxVal[Symbol.indicies][0];
        if (idxVal[Symbol.indicies][0] == idx && tid != this.__thread.Id)
        {
            return idxVal.value;
        }
    }
    return undefined;
}

*[Symbol.iterator]()
{
    var context = this.__thread.hostContext;
    var session = host.namespace.Debugger.Sessions.getValueAt(context);
    var process = session.Processes.getValueAt(context);
    var map = new __stackMap(process);
    var entry = map.findEntry(this.__thread);
    if (entry != null)
    {
        for (var sharingThread of entry.threads)
        {
            if (sharingThread.Id != this.__thread.Id)
            {
                yield new host.indexedValue(sharingThread, [sharingThread.Id]);
            }
        }
    }
}

}

sınıf __threadExtension { get IdenticalStacks() { return new __threadSameStacks(this); } }

function invokeScript() { var map = new __stackMap(host.currentProcess); map.display(); }

function initializeScript() { return [new host.namedModelParent(__threadExtension, "Debugger.Models.Thread")]; }

Geri bildirimde bulunmak ister misiniz? Burada bir sorun gönderin.