。foreach值的Windbg解析变量

问题描述 投票:0回答:1

在WinDbg中执行下一个命令

.foreach (function_name {x /1 JittyProject!*}) {.echo function_name}

结果应为

JittyProject!ApplyAsync
....

是否可能以某种方式从另一个变量function_name中的JittyProject中的ApplyAsync解析

c# windbg
1个回答
0
投票

!for_each_function 过去是越野车它需要私有pdbs如果您使用未记录的-f开关强制其使用公共pdbs它会无限期地挂起,直到您终止windbg

从.foreach输出中解析出一个完整的字符串是PITA

基本函数名称可以并且确实包含空格.foreach认为每个空间都是分隔符因此会将函数名称分成多个标记

。foreach不接受ctrl + c或ctrl + break或alt + delete,因此它将继续喷出毒液直到死掉

如果您可以使用最新的windbg,我建议您切换到javascript或natvis

下面是仅使用dx natvis表达式求值器的输出

执行命令并获得结果数组到用户变量中

dx @$foo = Debugger.Utility.Control.ExecuteCommand("x /1 calc!*")

上面数组的一些示例成员(请注意,下面的最后一个条目有很多空格,.foreach会将其切成尽可能多的空格)

0:000> dx -r0 @$foo[4]
@$foo[4]         : calc!CContainer::ToggleHistoryFunc
0:000> dx -r0 @$foo[101]
@$foo[101]       : calc!`ATL::CAtlRECharTraitsW::GetAbbrevs'::`2'::s_szAbbrevs
0:000> dx -r0 @$foo[861]
@$foo[861]       : calc!ATL::AtlAdd<unsigned int>
0:000> dx -r0 @$foo[1684]
@$foo[1684]      : calc!ATL::CAtlMap<ATL::CStringT<unsigned short,ATL::StrTraitATL<unsigned short,ATL::ChTraitsCRT<unsigned short> > > *,FORMULA_DEFINTION *,MyCStringPtrTrait,ATL::CElementTraits<FORMULA_DEFINTION *> >::GetKeyAt

数组中有2925或0xb6d函数

0:000> dx @$foo.Count(),x; dx @$foo.Count(),d
@$foo.Count(),x  : 0xb6d
@$foo.Count(),d  : 2925



0:000> dx -r0 @$foo[2925]
Error: <Unable to get error code text> (0x8000000b) <<< out of bounds
0:000> dx -r0 @$foo[2924]
@$foo[2924]      : calc!Gdiplus::Image::`vector deleting destructor'

现在您有了一个数组,可以使用!来获取每个数组的子字符串。作为分隔符

0:000> dx -r1 @$foo.Select(p=> new{ Module = p.Substring(0,p.IndexOf("!")), FName = p.Substring(p.IndexOf("!")) })[2924]
@$foo.Select(p=> new{ Module = p.Substring(0,p.IndexOf("!")), FName = p.Substring(p.IndexOf("!")) })[2924]                
    Module           : calc
    FName            : !Gdiplus::Image::`vector deleting destructor'


0:000> dx -r1 @$foo.Select(p=> new{ Module = p.Substring(0,p.IndexOf("!")), FName = p.Substring(p.IndexOf("!")) })[864]
@$foo.Select(p=> new{ Module = p.Substring(0,p.IndexOf("!")), FName = p.Substring(p.IndexOf("!")) })[864]                
    Module           : calc
    FName            : !_real


0:000> dx -r1 @$foo.Select(p=> new{ Module = p.Substring(0,p.IndexOf("!")), FName = p.Substring(p.IndexOf("!")) })[1684]
@$foo.Select(p=> new{ Module = p.Substring(0,p.IndexOf("!")), FName = p.Substring(p.IndexOf("!")) })[1684]                
    Module           : calc
    FName            : !ATL::CAtlMap<ATL::CStringT<unsigned short,ATL::StrTraitATL<unsigned short,ATL::ChTraitsCRT<unsigned short> > > *,FORMULA_DEFINTION *,MyCStringPtrTrait,ATL::CElementTraits<FORMULA_DEFINTION *> >::GetKeyAt
© www.soinside.com 2019 - 2024. All rights reserved.