javascript - 如何在 WinDbg 中引用不同脚本中定义的 JavaScript 函数?

标签 javascript windbg

我有几个 JavaScript 脚本来容纳我的函数(用于模块化和重用)。我从正在运行的 Windbg 脚本加载它们。在一个脚本中,如何调用另一个脚本中定义的函数?

该引擎似乎不支持 import/export浏览器使用的功能。

在调试器脚本中,我必须使用 @$scriptContents 来访问 JavaScript 函数。 如何在 JavaScript 函数中完成类似的事情?

实验

我希望所有 JavaScript 函数都有某种全局命名空间,但似乎没有。

考虑

// t1.js
function func1() {
    host.diagnostics.debugLog('func1()...\n');
}

// t2.js
function func2() {
    host.diagnostics.debugLog('func2()...\n');
    func1();
}

在我的 cdb session 中

0:000> .load jsprovider.dll
0:000> .scriptload t1.js
JavaScript script successfully loaded from 't1.js'
0:000> .scriptload t2.js
JavaScript script successfully loaded from 't2.js'
0:000> dx @$scriptContents.func1()
func1()...
@$scriptContents.func1()
0:000> dx @$scriptContents.func2()
func2()...
Error: 'func1' is not defined [at t2 (line 3 col 5)]

编辑

@Mosè Raguzzini的评论和this answer ,我寻找一些方法来引用“外部”函数。 我最终发现了这个

host.namespace.Debugger.State.DebuggerVariables.scriptContents

作为所有功能的容器。这有记录在某处吗?有没有更简单的方法可以到达那里? (我意识到我可以为该对象分配一个短变量;我只是怀疑这更像是一个具有非常简单前门的后门,但我不知道前门在哪里。)

最佳答案

据我所知,所有脚本都是在全局范围内导入的,因此一旦加载了所有脚本,您就可以像将它们编写在单个文件中一样操作。

示例 ( REF to blabb answer )

common.js 有一些通常可重用的函数,例如 host.diagnostics.debugLog()

首先使用.scriptload加载它

然后在其他js文件中为这些函数创建一个var并使用它

常用函数文件内容

C:\>cat c:\wdscr\common.js
function log(instr) {
    host.diagnostics.debugLog(instr + "\n");
}
function exec (cmdstr){
    return host.namespace.Debugger.Utility.Control.ExecuteCommand(cmdstr);
}

使用 common.js 中函数的 js 文件

C:\>cat c:\wdscr\usecommon.js
function foo(){
    var commonlog = host.namespace.Debugger.State.Scripts.common.Contents.log
    var commonexec = host.namespace.Debugger.State.Scripts.common.Contents.exec
    commonlog("we are using the logging function from the common.js file")

    var blah = commonexec("lma @$exentry")
    for(var a of blah) {
        commonlog(a)
    }
}

实际使用情况

C:\>cdb calc
Microsoft (R) Windows Debugger Version 10.0.16299.15 X86

0:000> .load jsprovider

0:000> .scriptload c:\wdscr\common.js
JavaScript script successfully loaded from 'c:\wdscr\common.js'

0:000> .scriptload c:\wdscr\usecommon.js
JavaScript script successfully loaded from 'c:\wdscr\usecommon.js'

0:000> dx @$scriptContents.foo()

we are using the logging function from the common.js file 
start    end        module name
00f10000 00fd0000   calc       (deferred)
@$scriptContents.foo()
0:000>

关于javascript - 如何在 WinDbg 中引用不同脚本中定义的 JavaScript 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57308910/

相关文章:

javascript - 单击按钮时更改嵌入式 youtube 视频中的时间

JavaScript 只工作一次

javascript - 外国时间到本地时间

windows - 无法使用选项上的 bcdedit/debug 启动 Windows 7(32 位)

c# - 使用 windbg 时有没有办法中断特定的 CLR 异常

javascript - PassportJS - 动态设置状态以允许在回调时重定向

javascript - React 测试库如何使用 waitFor

c++ - 如何使用 windbg "dt"命令从命名空间污染的内存转储中获取信息

debugging - 故障转储 - WinDbg - 强制 PDB 文件匹配不起作用?

WinDbg:使用 .if 中的条件命令