Символическое значение DIA SDK

#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 (хотя они еще не включены в документацию). Хотя я до сих пор не имею представления о семантике, которую обозначают эти значения, это определенно объясняет значения, которые я получаю.