gpt4 book ai didi

c++ - 如何从对象/类中找到第一个字段?

转载 作者:行者123 更新时间:2023-11-28 01:31:53 26 4
gpt4 key购买 nike

早上好在 this post , 我正在寻找一种方法来找到 CString转储中的条目,我仍然是:-)
根据 Windbg 的 x /2 中提到的第一个字段,似乎可以找到与对象相关的条目。结果。对于具有虚拟方法的对象,这似乎是 __vptr字段(对应于 *vftable' 条目),我认为这个问题对于 CString 的特殊情况来说很容易类。

在源代码 ( C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\<version>\crt\src\vcruntime\undname.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 local 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 *]

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++ - 如何从对象/类中找到第一个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51134046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com