在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
第三个命令就是我要寻找的。 p>
答案 0 :(得分:0)
我的理解是:您需要一个以foo1
作为参数并给出类似dv /t
的输出,但仅针对所有foo1
的命令。
恕我直言,内置的WinDbg功能几乎不可能。您可以摆弄.foreach
和诸如此类的$spat
。
一种可能性是.shell
以及命令行工具findstr
或Cygwin grep
。但这并不方便,因为它总是输出Process started
等。您可以再次使用.foreach
并跳过一些标记来解决此问题,但这很乏味。
WinDbg有grep
个实现,例如long123king's grep plugin,如果我没记错的话,PDE中还有一个grep实现。
然后是pykd,它具有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>