Доброе утро,
В этом посте я искал способ найти CString
записей в дампе, и я до сих пор: -)
Кажется возможным найти записи, относящиеся к объекту, основываясь на первом поле, как указано в результате x /2
Windbg. Для объектов, которые имеют виртуальные методы, это, кажется, поле __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'
, но я не знаю, смогу ли я использовать это в качестве кандидата "первого поля".
P.s. В случае, если вы задаетесь вопросом «Но почему бы вам просто не попробовать?», Существует проблема, заключающаяся в том, что объекты CStringT
, присутствующие в моих файлах дампа, содержат довольно странные символы, из-за чего очень трудно понять, делать правильные вещи и видеть странные, но правильные символы, или, если я смотрю на поддельные результаты.
Заранее спасибо