восстановить символы из backtrace
От: Sazon  
Дата: 08.09.18 20:13
Оценка:
Всем привет.
Возникла следующая ситуация: упало приложение, был сформирован bt. Он содержит подгруженные модули и их адреса, стек без символов.
Нужно восстановить символы по имеющимся адресам вызовов. Мои шаги:

1. Беру упавшее приложение и pdb-файлы, версии совпадают.
2. Запускаю приложение и присоединяюсь через windbg.
3. Смотрю новые адреса подгруженных модулей.
4. Анализирую bt на то, к какой dll или exe принадлежит тот или иной вызов.
5. Транслирую адрес соответствующего вызова следующим образом на запущенный процесс: "адрес вызова" — "dll-адрес из bt" + "dll-адрес в запущенном процессе"
6. запускаю: ln "полученный адрес"

Скажите, все верно ли я делаю, ибо есть сомнения. Может, в VS это удобнее делать?

заранее благодарен
Отредактировано 08.09.2018 20:14 Sazon . Предыдущая версия .
Re: восстановить символы из backtrace
От: ononim  
Дата: 08.09.18 21:05
Оценка: 1 (1) +2
S>Скажите, все верно ли я делаю, ибо есть сомнения. Может, в VS это удобнее делать?
В данных условиях верно. Но на будущее — есть одна проблемка. pdb помимо символов содержит еще кучу всякой вспомогательной инфы, которая помогает дебагеру корректно разматывать стек по bt, особенно нужная если в коде функций использовалась omit frame pointer оптимизация. Без этого размотанные адреса стека могут быть не совсем/все валидны. Потому при падении лучше собирать дамп, хотябы минидамп, нежели на месте пытаться отбэктрейсить стек без символов.
Как много веселых ребят, и все делают велосипед...
Re: восстановить символы из backtrace
От: Alexander G Украина  
Дата: 09.09.18 06:48
Оценка: 1 (1)
Здравствуйте, Sazon, Вы писали:

S>Может, в VS это удобнее делать?


в VS функций нет таких.
Разве что, если не работает рандомизация адресного пространства, сделать step into, и в окне Disassembly вводить адрес и делать switch to source.

Но есть API
Плюс WinDbg можно автоматизировать скриптами.

Вообще, такое (восстановление символов по текстовому бектрейсу) практикует
umdh, когда сравнивает свои текстовые дампы, следовательно, решение существует
Русский военный корабль идёт ко дну!
Отредактировано 09.09.2018 6:51 Alexander G . Предыдущая версия .
Re: восстановить символы из backtrace
От: EreTIk EreTIk's Box
Дата: 10.09.18 10:11
Оценка:
Здравствуйте, Sazon, Вы писали:

S>Возникла следующая ситуация: упало приложение, был сформирован bt. Он содержит подгруженные модули и их адреса, стек без символов.

S>Нужно восстановить символы по имеющимся адресам вызовов. Мои шаги:

S>1. Беру упавшее приложение и pdb-файлы, версии совпадают.

S>2. Запускаю приложение и присоединяюсь через windbg.
S>3. Смотрю новые адреса подгруженных модулей.
S>4. Анализирую bt на то, к какой dll или exe принадлежит тот или иной вызов.
S>5. Транслирую адрес соответствующего вызова следующим образом на запущенный процесс: "адрес вызова" — "dll-адрес из bt" + "dll-адрес в запущенном процессе"
S>6. запускаю: ln "полученный адрес"

S>Скажите, все верно ли я делаю, ибо есть сомнения. Может, в VS это удобнее делать?


Поиск символа в pdb по RVA (Related Virtual Address) можно осуществлять программно — IDiaSession::findSymbolByRVA, вообще без отладчика. Соотвественно на более верхнем уровне абстракции можно это дело заскриптовать.

P.S. Набор загруженных модулей может разниться от системы к системе, подумайте еще раз о предложенном ononim'ом сборе полноценного mini-дампа процесса.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.