Avsnitt
Defragmenteringsverktyg #170 – Felsökningsprogram – JavaScript-skript
I det här avsnittet av Defrag Tools pratar Andrew Richards med Andy Luhrs och Bill Messmer från teamet för felsökningsverktyg för Windows. Vi pratar om de nya funktionerna för Utökningsbarhet och skript i JavaScript i WinDbg i WDK och SDK build 14951 och senare.
- Blogg- https://blogs.msdn.microsoft.com/windbg/
- Email- windbgfb@microsoft.com
Bill använde felsökningsobjektmodellen tidigare i dessa avsnitt:
- Defragmenteringsverktyg #138 – Felsökning – DX-kommandodel 1
- Defragmenteringsverktyg #139 – Felsökning – DX-kommandodel 2
- Defragmenteringsverktyg #169 – Felsökningsverktyg för Windows Team
Tidslinje:
[00:00] Välkommen och introduktioner
[00:24] Ny SDK-droppe
[00:29] Varför JavaScript
[02:07] Nya kommandon
[03:50] Visual Studio Code
[04:00] Exempel – Hello World
[07:15] Felsökarens standardnamnområden
[09:07] Exempel – Skriv ut alla trådar
[10:26] Exempel – Villkorsstyrd brytpunkt
[18:13] "g" mot "gc" - Andrew hade rätt! "gc" återupptar körningen på samma sätt som den startade. Så om du trycker på "p" och sedan träffar en villkorlig brytpunkt som har "gc" i den, kommer "gc" bara att avsluta din första "p".
[20:40] Exempel – Unika staplar
[34:40] Exempel – Tillägg
Frågor/kommentarer? Skicka e-post till oss på defragtools@microsoft.com
JavaScript MSDN Docs:
- Skript för JavaScript-felsökningsprogram
- Exempelskript för JavaScript-felsökningsprogram
- Interna felsökningsobjekt i JavaScript-tillägg
Exempel på unika staplar (det rätta):
"använd strikt";
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")]; }
I det här avsnittet av Defrag Tools pratar Andrew Richards med Andy Luhrs och Bill Messmer från teamet för felsökningsverktyg för Windows. Vi pratar om de nya funktionerna för Utökningsbarhet och skript i JavaScript i WinDbg i WDK och SDK build 14951 och senare.
- Blogg- https://blogs.msdn.microsoft.com/windbg/
- Email- windbgfb@microsoft.com
Bill använde felsökningsobjektmodellen tidigare i dessa avsnitt:
- Defragmenteringsverktyg #138 – Felsökning – DX-kommandodel 1
- Defragmenteringsverktyg #139 – Felsökning – DX-kommandodel 2
- Defragmenteringsverktyg #169 – Felsökningsverktyg för Windows Team
Tidslinje:
[00:00] Välkommen och introduktioner
[00:24] Ny SDK-droppe
[00:29] Varför JavaScript
[02:07] Nya kommandon
[03:50] Visual Studio Code
[04:00] Exempel – Hello World
[07:15] Felsökarens standardnamnområden
[09:07] Exempel – Skriv ut alla trådar
[10:26] Exempel – Villkorsstyrd brytpunkt
[18:13] "g" mot "gc" - Andrew hade rätt! "gc" återupptar körningen på samma sätt som den startade. Så om du trycker på "p" och sedan träffar en villkorlig brytpunkt som har "gc" i den, kommer "gc" bara att avsluta din första "p".
[20:40] Exempel – Unika staplar
[34:40] Exempel – Tillägg
Frågor/kommentarer? Skicka e-post till oss på defragtools@microsoft.com
JavaScript MSDN Docs:
- Skript för JavaScript-felsökningsprogram
- Exempelskript för JavaScript-felsökningsprogram
- Interna felsökningsobjekt i JavaScript-tillägg
Exempel på unika staplar (det rätta):
"använd strikt";
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")]; }