您可以从调试编译的二进制文件中检索源代码吗?

问题描述:

我正在四处寻找,并发现了一个可执行文件,用于我在8年前在Visual C++ 6.0中编写的内容。我从不备份源代码,但我认为我总是以调试模式编译所有内容。我还隐约记得在某处听到“除非你有你的编译器的调试符号或其他东西,否则你不能将可执行文件反编译成源代码。”该代码会有感伤的价值,但它不是关键任务,我检索它。您可以从调试编译的二进制文件中检索源代码吗?

这就是背景;下面是问题:

  1. 如何检查可执行文件是否在调试模式下编译?
  2. 如果是,调试模式可执行文件带有哪些信息?
  3. 我可以检索完整的源代码吗?否则,与发布版本相比,反编译时可以得到实质性改进吗?如果是这样,怎么样?

感谢,

迈克尔 - 比尔格

+0

退房http://*.com/questions/947401/anything-wrong-with-releasing-software-in-debug-mode – 2011-01-26 15:14:54

  1. 我不相信有一个标志,尽管你可能会发现,通过使用PEDUMP将转储COFF格式的文件(EXE的Windows和DLL)的东西。通过运行Dependecy Walker并查看您的EXE是否链接到任何调试DLL(后缀为D,例如MSVCRT5D.DLL),您可以推断是否编译了可执行文件以进行调试。

    在VC6中的FYI调试和发布是简单的命名构建,而不是每种方式的模式,每个构建一个编译器和链接器设置的集合。 EXE只是代码,调试通常不会被优化,这使得使用调试器很容易(与调试优化代码相比)。因此,您可以使用调试符号编译Release二进制文件,这有时可用于跟踪优化的代码错误。

  2. 调试EXE和DLL不包含任何调试信息,而是有一个边车PDB文件驻留在同一个文件夹中,并包含编译期间生成的所有调试符号信息。

  3. 不,源是源代码,没有编译到符号文件或可执行文件中。有一些令人惊叹的反编译器可以重新生成你的代码的体面的C版本,但它们只有在C有多好时,才会令人惊叹,而不是它们能够如何重新创建源代码。

我认为,许多反汇编可以显示来源,如果一个二进制文件在调试模式下编译。例如,我使用OllyDBG,它有一个选项来显示源代码,尽管我从来没有尝试过。

+1

当模块被编译源文件的位置嵌入。如果源文件不存在于该位置,则不能查看源代码... – 2011-01-26 15:15:27

使用Visual Studio,恐怕你不能,因为调试可执行文件不包含源代码。 Visual Studio生成的pdb文件只包含二​​进制文件和源文件名和行号之间的映射,但您仍然需要源代码。这可能与gcc不同,我认为gcc将源码本身集成到二进制文件中。

+0

gcc不会将源代码集成到二进制文件中,它会使用file:line注释代码,尽管 – Hasturkun 2011-01-26 15:23:00

+0

@Hasturkun好。因此,与Visual Studio构建唯一的区别是,文件:行信息直接在二进制文件中,而VS使用单独的pdb文件? – tibur 2011-01-26 15:26:12