Получение списка символов, используемых моим кодом VC++
Я создаю инструмент, который обрабатывает мои исходные коды VC++. Для этого мне нужно получить список символов, включая имена локальных переменных и их типы, используемые моими кодами. Я знаю, что Visual C++ 2010 уже предоставляет файл.bsc, который позволяет браузеру объектов быстро находить символы. Но это интерактивный инструмент. Мне нужно получить список символов в файле. Существуют ли какие-либо инструменты, позволяющие программно получать список символов, используемых в наших собственных исходных кодах VC++?
Я попробовал SDK отладки интерфейса доступа, предоставленный Microsoft. Это позволяет нам читать файл.pdb для имен используемых локальных переменных. Но я также хочу получить точные имена типов, используемые в моих исходных кодах. например
MYTYPE dwordVar;
DIA SDK позволяет нам получить строку "dwordVar", которая является именем локальной переменной. Но он не может сказать, что его имя типа "MYTYPE". Он может только сказать нам, что на самом деле представляет MYTYPE (например, unsigned long). Но не символ "MYTYPE".
Если Visual C++ не предлагает эту функцию, есть ли сторонние инструменты, поддерживающие эту функцию?
1 ответ
Экспериментируя с этой программой:
typedef unsigned long MYTYPE;
int wmain(int argc, wchar_t *argv[])
{
MYTYPE test = 99LU;
}
оба DIA SDK и DbgHelp возвращают 16 (SymTagBaseType
) для символа типа символа для test
, Было бы хорошо, если бы символом типа был символ Typedef (17 / SymTagTypedef
), но может случиться так, что сама PDB не записывает, использовал ли исходный файл typedef
или введите имя в объявлении типа локальной переменной.
Одним из возможных обходных путей является перечисление SymTagTypedef
дети символа глобального масштаба, построение std::multimap
от идентификаторов типов типов до typedef
имена. Затем для каждой локальной переменной, если мультикарта содержит записи для идентификатора типа символа данных (полученного через IDiaSymbol::get_typeId
), использовать IDiaSession::findLines
метод, чтобы выяснить строку (и), в которой объявлен символ данных, и найти в этих строках любой из typedef
имя строки, возможно, выполняя предварительную обработку перед поиском.