调试信息是不是显示 C++/MSVC 中的代码?

Posted

技术标签:

【中文标题】调试信息是不是显示 C++/MSVC 中的代码?【英文标题】:Do debugging information reveal code in C++ / MSVC?调试信息是否显示 C++/MSVC 中的代码? 【发布时间】:2014-03-14 13:48:57 【问题描述】:

如果我们分发包含调试信息/符号的已编译 C++ 可执行文件,与缺少调试信息相比,这是否能让第三方了解更多关于编译程序的源代码?

“了解更多” => 获取有关函数、变量、类等名称的信息。 当然假设没有发布调试符号文件 (.pdb)

这个问题主要与保护使用 MSVC 编译的 C++ 中的专有代码有关,但有关其他编译器和调试符号的一般信息也可以提供见解。

问题的一些背景:我们发送带有调试信息的可执行文件,以在出现意外程序状态的情况下创建堆栈跟踪。

编辑:当然,我们在公司内部维护 PDB,以便在堆栈跟踪到达后能够读取它们。

【问题讨论】:

如果他们没有 PDB 文件,他们无法进入或调试代码。但是,如果 dll 是在调试中构建的,它们会得到烦人的断言。 他们当然可以通过调试介入,它只是在汇编程序中,周围有一些基本的(如果不是难以理解的)数据。如果你真的很努力,你可以完成一些零碎的工作,我认为这就是一些 Visual Studio 6.0 扩展的编写方式。如果你还记得那么久? 【参考方案1】:

我只知道微软的编译器...... PDB 会存储额外的信息(如果你真的在乎的话,你应该真正剥离你的 pdb。) http://msdn.microsoft.com/en-us/library/y87kw2fd.aspx

John Robbins 写了一些关于 PDB 以及如何使用它们的精彩文章,这是一个开始 http://www.wintellect.com/blogs/jrobbins/pdb-files-what-every-developer-must-know 希望你能继续...

【讨论】:

感谢您的链接!我喜欢使用 Symbol 服务器并将其与 SVN 链接起来的想法。然而,blog.aaronballman.com/2012/05/… 我使用了符号服务器,也只是手动存储了符号,但是我的生产代码并不是那么重要,以至于我真的需要对 PDB 进行处理,我猜你的就是这样,那就是会增加基础设施的复杂性。 我们将所有与发布可执行文件打包在一起的 PDB 的副本保存在存档驱动器上。所以这不是什么大问题(一个好的持续集成工具,应该为你完成这项工作)。但是我们必须手动回到代码修订版来看看堆栈跟踪的真正含义。 在构建生产版本时,我使用构建后步骤将代码、可执行文件和调试符号推送到特殊的生产存储库,然后将一些带有修订 ID 的元数据添加到 xml 文件产品随附的。然后我使用崩溃报告应用程序生成崩溃转储,将转储文件与 xml 文件和任何其他必要数据打包,并将其发送到崩溃报告服务器。然后我有一个自定义工具,它将检查生产 repo 中的修订,打开任何其他用户数据,并启动调试会话。对我来说很方便。【参考方案2】:

基本上没有。所有调试信息都存储在 PDB 中,EXE 仅包含 PDB 的路径。

如果您担心,您可以随时使用十六进制编辑器浏览二进制代码以查看 .EXE 中嵌入了哪些信息。每当我为新平台或使用一组新的开发工具构建时,我倾向于这样做。有时你会嵌入一些你并不真正想要的东西,但通常不是关于代码,更像是网络名称和路径。

【讨论】:

是的,我同意,我也将资源视为资源(对于 Win32 应用程序),有时也会留下一些意想不到的工件。 但是 OP 说他们正在使用调试信息生成堆栈跟踪,但没有 PDB。这似乎与“所有”调试信息都在 PDB 中的断言相矛盾。 我可能错了,但我认为 OP 的意思是他们正在生成一个转储文件,该文件是内存中堆栈和其他信息的快照,不需要 exe 中的任何特殊调试信息。 【参考方案3】:

可执行文件包含程序的代码。有足够的决心,它可以被重建(四处讨论一些计算机病毒是如何工作的,在那里你会看到刚刚获得可执行文件的人,在许多情况下甚至被加密或以其他方式混淆以使其更难识别为恶意软件,弄清楚它是如何工作的)。

此外,复制可执行文件更容易,为什么要费心找出它是如何编写克隆的......

【讨论】:

以上是关于调试信息是不是显示 C++/MSVC 中的代码?的主要内容,如果未能解决你的问题,请参考以下文章

用于删除调试信息的 MSVC 命令行选项

MSVC++14 上的 C++11 中的不可能的快速委托

MSVC 2008,调试过程,无法调试

dll 运行时错误(C/C++/GCC/MSVC)

从MSVC输出生成Makefile依赖项

std::visit 和 MSVC 调试器的堆栈损坏“重载”结构