Серия
Средства дефрагментации #170 — отладчик — скрипты JavaScript
В этом эпизоде дефрагментации инструментов Эндрю Ричардс разговаривает с Энди Luhrs и Биллом Месмеромиз средств отладки для команды Windows. Мы говорим о новых возможностях расширяемости и скриптов JavaScript в WinDbg, доступных в сборке WDK и пакете SDK 14951 и более новых версиях.
- Блог- https://blogs.msdn.microsoft.com/windbg/
- Отправить по электронной почте- [email protected]
Билл использовал объектную модель отладчика ранее в следующих эпизодах:
- Средства дефрагментации #138 — отладка — "dx" Command Part 1
- Средства дефрагментации #139 — отладка — "dx" Command Part 2
- Средства дефрагментации #169 — средства отладки для команды Windows
Временная шкала.
[00:00] Приветствие и введение
[00:24] Новое удаление пакета SDK
[00:29] Почему JavaScript
[02:07] Новые команды
[03:50] Visual Studio Code
[04:00] Пример — Hello World
[07:15] Пространства имен отладчика по умолчанию
[09:07] Пример. Печать всех потоков
[10:26] Пример — условная точка останова
[18:13] 'g' против 'gc' - Эндрю был прав! "GC" возобновляет выполнение так же, как и началось. Таким образом, если вы ударите "p", а затем попали в условную точку останова, которая имеет в нем "gc", "gc" просто завершит ваш первоначальный "p".
[20:40] Пример — уникальные стеки
Пример [34:40] — добавление
Вопросы и комментарии? По электронной почте по адресу [email protected]
Документация MSDN для JavaScript:
- Скрипты отладчика JavaScript
- Примеры скриптов отладчика JavaScript
- Собственные объекты отладчика в расширениях JavaScript
Пример уникальных стеков (правильный):
"использовать строгий";
класс __stackEntry { конструктор(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 + " ");
}
}
}
класс __stackMap { конструктор(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 { конструктор(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]);
}
}
}
}
}
класс __threadExtension { get IdenticalStacks() { return new __threadSameStacks(this); } }
function invokeScript() { var map = new __stackMap(host.currentProcess); map.display(); }
function initializeScript() { return [new host.nameModelParent(__threadExtension, "Debugger.Models.Thread")]; }
В этом эпизоде дефрагментации инструментов Эндрю Ричардс разговаривает с Энди Luhrs и Биллом Месмеромиз средств отладки для команды Windows. Мы говорим о новых возможностях расширяемости и скриптов JavaScript в WinDbg, доступных в сборке WDK и пакете SDK 14951 и более новых версиях.
- Блог- https://blogs.msdn.microsoft.com/windbg/
- Отправить по электронной почте- [email protected]
Билл использовал объектную модель отладчика ранее в следующих эпизодах:
- Средства дефрагментации #138 — отладка — "dx" Command Part 1
- Средства дефрагментации #139 — отладка — "dx" Command Part 2
- Средства дефрагментации #169 — средства отладки для команды Windows
Временная шкала.
[00:00] Приветствие и введение
[00:24] Новое удаление пакета SDK
[00:29] Почему JavaScript
[02:07] Новые команды
[03:50] Visual Studio Code
[04:00] Пример — Hello World
[07:15] Пространства имен отладчика по умолчанию
[09:07] Пример. Печать всех потоков
[10:26] Пример — условная точка останова
[18:13] 'g' против 'gc' - Эндрю был прав! "GC" возобновляет выполнение так же, как и началось. Таким образом, если вы ударите "p", а затем попали в условную точку останова, которая имеет в нем "gc", "gc" просто завершит ваш первоначальный "p".
[20:40] Пример — уникальные стеки
Пример [34:40] — добавление
Вопросы и комментарии? По электронной почте по адресу [email protected]
Документация MSDN для JavaScript:
- Скрипты отладчика JavaScript
- Примеры скриптов отладчика JavaScript
- Собственные объекты отладчика в расширениях JavaScript
Пример уникальных стеков (правильный):
"использовать строгий";
класс __stackEntry { конструктор(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 + " ");
}
}
}
класс __stackMap { конструктор(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 { конструктор(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]);
}
}
}
}
}
класс __threadExtension { get IdenticalStacks() { return new __threadSameStacks(this); } }
function invokeScript() { var map = new __stackMap(host.currentProcess); map.display(); }
function initializeScript() { return [new host.nameModelParent(__threadExtension, "Debugger.Models.Thread")]; }
Хотите оставить отзыв? Сообщить о проблеме можно здесь.