来自思考C ++ - Vol。 1 :
口译员有很多优点。从编写代码转换到 执行代码几乎是立即的,源代码总是如此 可用 因此,当出现错误时,解释器可以更加具体 发生
解释器总是直接在源代码上工作(在将其逐行转换为机器代码之后),这可能是发生错误时更具体的原因。
来自:What does it mean to say that the source code is always available to interpreters?
速度是使用解释器的一个标准。是的,它可以在发生错误时直接引用源代码。 但是当运行时运行已编译的代码时,它无法引用发生错误的确切行。
现在,调试器怎么样?
GDB处理编译器产生的输出,因此这里GCC和GDB有相同的文件可供使用。
为什么GDB能够在确切的行上显示确切的错误(在运行时),然后与编译器相比?
答案 0 :(得分:3)
与编译器相比,为什么GDB能够在确切的行(运行时)中显示确切的错误?
这是两种不同用途的软件。首先你应该明白这一点。
所以这里GCC和GDB有相同的文件可供使用
不完全是,Debugger需要在编译期间生成更多文件。 (称为符号)。这些符号是编译代码和源代码之间的桥梁。
我对GCC不太了解,但它应该有debug
和release
构建选项。
在调试模式下编译时,默认生成符号以帮助GDB进行调试。但在发布模式下,不会生成默认符号,GDB也无法调试发布版本。
答案 1 :(得分:0)
在GDB
中,我们有-g
选项来构建用于调试目的的代码。
使用-g
选项构建代码时,符号故事与exe
相关联,以帮助gdb
获取变量和函数位置信息。
当您运行gdb
时,此符号表将帮助gdb
了解代码的行号。
如果您想知道exe
是否有符号表,请尝试使用此命令 - file <exe>
此命令将为您提供有关exe
是否具有符号表的信息。
如果exe
有一个符号表,则此命令的结果将包含-----未剥离的关键字。
此外,如果您尝试在gdb
上附加exe
而没有符号表信息,gdb
会向您发出警告,表示无法找到符号表且无法附加exe
与gdb
。
当您使用exe
附加到gdb
时 - 您需要输入run
命令才能运行exe
。
希望这会有所帮助。