Любые рекомендуемые настройки VC ++ для лучшего анализа PDB при сборках релизов

StackOverflow https://stackoverflow.com/questions/36127

Вопрос

Существуют ли какие-либо настройки VC ++, о которых я должен знать, чтобы создавать лучшие PDB-файлы, содержащие больше информации?

У меня есть система анализа аварийного дампа, основанная на проекте крашрпт.

Кроме того, на моем производственном сервере сборки исходный код установлен на D:\, но на моей машине разработки исходный код установлен на C:\.Я ввел исходный путь в настройках VC ++, но при просмотре стека вызовов сбоя он автоматически не переходит к моему исходному коду.Я верю, что если бы у меня был исходный код моей машины разработчика на D:\, это сработало бы.

Это было полезно?

Решение

  

" Есть ли какие-либо настройки VC ++, которые я должен знать о "

Убедитесь, что вы отключили опускание указателя кадра. Блог Ларри Остермана содержит исторические сведения о fpo и проблемы, возникающие при отладке.

  

Символы загружены успешно. Он показывает стек вызовов, но двойной щелчок по записи не приводит меня к исходному коду.

Какую версию VS вы используете? (Или вы используете Windbg?) ... в VS он должен определенно запрашивать источник в первый раз, если не находит местоположение. Тем не менее, он также хранит список источников, которые были «не найдены», поэтому он не просит вас об этом каждый раз. Иногда список «не смотреть» - это боль ... чтобы восстановить приглашение, вам нужно перейти в обозреватель решений / узел решения / свойства / отладочные свойства и отредактировать список файлов в нижней панели.

Наконец, вы можете использовать «раздетые символы». Это файлы pdb, сгенерированные для предоставления отладочной информации для обхода стека вызовов за FPO, но с удалением местоположений источника (вместе с другими данными). Общедоступные символы для компонентов ОС Windows - это очищенные pdbs. Для вашего собственного кода это просто причиняет боль и не стоит того, если вы не предоставляете свои pdbs для внешних целей. Как бы вы получили один из этих ужасных раздетых pdbs? Они могут быть у вас, если вы используете " binplace " с помощью команды -a.

Удачи! Подходящая история мини-дампов - находка для отладки продукции.

Другие советы

Если ваша сборка выполняется непосредственно из системы управления исходным кодом, вы должны аннотировать свои файлы pdb происхождением файла. Это позволяет автоматически извлекать точные исходные файлы во время отладки. (Это тот же процесс, который используется для получения исходного кода платформы .Net).

См. http://msdn.microsoft.com/en-us/ magazine / cc163563.aspx для получения дополнительной информации. Если вы используете Subversion в качестве SCM, вы можете проверить проект SourceServerSharp.

Вы можете попытаться с помощью subst команды MS-DOS назначить каталог с исходным кодом для D: диск.

Это процедура, которую я использовал после некоторых проблем, похожих на вашу:

a) Скопировал на рабочий сервер все созданные EXE- и DLL-файлы, каждый с соответствующей PDB-базой данных, в один и тот же каталог, запустил систему и дождался сбоя.

б) Скопировал обратно все файлы EXE, DLL и PDB на компьютер разработчика (во временную папку) вместе с минидампом (в ту же папку).Использовал Visual Studio для загрузки мини-дампа из этой папки.

Поскольку VS находил исходные файлы там, где они были изначально скомпилированы, он всегда мог идентифицировать их и правильно загружать.Как и в случае с вами, в производственной машине использовался диск не C:, но в машине разработки он был.

Еще два совета:

  • Одна вещь, которую я часто делал, это копировал перестроенный EXE / DLL файл и забывал скопировать новую PDB.Это разрушило цикл отладки, VS не смог бы показать мне стек вызовов.

  • Иногда я получал стек вызовов, который не имел смысла в VS.После некоторой головной боли я обнаружил, что windbg всегда показывает мне правильный стек, но VS часто этого не делает.Не знаю почему.

Если кому-то интересно, сотрудник ответил мне на этот вопрос по электронной почте:

Артем написал:

  

Есть флаг для MiniDumpWriteDump ()   что может сделать лучше аварийные дампы, которые   позволит увидеть полное состояние программы,   со всеми глобальными переменными и т. д. Что касается   стеки вызовов, я сомневаюсь, что они могут быть   лучше из-за оптимизаций ...   если вы не включите (может быть, некоторые)   оптимизации отключены.

     

Кроме того, я думаю, что отключение встроенного   функции и вся программа   оптимизация очень поможет.

     

На самом деле, существует много типов дампа,   может быть, вы могли бы выбрать один маленький   достаточно, но все еще есть больше информации    http://msdn.microsoft.com/en-us /library/ms680519(VS.85).aspx      

Эти типы не помогут со стеком вызовов   тем не менее, они влияют только на количество   переменные, которые вы сможете увидеть.

     

Я заметил некоторые из этих типов дампа   не поддерживаются в dbghelp.dll   Версия 5.1, которую мы используем. Мы могли бы   обновить до последней версии 6.9   хотя, я только что проверил EULA на   MS Debugging Tools - самые новые   dbghelp.dll все еще в порядке   перераспределить.

Visual Studio запрашивает у вас путь к исходному файлу? Если это не так, он не думает, что у него есть символы для стека вызовов. Установка исходного пути должна работать без точного сопоставления исходного местоположения.

Вы можете узнать, загружены ли символы, посмотрев в окно «модулей» в Visual Studio.

Предполагая, что вы создаете PDB, я не думаю, что есть какие-либо параметры, которые напрямую контролируют объем информации в PDB. Вы можете изменить тип оптимизаций, выполняемых компилятором, чтобы улучшить отладочную работу, но это будет стоить производительности - как указывает ваш коллега, отключение inline поможет сделать вещи более очевидными в файле сбоев, но будет стоить во время выполнения.

В зависимости от характера вашего приложения, я бы порекомендовал поработать с файлами полного дампа, если вы можете, они больше, но дают вам всю информацию о процессе ... и как часто он все равно аварийно завершается :)

Visual Studio запрашивает у вас путь к исходному файлу?

Нет.

Если это не так, то он не думает, что у него есть символы для стека вызовов.Настройка источника путь должен работать без необходимости отображения точного исходного местоположения.

Символы успешно загружены.Он показывает стек вызовов, но двойной щелчок по записи не приводит меня к исходному коду.Я, конечно, могу поискать в файлах нужную строку, но это тяжелая работа :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top