C++ PDB Символы не загружены из одного каталога

У меня есть приложение на C++, которое использует библиотеку g3log для предоставления информации о трассировке стека в случае сбоя. Моя конфигурация релиза также создает полный файл pdb, так что это возможно. Мой app.exe хранит полный путь к файлу pdb, то есть я не использую /PDBALTPATH:%_PDB%.

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

Я проверил, указав / PDBALTPATH:% _ PDB% так, что нет информации о пути, но затем файл.pdb снова никогда не загружается.

В обоих случаях, если я присоединяю отладчик, все хорошо в отладчике, но не в моей трассировке стека.

Есть ли способ получить "автоматическую загрузку".pdb (не уверен, как его вызвать), когда он соответствует полному пути, который происходит, когда.pdb находится в том же каталоге. Таким образом, я могу получить значимый стек вызовов при необходимости.

3 ответа

Кажется, что @prasad-mk наполовину правильно. Установка _NT_SYMBOL_PATH так или иначе вынудила мой символ.pdb быть загруженным, как в случае, когда путь совпадает.

Другой вариант, который я нашел, - использовать эту утилиту http://bytepointer.com/tools/index.htm, чтобы обновить путь к месту расположения моего pdb.

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

Я не уверен насчет внутренней механики, которая получает информацию о трассировке стека в вашей среде разработки. Но обычно отладчик ищет файлы PDB и пытается загрузить их из разных мест. И когда вы помещаете файл PDB в EXE-файл, вы можете найти его в отладчике.

Например, мой сервер сборки сохраняет файлы PDB при сборке на моем локальном сервере символов. И когда я отлаживаю аварийный дамп с помощью моего отладчика, он получает нужные символы правильно.

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

Вы можете установить этот путь; установите _NT_SYMBOL_PATH=C:\MySymbols, где находятся ваши файлы pdb. Это простой способ, если вы не можете установить этот путь, а затем следуйте приведенной ниже процедуре.

Ты упомянул:

Когда я запускаю.exe из любого пути к папке, пока.pdb не был перемещен, то, если я вызову сбой, я получу значимую трассировку стека. <<

Поэтому всегда проверяйте, работает ли ваше приложение из каталога, в котором находятся файлы.exe+.pdb.

Вы можете сделать это с помощью GetModuleFileName+SetCurrentDirectory. Это означает, что ваш рабочий каталог отличается. Я хотел бы предложить, в вашем приложении, получить " GetModuleFileName". Затем измените рабочий каталог на путь exe, используя: SetCurrentDirectory.

Другие вопросы по тегам