Как определить, является ли бинарный файл релизом или отладкой в ​​win и * nix - PullRequest
32 голосов
/ 30 апреля 2009

Существует ли простая утилита командной строки для проверки двоичных файлов, таких как исполняемые и динамические библиотеки, чтобы определить, являются ли они релизной или отладочной версией? Есть ли что-нибудь подобное в * nix или windows?

Ответы [ 8 ]

29 голосов
/ 16 марта 2011
  • для C ++ на Linux , вы можете сделать:

        objdump --source yourbin |grep printf
    

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

  • для C ++ в Windows , вы можете использовать depen.exe и посмотреть, зависит ли это от MSVCRT (выпуск) или MSVCRTD (отладка)

17 голосов
/ 30 апреля 2009

В linux вы можете использовать команду file даже для динамических библиотек. Если он говорит «раздет», то все символы отладки удаляются. Если он говорит "не раздетый", то это наоборот

3 голосов
/ 30 апреля 2009

Для unix: с исполняемыми файлами ELF вы можете использовать objdump или nm для просмотра таблиц символов для исполняемого файла (обратите внимание, что это будет работать намного лучше, если не раздеться). Наличие или отсутствие определенных символов будет иметь тенденцию указывать на отладку или выпуск сборки. (Что касается того, что, вероятно, зависит от того, какие библиотеки вы используете, и т. Д. Вам нужно будет немного покопаться, чтобы найти общие; не стесняйтесь предлагать что-то искать в комментариях, и я обновлю ответить.)

Для Windows: предложения по работе с зависимостями хороши. Для эквивалентов командной строки вы можете найти dumpbin в большинстве установок Visual Studio, и это в некоторой степени эквивалентно objdump в * nix. Вы также можете найти nm или objdump, например, в. msys или cygwin, которые будут работать с некоторыми exe-файлами Windows.

3 голосов
/ 30 апреля 2009

Для Windows Dependency Walker имеет дополнительный вывод строки cmd, в котором перечисляются все dll загружаемых файлов (и их зависимости). Запустите его через grep и посмотрите, появляется ли msvcrt-dll с d или нет.

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

Возможно, вы можете использовать grep для определенных функций, отличающихся в отладке / выпуске, , если эти строки видны в исполняемом файле.

Если ваши приложения вообще не используют среду выполнения, это будет довольно сложно.

2 голосов
/ 30 апреля 2009

Чаще всего отладочные версии как исполняемых файлов, так и библиотек связаны с отладочной версией среды выполнения. В Windows есть схема имен для версий отладки / выпуска, которые некоторые придерживаются, в том числе MS. Имя отладочной версии библиотеки должно заканчиваться на d. Вы можете использовать инструмент, такой как Dependency Walker (http://www.dependencywalker.com), чтобы увидеть, от каких библиотек зависит ваш исполняемый файл или библиотека. Если вы найдете отладочные версии библиотек времени выполнения, существует большая вероятность, что ваш исполняемый файл или библиотека были собраны в режиме отладки.

Это работает, только если

  • Вы можете сказать, посмотрев на имя время выполнения, какая версия (это следует некоторой схеме именования, такой как один я описал выше)
  • ваш исполняемый файл / библиотека связаны против динамического времени выполнения не статично один. Во втором случае время выполнения втягивается в исполняемый файл / библиотеку и это больше не зависимость
  • вы находитесь в Windows:)
2 голосов
/ 30 апреля 2009

Там не так много, чтобы продолжить. Если вы откроете сборку в Reflector, вы можете найти атрибут сборки:

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.Default)]

Но, видимо, это добавлено и в режим релиза.

Если это ваша собственная сборка, тогда решение - использовать некоторые директивы препроцессора.

#ifdef DEBUG
[MyAttribute("foo")]
#endif

edit: Извините, я предположил .NET. Вот мой молоток.

0 голосов
/ 18 апреля 2014

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

0 голосов
/ 03 ноября 2013

Вы можете использовать filever.exe.

filever.exe <my binary file>
--a-- W32i   APP   -         1.0.0.0 shp     25,600 11-03-2013 <my file>

Чтобы получить filever, вы можете скачать инструменты поддержки для Windows XP.

Если вы перешли на Windows 7 или выше (как и большинство пользователей Windows), вы можете скачать его, открыв его через winzip.

Затем извлеките файл-файл из файла support.cab.

Отлично работает для Windows 7.

...