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.
- Blog- https://blogs.msdn.microsoft.com/windbg/
- E-posta- windbgfb@microsoft.com
Bill, bu bölümlerde daha önce hata ayıklayıcı nesne modelinden yararlandı:
- Birleştirme Araçları #138 - Hata Ayıklama - 'dx' Komut Bölüm 1
- Birleştirme Araçları #139 - Hata Ayıklama - 'dx' Komut Bölümü 2
- Birleştirme Araçları #169 - Windows Ekibi için Hata Ayıklama Araçları
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:
- JavaScript Hata Ayıklayıcısı Betiği Oluşturma
- JavaScript Hata Ayıklayıcısı Örnek Betikleri
- JavaScript Uzantılarında Yerel Hata Ayıklayıcı Nesneleri
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")]; }
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.
- Blog- https://blogs.msdn.microsoft.com/windbg/
- E-posta- windbgfb@microsoft.com
Bill, bu bölümlerde daha önce hata ayıklayıcı nesne modelinden yararlandı:
- Birleştirme Araçları #138 - Hata Ayıklama - 'dx' Komut Bölüm 1
- Birleştirme Araçları #139 - Hata Ayıklama - 'dx' Komut Bölümü 2
- Birleştirme Araçları #169 - Windows Ekibi için Hata Ayıklama Araçları
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:
- JavaScript Hata Ayıklayıcısı Betiği Oluşturma
- JavaScript Hata Ayıklayıcısı Örnek Betikleri
- JavaScript Uzantılarında Yerel Hata Ayıklayıcı Nesneleri
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")]; }