Compiler construction 如何判断win和*nix中的二进制文件是发布还是调试

Compiler construction 如何判断win和*nix中的二进制文件是发布还是调试,compiler-construction,debugging,release,Compiler Construction,Debugging,Release,是否有一个简单的命令行实用程序来检查二进制文件(如可执行文件和动态库),以判断它们是发布版本还是调试版本?在*nix或windows上有类似的功能吗?在linux上,您甚至可以对动态库使用“file”命令。如果显示“剥离”,则所有调试符号都将剥离。如果它说的是“未剥离”,则与Windows相反,它有可选的cmd行输出,列出exe加载的每个dll(及其依赖项)。通过grep运行该命令,查看msvcrtdll是否弹出带有d的窗口 这仅在动态链接的情况下有效。否则可能会更棘手 如果这些字符串在可执行文

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

在linux上,您甚至可以对动态库使用“file”命令。如果显示“剥离”,则所有调试符号都将剥离。如果它说的是“未剥离”,则与Windows相反,它有可选的cmd行输出,列出exe加载的每个dll(及其依赖项)。通过grep运行该命令,查看msvcrtdll是否弹出带有d的窗口

这仅在动态链接的情况下有效。否则可能会更棘手

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


如果你的应用程序根本不使用运行时,这将是相当棘手的。

没有什么可以做的。如果在Reflector中打开部件,则可以查找部件属性:

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.Default)]
但显然,这也被添加到了发布模式中

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

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

编辑:对不起,我想是.NET。这就是我的锤子。

大多数情况下,可执行文件和库的调试版本都与运行时的调试版本相链接。 在Windows上,有一个用于调试/发布版本的名称方案,其中包括MS。库的调试版本名称应以d结尾。 您可以使用像Dependency Walker()这样的工具来查看可执行文件或库所依赖的库。如果您发现运行库的调试版本,那么您的可执行文件或库很可能是在调试模式下构建的

然而,只有当

  • 你可以通过看一个人的名字来辨别 运行时它是哪个版本(它是 遵循一些命名方案,如 一个(我在上面描述过)
  • 您的可执行文件/库已链接 针对动态运行时而非静态 一个。在第二种情况下,运行时 被拉入可执行文件/库 它不再是一种依赖
  • 您在Windows上:)
对于unix:对于ELF可执行文件,您可以使用objdumpnm查看可执行文件的符号表(请注意,如果不剥离,这将工作得更好)。某些符号的存在或不存在将倾向于指示调试或发布版本。(至于哪一个,这可能取决于您使用的库等。您必须进行一些挖掘以找到常见的库;请随意在评论中提出要查找的内容,我将更新答案。)

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

    < > > C++上的<强> Linux < /St>,您可以这样做:

    用您所做的任何函数调用替换printf。如果是debug,它将显示您实际执行的所有源代码调用。如果已发布,则仅显示符号表中创建的符号

    < > > C++上的“强> Windows ”,可以使用依赖项.EXE,并看它是否依赖于MSVCRT(发布)或MSVCRTD(调试)


您可以使用filever.exe

filever.exe <my binary file>
--a-- W32i   APP   -         1.0.0.0 shp     25,600 11-03-2013 <my file>
filever.exe
--a--W32i APP-1.0.0.0上海医药25600 11-03-2013
要获得filever,您可以下载windows xp支持工具

如果您移动到Windows 7或更高版本(与大多数Windows用户一样),您可以下载它,通过winzip打开它

然后从support.cab中提取filever


它在Windows 7上运行得很好。

使用depends.exe确定它是哪个版本。当您通过浏览器打开文件时,它将显示所需的文件。通过查看system32文件列表,您可以确定它是调试还是发布

用于哪种语言?对于哪些调试格式,“调试”和“发布”没有特定含义;它们只是一系列选项的引用方式,在不同的项目中可能会有所不同。您的意思是是否生成了带有调试符号且未压缩的内容?*您的意思是生成了带有调试符号且未压缩的内容?*是的。它的可能副本可能有一个非剥离版本或剥离调试版本。我不确定你所说的发布或调试版本是什么意思。我假设将使用调试符号构建程序/库以进行调试,并将剥离以进行装运。因此,调试或发布对于您使用它的方式是隐式的。你可以有各种组合,因为这取决于你如何包装它。不正确,剥离符号与调试或发布版本无关。我对我正在使用的Mac OS X不熟悉。但显然,objdump并不随Xcode一起提供。nm是可用的,但我能看到的唯一区别是调试版本只包含了更多的内容。很高兴你采用了.NET,因为这就是我来到这里的原因,你的回答为我指明了正确的方向。在VS2010中,该属性同时存在于调试版本和发布版本中,但参数“list”是不同的。不确定在这个
gcc-m32-g-o hello32\u dbg hello.c
中的
objdump--source hello32*| grep printf
是否有效,而这个案例
gcc-m32-o hello32 hello.c
只返回检查,C++中,你调用Prtff吗?C,我使用PtStEnter,对于Windows(MS编译器),你需要查找的DLL的名称取决于你链接的C++运行时的版本(主要取决于VisualStudio的版本)。DLL名称已经十多年没有被MSVCRT/MSVCRTD使用了。@Andre拥有调试信息与在调试或发行版中构建不同。你的意思是什么?参见上面leander和Smoggan的评论。可以有一个非剥离的re
filever.exe <my binary file>
--a-- W32i   APP   -         1.0.0.0 shp     25,600 11-03-2013 <my file>