35

是否有一个简单的命令行实用程序来检查可执行文件和动态库等二进制文件,以判断它们是发布版本还是调试版本?*nix 或 windows 上有类似的东西吗?

4

8 回答 8

30
  • 对于Linux上的 C++ ,您可以执行以下操作:

        objdump --source yourbin |grep printf
    

    将 printf 替换为您执行的任何函数调用。如果是调试,它将显示您执行的所有实际源代码调用。如果是release,它只会显示符号表中创建的符号。

  • 对于Windows上的 C++ ,您可以使用 depends.exe 并查看它是否依赖于 MSVCRT(发布)或 MSVCRTD(调试)

于 2011-03-16T18:38:04.360 回答
18

在 linux 上,您甚至可以对动态库使用“文件”命令。如果它说“已剥离”,则所有调试符号都将被剥离。如果它说“未剥离”,则相反

于 2009-04-30T17:33:17.623 回答
3

对于 Windows,Dependency Walker具有可选的命令行输出,列出了 exe 加载的每个 dll(及其依赖项)。通过 grep 运行它,看看 msvcrt-dll 是否弹出广告。

这仅在动态链接时才有效。否则可能会更棘手。

如果这些字符串在可执行文件中可见,您也许可以对调试/发布中不同的某些函数进行 grep 。

如果您的应用程序根本不使用运行时,那将非常棘手。

于 2009-04-30T17:33:36.000 回答
3

对于 unix:使用 ELF 可执行文件,您可以使用objdumpnm来查看可执行文件的符号表(请注意,如果不剥离它会更好地工作)。某些符号的存在或不存在将倾向于指示调试或发布版本。(至于哪个,这可能取决于您使用的库等。您必须进行一些挖掘才能找到常见的库;请随时在评论中提出要查找的内容,我会更新回答。)

对于 Windows: dependencywalker 建议很好。对于命令行等效项,您可以在大多数 Visual Studio 安装中找到dumpbin,它在某种程度上等同于 *nix 上的 objdump。您还可以在例如 msys 或 cygwin 中找到适用于某些 windows exe 文件的 nm 或 objdump。

于 2009-04-30T17:43:06.400 回答
2

没有太多事情要做。如果您在 Reflector 中打开一个程序集,您可以查找该程序集属性:

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

但显然这也被添加到发布模式中。

如果它是您自己的程序集,那么解决方案是使用一些预处理器指令。

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

编辑:对不起,我假设.NET。我的锤子来了。

于 2009-04-30T17:34:19.447 回答
2

大多数情况下,可执行文件和库的调试版本都与运行时的调试版本相关联。在 Windows 上,有一些遵循的调试/发布版本的名称方案,其中包括 MS。库的调试版本的名称应以 d 结尾。您可以使用 Dependency Walker ( http://www.dependencywalker.com ) 之类的工具来查看可执行文件或库所依赖的库。如果您发现运行时库的调试版本,则很有可能您的可执行文件或库是在调试模式下构建的。

但是,这仅在以下情况下才有效

  • 您可以通过查看运行时的名称来判断它是哪个版本(它遵循一些命名方案,就像我上面描述的那样)
  • 您的可执行文件/库链接到动态运行时而不是静态运行时。在第二种情况下,运行时被拉入可执行文件/库,它不再是依赖项
  • 你在 Windows 上:)
于 2009-04-30T17:39:46.423 回答
0

Use depends.exe to find out which version it is. when You open the file through depends walker it will show file which are needed. By seeing the list of system32 files you can it whether it is debug or release

于 2014-04-18T07:05:53.013 回答
0

您可以使用 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 中提取 filever。

它适用于 Windows 7 就好了。

于 2013-11-03T13:55:15.947 回答