在WinDbg中执行下一个命令
.foreach (function_name {x /1 JittyProject!*}) {.echo function_name}
结果应为
JittyProject!ApplyAsync
....
是否可能以某种方式从另一个变量function_name
中的JittyProject
中的ApplyAsync
解析
!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