Можно ли регенерировать символы для exe? - PullRequest
7 голосов
/ 17 декабря 2010

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

Я бы хотел сделать следующее (я могу подделать некоторые части этого вручную,но это огромный объем работы): получить трассировку стека для каждого потока в дампе и указатели приведения в дамп к соответствующему типу и отобразить их в отладчике Visual Studio.Я использую 2005, если это имеет значение.

Есть ли инструмент, позволяющий нам воссоздать pdb с учетом исходного кода, всех файлов .obj и исходного .exe?Или когда мы компилируем / ссылаемся, есть настройка, которая говорит: «сделайте это точно так же, как этот другой исполняемый файл, который вы только что сделали» или что-то в этом роде?

Быстрое обновление, основанное на полученных до сих пор ответах: у меня есть файл exe, которыймы отправили клиенту, но не тот PDB, который ему соответствует, если это поможет.Я просто не стал бы посылать им новую сборку (если это возможно), потому что на получение аварийных дампов уходит около недели, а заказчик уже спрашивает: «Почему это не исправлено?»этап.(Если мы отправим еще одну сборку, я бы предпочел, чтобы это была та, которая либо решает проблему, либо имеет дополнительную отладку в интересующей области, а не просто тот же код.) Я знаю, что это можно сделать вручную с помощьюмного догадок;это то, что мы сейчас делаем.Но это боль, так что я надеюсь, что есть способ автоматизировать это.

Ответы [ 3 ]

1 голос
/ 17 декабря 2010

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

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

0 голосов
/ 17 декабря 2010

Вы не можете воссоздать PDB, чтобы соответствовать уже существующему исполняемому файлу.PDB содержит «отпечаток пальца», который уникален для каждой компиляции.Если вы не можете заставить старый PDB волшебным образом появляться, вам следует ударить корову по затылку (в стиле Гиббса, если вы смотрите NCIS), перекомпилировать все это, сохранить PDB где-нибудь в безопасности и отправить новый исполняемый файлсвоему клиенту, и пусть сбои наступят.

0 голосов
/ 17 декабря 2010

Когда у вас есть источники, довольно легко найти соответствие между ними и exe-файлом.Просто попросите их отправить вам exe-файл вместе с журналом сбоев и использовать IDA.

То, что вы спрашиваете, гораздо сложнее, чем это, учитывая также, что вам нужно это «только для одного использования».

...