我有一个关于执行的 windbg 问题 作为断点命令的 javascript 函数。 此观察是在 windbg 预览版 10.0.17030.1002 中进行的 以及最近版本的 windbg 在 Windows 10 上调试 native x86 C++ 程序时。
测试设置
在我的 javascript 文件 dbg_test.js 中,我有以下函数:
function test()
{
var ctl = host.namespace.Debugger.Utility.Control;
host.diagnostics.debugLog(">>> Test\n");
ctl.ExecuteCommand("g");
}
在 windbg 中,我加载 javascript-provider,加载我的 dbg_test.js 脚本 并定义一个断点命令来调用这个 javascript 函数:
bs 0 "dx @$scriptContents.test()"
预期行为
字符串“>>> Test”显示在命令窗口的输出 Pane 中 每次 遇到断点 0 时。 调试器恢复执行。
观察到的行为
输出“>>> 测试”仅在第一次显示 当命中断点 0 时。 随后命中断点 0 不 产生任何输出。
备注
1) 使用“旧式”windbg-commands 进行类似测试效果很好:
bs 0 ".printf \">>> Test\\n\\n\";g;"
但仅结束并重新启动 windbg 之后
2) 当我将函数“test”的代码移动到函数“invokeScript()”并通过以下方式定义断点命令时,会显示相同的行为
bs 0 ".scriptrun d:\\dbg_scripts\\dbg_test.js"
3) 从 windbg 命令行运行脚本。
4) 在上面的测试场景中调用 javascript 函数在以前版本的 windbg 中有效。
5) 好像声明
ctl.ExecuteCommand("g");
是关键:如果我注释掉这条语句,那么断点 每次都被命中,
的输出host.diagnostics.debugLog(">>> Test\n");
在断点的每次命中时显示。 当然,我必须通过按 F5 或输入命令“g”手动恢复执行
问题
- 有人可以重现这个问题吗?
- 以这种方式使用 javascript 函数是否合法,还是我做错了什么?
非常感谢您的反馈!
亲切的问候!
最佳答案
我遇到了和你一样的问题。通过声明一个脚本全局变量,我能够在某种程度上绕过这个问题
var lines = [];
并将日志消息推送到这个数组而不是调试打印它们:
lines.push(">>> Test");
为了看到线条,我创建了一个函数
function print_lines() {
for (var line of lines) {
host.diagnostics.debugLog(line + "\n");
}
lines = [];
}
我是这样从提示中调用的
dx @$scriptContents.print_lines();
我知道这并没有真正回答您的问题,但它可能对面临同样问题的其他人有所帮助。
关于javascript - 在 windbg 断点命令中调用 javascript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47715274/