我有几个 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/