如何从对象/类中找到第一个字段?
How to find the first field from an object/class?
早上好, 在这篇文章中,我正在寻找一种在转储中查找CString
条目的方法,但我仍然是:-(
似乎可以根据 Windbgx /2
结果中提到的第一个字段找到与对象相关的条目。对于具有虚拟方法的对象,这似乎是__vptr
字段(对应于*vftable'
条目(,我认为这个问题对于CString
类的特定情况来说很容易。
在源代码(C:Program Files (x86)Microsoft Visual Studio2017ProfessionalVCToolsMSVC<version>crtsrcvcruntimeundname.cxx
(中,我找到了以下条目:
#if ( !NO_COMPILER_NAMES )
"`vftable'", <--- vftable: the one I'm working with
"`vbtable'",
"`vcall'",
"`typeof'",
"`local static guard'",
"`string'",
"`vbase destructor'",
"`vector deleting destructor'",
"`default constructor closure'",
"`scalar deleting destructor'",
"`vector constructor iterator'",
"`vector destructor iterator'",
"`vector vbase constructor iterator'",
"`virtual displacement map'",
"`eh vector constructor iterator'",
"`eh vector destructor iterator'",
"`eh vector vbase constructor iterator'",
"`copy constructor closure'",
"`udt returning'",
"`EH", //eh initialized struct
"`RTTI", //rtti initialized struct
"`local vftable'",
"`local vftable constructor closure'",
#endif // !NO_COMPILER_NAMES
这让我想知道我是否可以使用上述条目之一作为对象第一个字段的候选者。我已经发现windbg
的x /2 *!ATL::CStringT*
命令中存在一个条目,以scalar deleting destructor'
结尾,但我不知道我是否可以将其用作"第一个字段"候选。
附言如果你想知道"但你为什么不试试呢?",有一个问题是,我的转储文件中存在的CStringT
对象包含相当多的奇怪字符,这使得很难看到我是否在做正确的事情,看到奇怪但正确的字符,或者我是否在看虚假的结果。
提前致谢
似乎CString
只是封装了一个指针,没有任何虚拟方法,所以没有vtable。
这里有一个小例子:
#include <atlstr.h>
void SayHello(CHAR* arg)
{
CStringA cstring = arg;
CStringA message = "Hello " + cstring + "!";
printf("message: %s", (LPCSTR)message);
}
int main(int argc, CHAR** argv)
{
if (argc < 2)
return -1;
SayHello(argv[1]);
return 0;
}
将生成的可执行文件放在 Windbg 中,并以world
作为参数开始。
放一个BP然后去
0:000> bp ConsoleApplication1!SayHello
0:000> bl
0 e Disable Clear x86 00000000`01041420 0001 (0001) 0:**** ConsoleApplication1!SayHello
0:000> g
BP 被命中;只需一步一步即可传递cstring
本地 var init:
Breakpoint 0 hit
ConsoleApplication1!SayHello:
01041420 55 push ebp
0:000:x86> p
您可以使用dt
命令(显示类型(查看类型中的字段。 在此处用于查看本地变量cstring
:
0:000:x86> dt cstring
Local var @ 0x114f944 Type ATL::CStringT<char,ATL::StrTraitATL<char,ATL::ChTraitsCRT<char> > >
+0x000 m_pszData : 0x01224e20 "world"
CString
中只有一个字段,它的名字是m_pszData
,只是一个指针:
0:000:x86> dx -r1 ((ConsoleApplication1!char *)0x1224e20)
((ConsoleApplication1!char *)0x1224e20) : 0x1224e20 : "world" [Type: char *]
本地 var 上的sizeof
运算符仅给出 4
0:000:x86> ?? sizeof(cstring)
unsigned int 4
经da
确认:
0:000:x86> dp cstring L4
0114f944 01224e20 3ec0fed1 0114f998 01042bf1
0:000:x86> da 01224e20
01224e20 "world"
您将无法在转储中找到CString
实例,因为它们只是指向数据的指针。
- 如何从对象/类中找到第一个字段?
- C++创建一个链表,每个节点有超过 2 个字段
- C 列表一次由多个字段排序
- 查询中的多个字段在 C++生成器 6 中不起作用
- 将对象的第一个字段强制转换为对象的类型是否真的安全?
- 将多个字段合并为一个字段
- 如何创建具有4个字段和每个字段9个字符长度的矢量对象
- 运算符<比较多个字段
- 如何使用分隔符获取所有第二个字段的总和
- 基于多个字段搜索大型数据集的有效方法
- 如何创建一个包含用户在程序中输入的 3 个字段的结构
- 通过 2 个字段查找特定对象的向量元素
- 通过C强制转换访问结构的第一个字段是否违反了严格的别名
- 在派生类中同时分配多个字段-为什么这样做有效
- 通过强制转换第一个字段来安全访问父类
- 如何用O(n)个时间和O(1)个空间对n个对象的群进行排序.每个对象有两个字段:int和string
- 验证包含1、2、3或4个字段的字符串
- 这两个字段/方法的区别是什么?
- 在一个数组中排序多个字段-c++
- 在c++文本文件中读取多个字段