与编译器相比,为什么在发生错误时调试器更具体?

时间:2012-12-26 08:03:41

标签: c++ debugging compiler-construction interpreter

来自思考C ++ - Vol。 1

  

口译员有很多优点。从编写代码转换到   执行代码几乎是立即的,源代码总是如此   可用 因此,当出现错误时,解释器可以更加具体   发生

解释器总是直接在源代码上工作(在将其逐行转换为机器代码之后),这可能是发生错误时更具体的原因。

来自:What does it mean to say that the source code is always available to interpreters?

  

速度是使用解释器的一个标准。是的,它可以在发生错误时直接引用源代码。 但是当运行时运行已编译的代码时,它无法引用发生错误的确切行。

现在,调试器怎么样?
GDB处理编译器产生的输出,因此这里GCC和GDB有相同的文件可供使用。

为什么GDB能够在确切的行上显示确切的错误(在运行时),然后与编译器相比?

2 个答案:

答案 0 :(得分:3)

  

与编译器相比,为什么GDB能够在确切的行(运行时)中显示确切的错误?

这是两种不同用途的软件。首先你应该明白这一点。

  

所以这里GCC和GDB有相同的文件可供使用

不完全是,Debugger需要在编译期间生成更多文件。 (称为符号)。这些符号是编译代码和源代码之间的桥梁。

我对GCC不太了解,但它应该有debugrelease构建选项。 在调试模式下编译时,默认生成符号以帮助GDB进行调试。但在发布模式下,不会生成默认符号,GDB也无法调试发布版本。

答案 1 :(得分:0)

GDB中,我们有-g选项来构建用于调试目的的代码。 使用-g选项构建代码时,符号故事与exe相关联,以帮助gdb获取变量和函数位置信息。 当您运行gdb时,此符号表将帮助gdb了解代码的行号。 如果您想知道exe是否有符号表,请尝试使用此命令 - file <exe> 此命令将为您提供有关exe是否具有符号表的信息。 如果exe有一个符号表,则此命令的结果将包含-----未剥离的关键字。

此外,如果您尝试在gdb上附加exe而没有符号表信息,gdb会向您发出警告,表示无法找到符号表且无法附加exegdb

当您使用exe附加到gdb时 - 您需要输入run命令才能运行exe。 希望这会有所帮助。