Могу ли я восстановить исходный код C ++ из отладочных двоичных файлов? - PullRequest
6 голосов
/ 18 июня 2010

У меня есть приложение C ++, скомпилированное в отладке (с использованием MinGW и Qt), но я потерял некоторые важные изменения, потому что кто-то из моей команды забыл зафиксировать свои изменения в менеджере контроля версий и переписал исходный код другими изменениями.

Когда я запускаю программу в режиме отладки (в Qt Creator), я могу установить точку останова в main, а затем посмотреть исходный код.

Есть ли способ восстановить весь потерянный исходный файл, используятолько отладочные файлы?Либо вручную, либо автоматически.

Спасибо!

Ответы [ 5 ]

10 голосов
/ 18 июня 2010

Когда я запускаю программу в режиме отладки (в Qt Creator), я могу установить точку останова в main и затем увидеть исходный код.

В самом деле? Узнайте, откуда ваш отладчик получает исходный код, и скопируйте его оттуда.

Скорее всего, ваш отладчик просто захватывает файл в вашей системе с тем же именем / путем, что и исходное имя файла (возможно, более поздняя версия, или старая версия, и т. Д.), И все происходит так, что выстраиваются в линию.

Вы не можете по-настоящему восстановить исходный код из скомпилированного двоичного файла, поскольку преобразование из исходного кода C ++ в скомпилированный двоичный файл не является отношением 1: 1. Существует много (бесконечно ...) разных исходных файлов, которые будут компилироваться в один и тот же двоичный файл. Невозможно узнать из бинарного файла, как выглядит исходный код.

Существуют инструменты, которые могут генерировать что-то похожее на исходный файл C ++, но, скорее всего, оно не будет похоже на ваш исходный файл.

1 голос
/ 19 июня 2010

Я думаю, что есть небольшая вероятность, что вы действительно сможете восстановить исходный код, но не из самого двоичного файла: если вы действительно, действительно отчаялись, вы можете использовать поисковое приложение (например, Agent Ransack) и искать в вашем диске строковые шаблоны что вы знаете, существуют в исходном коде. В частности, поищите в вашем файле подкачки (pagefile.sys), если он у вас есть - возможно, есть вероятность, что он где-то там похоронен.

Я пробовал этот метод один раз, когда я действительно был в отчаянии, но моя ситуация тогда была несколько иной и более благоприятной для «поиска и восстановления», потому что я потерял его, когда каким-то образом произошел сбой IDE и весь исходный файл ( !!!! неприятный сюрприз !!!)

0 голосов
/ 19 июня 2010

Используйте программу strings для извлечения всех байтов ASCII, а затем их перестановки.

0 голосов
/ 18 июня 2010

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

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

В общем случае даже отладочные двоичные файлы не предназначены для воссоздания исходного кода: для этого предназначен исходный код,У них есть таблица символов и инструкции-> карты номеров строк, которые могут помочь.

0 голосов
/ 18 июня 2010

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

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

Я считаю rec22 (recstudio.exe) лучшим вариантом для декомпиляции (для бесплатной загрузки) idaPro и hexrays казались лучше (но не могли позволить себе купить)

...