Как найти все глобальные переменные в исходном коде C ++, DLL или любом файле, созданном компилятором VC ++? - PullRequest
21 голосов
/ 15 сентября 2011

Я делаю свое приложение поточно-ориентированным.Одним из шагов является синхронизация доступа или исключение использования глобальных переменных.Я использую Visual Studio.Я не могу найти хороший способ найти все глобальные переменные в моей кодовой базе.Невозможно создать хороший шаблон поиска текста, и я не могу найти какой-либо полезный инструмент.Ребята, вы знаете какой-нибудь хороший способ сделать это?Это может быть инструмент анализа исходного кода или анализатор двоичных файлов.

Ответы [ 4 ]

12 голосов
/ 11 декабря 2015

Это может помочь:

  1. Открыть проект в Visual Studio.
  2. Открыть 'Class View' проекта
  3. Под заголовком проекта вы увидитенайти 'Глобальные функции и переменную'.

Я проверил это в Visual Studio 2010 и более поздних версиях.

Редактировать: По рекомендации Ajay в комментариях вы также можете классифицировать элементы в группах.Для группировки элементов:

  1. В представлении класса щелкните правой кнопкой мыши название проекта
  2. Выберите "Группировать по объекту / типу элемента"
  3. Выберите необходимое дерево, например, переменные илиструктуры или перечисления и т. д.
8 голосов
/ 15 сентября 2011

Один из вариантов может позволить компоновщику создать файл карты (/ MAP в Visual Studio).

Вы получите файл .map для каждого двоичного файла с двумя разделами:

Таблица сегментов

 Start         Length     Name                   Class
 0001:00000000 00010000H .textbss                DATA
 0002:00000000 000034b4H .text                   CODE
 0003:00000000 00000104H .CRT$XCA                DATA
 0003:00000104 00000104H .CRT$XCAA               DATA
 0003:00000208 00000104H .CRT$XCZ                DATA
 0003:0000030c 00000104H .CRT$XIA                DATA
 ...

Список символов (функций и данных)

  Address         Publics by Value              Rva+Base       Lib:Object

 0000:00000000       ___safe_se_handler_count   00000000     <absolute>
 0000:00000000       ___safe_se_handler_table   00000000     <absolute>
 0000:00000000       ___ImageBase               00400000     <linker-defined>
 0001:00000000       __enc$textbss$begin        00401000     <linker-defined>
 0001:00010000       __enc$textbss$end          00411000     <linker-defined>
 0002:000003a0       _wmain                     004113a0 f   console4.obj
 ...

Вы можете отличить функции от переменных с помощью обозначения "CODE" / "DATA" в списке сегментов.

Преимущество: вы получите все символы, даже те, что в библиотеках, которые не были удалены компоновщиком.

Недостаток: вы получите все символы, даже те, что в библиотеках, которые не были удалены компоновщиком. Я не знаю ни одного инструмента, который бы делал разделение кода / данных автоматически.

3 голосов
/ 15 сентября 2011

Я знаю программу http://code.google.com/p/data-race-test/wiki/ThreadSanitizer (продукт от Google), которая может работать в Windows и на скомпилированном коде. Это динамическая инструментальная программа (например, valgrind или бит как qemu / virtualbox), которая добавляет некоторые проверки доступа к памяти. Он попытается найти некоторые проблемы с потоками. Вы можете просто запустить свою программу под управлением threadanitizer. Замедление будет происходить из-за динамического перевода и из инструментального кода (в 20–50 раз медленнее). Но некоторые проблемы будут обнаружены автоматически.

Это также позволяет аннотировать некоторые пользовательские функции синхронизации в исходном коде.

Вики программы содержит ссылки на другие детекторы потоковой гонки: http://code.google.com/p/data-race-test/wiki/RaceDetectionLinks

1 голос
/ 15 сентября 2011

Может быть, dumpbin инструмент поможет здесь. Вы можете запустить его с помощью клавиши /SYMBOLS для отображения таблицы символов COFF и поиска внешних символов - в этом списке должны быть глобальные переменные. DUMPBIN /SYMBOLS.

...