#c #dia-sdk
#c #dia-sdk
Вопрос:
В настоящее время я сбрасываю много информации из файла PDB, который я извлекаю с помощью DIA SDK, В XML-файл, чтобы затем использовать эту информацию для отображения информации о структуре проекта и т. Д.
Для присвоения имен узлам XML у меня есть тривиальная функция, которая преобразует значение перечисления в строку, которая затем используется для узла:
string symTagTypeToString(DWORD type) {
string symTagTypename = "";
switch(type) {
case SymTagNull:
symTagTypename = "null";
break;
case SymTagExe:
symTagTypename = "exe";
break;
case SymTagCompiland:
symTagTypename = "compiland";
break;
case SymTagCompilandDetails:
symTagTypename = "compilandDetails";
break;
case SymTagCompilandEnv:
symTagTypename = "compilandEnvironmentVar";
break;
case SymTagFunction:
symTagTypename = "function";
break;
case SymTagBlock:
symTagTypename = "block";
break;
case SymTagData:
symTagTypename = "data";
break;
case SymTagAnnotation:
symTagTypename = "annotation";
break;
case SymTagLabel:
symTagTypename = "label";
break;
case SymTagPublicSymbol:
symTagTypename = "publicSymbol";
break;
case SymTagUDT:
symTagTypename = "userDefinedType";
break;
case SymTagEnum:
symTagTypename = "enumerator";
break;
case SymTagFunctionType:
symTagTypename = "functionType";
break;
case SymTagPointerType:
symTagTypename = "pointer";
break;
case SymTagArrayType:
symTagTypename = "array";
break;
case SymTagBaseType:
symTagTypename = "baseType";
break;
case SymTagTypedef:
symTagTypename = "typedef";
break;
case SymTagBaseClass:
symTagTypename = "baseClass";
break;
case SymTagFriend:
symTagTypename = "friend";
break;
case SymTagFunctionArgType:
symTagTypename = "functionArgumentType";
break;
case SymTagFuncDebugStart:
symTagTypename = "funcDebugStart";
break;
case SymTagFuncDebugEnd:
symTagTypename = "funcDebugEnd";
break;
case SymTagUsingNamespace:
symTagTypename = "usingNamespace";
break;
case SymTagVTableShape:
symTagTypename = "vTableShape";
break;
case SymTagVTable:
symTagTypename = "vTable";
break;
case SymTagCustom:
symTagTypename = "custom";
break;
case SymTagThunk:
symTagTypename = "thunk";
break;
case SymTagCustomType:
symTagTypename = "customType";
break;
case SymTagManagedType:
symTagTypename = "managedType";
break;
case SymTagDimension:
symTagTypename = "dimension";
break;
default:
ostringstream s;
s << "other" << type;
symTagTypename = s.str();
break;
}
return symTagTypename;
}
Эта функция охватывает все значения, перечисленные здесь: http://msdn.microsoft.com/de-de/library/bkedss5f.aspx
Теперь, для сброса информации DIA, я в основном просто повторяю дочерние элементы всех символов, которые я использую pGlobal->findChildren(SymTagUDT, NULL, nsCaseSensitive, amp;pIDiaEnumSymbols)
. Любопытно, что результирующий XML содержит много вещей, которые выглядят следующим образом:
<function name="consumer::main">
<funcDebugStart name="unknown">
</funcDebugStart>
<funcDebugEnd name="unknown">
</funcDebugEnd>
<data name="">
</data>
<data name="">
</data>
<data name="">
</data>
<data name="this">
</data>
<data name="c">
</data>
<other31 name="unknown">
</other31>
<other31 name="unknown">
</other31>
<other31 name="unknown">
</other31>
<other31 name="unknown">
</other31>
<other31 name="unknown">
</other31>
<other31 name="unknown">
</other31>
<other31 name="unknown">
</other31>
<other31 name="unknown">
</other31>
</function>
Теперь, не обращайте внимания на пустую информацию об имени и прочее, пока все это довольно незавершенно. Мне просто очень хотелось бы знать, какой символ имеет символ 31. Кажется, что перечислитель содержит 31 элемент, поэтому значения от 0 до 30 должны быть допустимыми. Кто-нибудь имеет представление о том, что это может быть 31? Рассматриваемая функция выглядит следующим образом:
void main()
{
char c;
cout << endl << endl;
while (true) {
in->read(c);
cout << c << flush;
if (in->num_available() == 1)
cout << "<1>" << flush;
if (in->num_available() == 9)
cout << "<9>" << flush;
}
}
Это часть проекта SystemC fifo example. На самом деле ничего особенного.
Ответ №1:
В версии DIA SDK, поставляемой с VS2010, были добавлены два значения символа SymTagCallSite и SymTagMax (хотя они еще не включены в документацию). Хотя я до сих пор не имею представления о семантике, которую обозначают эти значения, это определенно объясняет значения, которые я получаю.