Получение списка символов, используемых моим кодом VC ++ - PullRequest
1 голос
/ 28 августа 2011

Я создаю инструмент, который обрабатывает мои исходные коды VC ++.Для этого мне нужно получить список символов, включая имена локальных переменных и их типы, используемые моими кодами.Я знаю, что Visual C ++ 2010 уже предоставляет файл .bsc, который позволяет браузеру объектов быстро находить символы.Но это интерактивный инструмент.Мне нужно получить список символов в файле.Существуют ли какие-либо инструменты, позволяющие нам программно получать список символов, используемых в наших собственных исходных кодах VC ++?

Я попробовал SDK Debug Interface Access, предоставленный Microsoft.Это позволяет нам читать файл .pdb для имен используемых локальных переменных.Но я также хочу получить точные имена типов, используемые в моих исходных кодах.Например,

MYTYPE dwordVar;

DIA SDK позволяет нам получить строку "dwordVar", которая является именем локальной переменной.Но он не может сказать, что его имя типа "MYTYPE".Он может только сказать нам, что на самом деле представляет MYTYPE (например, unsigned long).Но не символ «MYTYPE».

Если Visual C ++ не предлагает эту функцию, существуют ли какие-либо сторонние инструменты, поддерживающие эту функцию?

1 Ответ

1 голос
/ 29 августа 2011

Экспериментируя с этой программой:

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, чтобы выяснить линию s) для которого объявлен символ данных, и найдите в этих строках любую из имен typedef строк, возможно, выполнив предварительную обработку перед поиском.

...