在WindBG断点命令中调用JavaScript函数

Calling javascript functions in windbg breakpoint-commands

本文关键字:调用 JavaScript 函数 命令 WindBG 断点      更新时间:2023-10-16

我有一个关于执行的windbg-issueJavaScript功能作为断点命令。该观察结果是在WindBG预览10.0.17030.1002中进行的以及最近版本的windbg在Windows 10上调试本机X86 C 程序时。

测试设置

在我的javascript-file dbg_test.js中,我有以下功能:

function test()
{
   var ctl = host.namespace.Debugger.Utility.Control;
   host.diagnostics.debugLog(">>> Testn");
   ctl.ExecuteCommand("g");
}

在windbg中,我加载了javascript-provider,加载我的dbg_test.js脚本并定义一个命令命令的断点命令:

  bs 0 "dx @$scriptContents.test()"

预期行为

字符串">>>测试"在命令窗的输出窗格中显示每次当打断点0时。调试器恢复执行。

观察到的行为

输出">>>测试"仅首次显示当断点0击中时。随后击中断点0没有产生任何输出。

备注

1)使用"旧样式"进行类似测试,windbg-commands可以正常工作:

bs 0 ".printf ">>> Test\n\n";g;"

但是仅在结束和重新启动windbg

之后

2)当我将函数"测试"的码移动到函数" Invokescript()"并通过

定义断点命令时,显示了相同的行为。
bs 0 ".scriptrun d:\dbg_scripts\dbg_test.js"

3)从windbg-command-line工作中运行脚本。

4)在上面的测试中,调用JavaScript功能在以前的版本的WindBG中工作。

5)似乎语句

ctl.ExecuteCommand("g");

是至关重要的:如果我评论此陈述,则是断点 每次都被击中

的输出
host.diagnostics.debugLog(">>> Testn");

显示在断点的每个命中。 当然,我必须通过按F5或输入命令" G"

手动恢复执行

问题

  1. 有人可以复制这个问题吗?
  2. 以这种方式使用JavaScript功能是合法的还是我在这里做错了什么?

您的反馈非常感谢!

善良/最好的问候!

我遇到了与您相同的问题。我能够通过声明脚本全局变量来绕过问题

var lines = [];

并将日志消息推向此数组,而不是调试它们:

lines.push(">>> Test");

为了查看行,我创建了一个函数

function print_lines() {
   for (var line of lines) {
      host.diagnostics.debugLog(line + "n");
   }
   lines = [];
}

我从提示符下打来的

dx @$scriptContents.print_lines();

我知道这并不是真正回答您的问题,但这对于其他面临同样问题的人可能仍然有帮助。