Episode
Defrag Tools #170 - Debugger - JavaScript-Skripting
In dieser Episode von Defrag Tools spricht Andrew Richards mit Andy Luhrs und Bill Messmer aus dem Debugtools für Windows-Team. Wir sprechen über die neuen JavaScript-Erweiterbarkeits- und Skriptfähigkeiten in WinDbg, die im WDK- und SDK-Build 14951 und höher verfügbar sind.
- Blog- https://blogs.msdn.microsoft.com/windbg/
- E-Mail- windbgfb@microsoft.com
Bill nutzte das Debuggerobjektmodell zuvor in diesen Episoden:
- Defrag tools #138 - Debugging - 'dx' Command Part 1
- Defrag tools #139 - Debugging - 'dx' Command Part 2
- Defrag tools #169 – Debugging Tools for Windows Team
Zeitachse:
[00:00] Willkommen und Einführungen
[00:24] Neuer SDK-Drop
[00:29] Warum JavaScript
[02:07] Neue Befehle
[03:50] Visual Studio Code
[04:00] Beispiel - Hallo Welt
[07:15] Standardnamespaces des Debuggers
[09:07] Beispiel : Alle Threads drucken
[10:26] Beispiel - Bedingter Haltepunkt
[18:13] 'g' vs. 'gc' – Andrew war richtig! "gc" setzt die Ausführung auf die gleiche Weise fort, wie sie gestartet wurde. Wenn Sie also auf 'p' klicken und dann einen bedingten Haltepunkt treffen, der darin "gc" enthält, beendet das "gc" einfach ihre anfängliche "p".
[20:40] Beispiel - Eindeutige Stapel
[34:40] Beispiel - Addition
Fragen/Kommentare? Senden Sie uns eine E-Mail: defragtools@microsoft.com.
JavaScript MSDN-Dokumente:
- JavaScript-Debuggerskripting
- JavaScript-Debuggerbeispielskripts
- Native Debugger-Objekte in JavaScript-Erweiterungen
Unique Stacks (Beispiel) (das rechte Beispiel):
"strikte Verwendung";
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]);
}
}
}
}
}
class __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")]; }
In dieser Episode von Defrag Tools spricht Andrew Richards mit Andy Luhrs und Bill Messmer aus dem Debugtools für Windows-Team. Wir sprechen über die neuen JavaScript-Erweiterbarkeits- und Skriptfähigkeiten in WinDbg, die im WDK- und SDK-Build 14951 und höher verfügbar sind.
- Blog- https://blogs.msdn.microsoft.com/windbg/
- E-Mail- windbgfb@microsoft.com
Bill nutzte das Debuggerobjektmodell zuvor in diesen Episoden:
- Defrag tools #138 - Debugging - 'dx' Command Part 1
- Defrag tools #139 - Debugging - 'dx' Command Part 2
- Defrag tools #169 – Debugging Tools for Windows Team
Zeitachse:
[00:00] Willkommen und Einführungen
[00:24] Neuer SDK-Drop
[00:29] Warum JavaScript
[02:07] Neue Befehle
[03:50] Visual Studio Code
[04:00] Beispiel - Hallo Welt
[07:15] Standardnamespaces des Debuggers
[09:07] Beispiel : Alle Threads drucken
[10:26] Beispiel - Bedingter Haltepunkt
[18:13] 'g' vs. 'gc' – Andrew war richtig! "gc" setzt die Ausführung auf die gleiche Weise fort, wie sie gestartet wurde. Wenn Sie also auf 'p' klicken und dann einen bedingten Haltepunkt treffen, der darin "gc" enthält, beendet das "gc" einfach ihre anfängliche "p".
[20:40] Beispiel - Eindeutige Stapel
[34:40] Beispiel - Addition
Fragen/Kommentare? Senden Sie uns eine E-Mail: defragtools@microsoft.com.
JavaScript MSDN-Dokumente:
- JavaScript-Debuggerskripting
- JavaScript-Debuggerbeispielskripts
- Native Debugger-Objekte in JavaScript-Erweiterungen
Unique Stacks (Beispiel) (das rechte Beispiel):
"strikte Verwendung";
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]);
}
}
}
}
}
class __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")]; }
Feedback? Melden Sie hier ein Problem.