WinDbg 在堆上找到所有 X 类型的 C++ 对象,这些对象不使用继承(无 vftable)
WinDbg find all C++ objects of type X on heap that do not use inheritance (no vftable)
我有一个带有调试符号的 C++ 应用程序,并创建了一个启用了所有相关 gflags 的此类应用程序的转储文件:
gflags /i xxx.exe +hpa
gflags /i xxx.exe +ust
现在,我从其他问题 (see here) 中发现,通过首先查找类型的 vftable 地址:
x module!SomeClass*table*
然后在堆中搜索该地址:
!heap -srch 'address_of_vtable'
我可以找到该类型的所有实例。这是真的,如果这种类型的 vftable 存在。
据我所知,vftable 只为使用继承的类型创建,但如果一个类型根本不使用继承,那么它就不会被创建。
如果未创建 vftable,则上述方法似乎不起作用。我可以使用(无 vftable)找到该类型的地址:
x module!SomeClass::SomeClass
但是,如果我在堆中搜索返回的地址,则没有匹配项,尽管我知道我有多个此类实例。
其他人所做的是,但是为了调试而以这种方式修改代码库对于现有的大型代码库来说似乎不是一个好的或实用的方法。
有没有一种方法,结合 windbg 命令,在转储文件中查找(非继承)类型的实例而无需修改源代码?
注意:我知道还有其他用于堆分析的工具,例如 umdh 和 WPR 的堆快照,但我假设我只有一个常规的、完整的、好的老式转储。所有堆信息都在那个转储中,有符号和来源,所以一定有办法,对吧?
鉴于可以用随机字节创建对象(只要满足对齐要求),就不可能说某些随机字节集合是否属于任何特定类型。即使在存在匹配 vtable 指针的值的情况下,这也只是一个非常强烈的提示,而不是确凿的证据。毕竟,无论出于何种原因,都有可能拥有一个恰好具有与 vtable 地址匹配的值的完整成员。
考虑到这一现实,我想说甚至猜测没有 vtable 匹配值的字节集合的类型是不可能的。
我有一个带有调试符号的 C++ 应用程序,并创建了一个启用了所有相关 gflags 的此类应用程序的转储文件:
gflags /i xxx.exe +hpa
gflags /i xxx.exe +ust
现在,我从其他问题 (see here) 中发现,通过首先查找类型的 vftable 地址:
x module!SomeClass*table*
然后在堆中搜索该地址:
!heap -srch 'address_of_vtable'
我可以找到该类型的所有实例。这是真的,如果这种类型的 vftable 存在。
据我所知,vftable 只为使用继承的类型创建,但如果一个类型根本不使用继承,那么它就不会被创建。
如果未创建 vftable,则上述方法似乎不起作用。我可以使用(无 vftable)找到该类型的地址:
x module!SomeClass::SomeClass
但是,如果我在堆中搜索返回的地址,则没有匹配项,尽管我知道我有多个此类实例。
其他人所做的是
有没有一种方法,结合 windbg 命令,在转储文件中查找(非继承)类型的实例而无需修改源代码?
注意:我知道还有其他用于堆分析的工具,例如 umdh 和 WPR 的堆快照,但我假设我只有一个常规的、完整的、好的老式转储。所有堆信息都在那个转储中,有符号和来源,所以一定有办法,对吧?
鉴于可以用随机字节创建对象(只要满足对齐要求),就不可能说某些随机字节集合是否属于任何特定类型。即使在存在匹配 vtable 指针的值的情况下,这也只是一个非常强烈的提示,而不是确凿的证据。毕竟,无论出于何种原因,都有可能拥有一个恰好具有与 vtable 地址匹配的值的完整成员。
考虑到这一现实,我想说甚至猜测没有 vtable 匹配值的字节集合的类型是不可能的。