Windbg脚本-回显变量的类类型

时间:2018-11-20 11:04:34

标签: class types scripting windbg

在Windbg中,我有一个脚本可以遍历堆栈的各个帧,并且可以很好地将感兴趣的内容拉回,并将它们回显到“命令窗口”(它只是嗅出需要进一步研究的内容)。

在某些框架中,会有一些我感兴趣的this。我当然可以提取细节,但是我也想从中获取实际的类类型。我知道,如果我接着进行dv /t,将会看到类似以下的内容:

0:115> .frame 14
0:115> dv /t
class foo1 * this = 0x00000000e9ed0010

我希望能够仅将foo1传递给.printf命令。

在不仅仅是this的框架中,显然可以使用模式dv /t this来限制输出,但是有一种很好的方法可以使框架中的内容如下所示,而我能够提取foo1

0:115> .frame 17
0:115> dv /t
class foo1 * this = 0x00000000f3e2f568
class foo2 * bar2 = 0x0000000000000001
bool _somebool = true

执行以下操作非常接近我想要的有限输出...但是我只是想把它整理一下。

0:115> .frame 17
0:115> dv /t this
class foo1 * this = 0x00000000f3e2f568

下面是blabb的示例代码:

0:000> dv /t
class Time * this = 0x001efb24
int h = 0n23
int m = 0n59
int s = 0n59
0:000> dv /t this
class Time * this = 0x001efb24
0:000> some command
Time

第三个命令就是我要寻找的。

2 个答案:

答案 0 :(得分:0)

我的理解是:您需要一个以foo1作为参数并给出类似dv /t的输出,但仅针对所有foo1的命令。

恕我直言,内置的WinDbg功能几乎不可能。您可以摆弄.foreach和诸如此类的$spat

一种可能性是.shell以及命令行工具findstr或Cygwin grep。但这并不方便,因为它总是输出Process started等。您可以再次使用.foreach并跳过一些标记来解决此问题,但这很乏味。

WinDbg有grep个实现,例如long123king's grep plugin,如果我没记错的话,PDE中还有一个grep实现。

然后是,它具有Python的功能,让您基本上可以做任何事情。

答案 1 :(得分:0)

我不确定我是否了解您的需求
但是您是否尝试过给新的dx表达式评估器

例如

0:000> dv /t
class Time * this = 0x001efb24
int h = 0n23
int m = 0n59
int s = 0n59
0:000> dv /t this
class Time * this = 0x001efb24
0:000> dx @$curstack.Frames[0].LocalVariables
@$curstack.Frames[0].LocalVariables                
    this             : 0x1efb24 [Type: Time *]
0:000> dx @$curstack.Frames[0].LocalVariables.this
@$curstack.Frames[0].LocalVariables.this                 : 0x1efb24 [Type: Time *]
    [+0x000] hour             : 23 [Type: int]
    [+0x004] minute           : 59 [Type: int]
    [+0x008] second           : 59 [Type: int]

您可以使用javascript进行增强,以根据需要对其进行微调

这是您可以使用javascript增强的方法

制作一个文件whateverfoo.js,其内容如下

function log(logstr) {
    return host.diagnostics.debugLog(logstr + "\n")
}
function locvartgttyp(frameno)
{
    log( host.currentThread.Stack.Frames[frameno].LocalVariables.this.targetType.name)
}

并像

一样使用它
:\>echo %wdbg%
"c:\Program Files\Windows Kits\10\Debuggers\x86\cdb.exe"

:\>%wdbg% time.exe

Microsoft (R) Windows Debugger Version 10.0.17763.132 X86

0:000> g time!main

time!main:
01237a80 55              push    ebp
0:000> tc;t

time!Time::Time:
01231140 55              push    ebp

0:000> dv /t
class Time * this = 0x00000002
int h = 0n23
int m = 0n59
int s = 0n59

0:000> .load jsprovider

0:000> .scriptload c:\wdscr\locvar.js

JavaScript script successfully loaded from 'c:\wdscr\locvar.js'

0:000> dx @$scriptContents.locvartgttyp(0)
Time *

@$scriptContents.locvartgttyp(0)
0:000>