0

来自C++ 中的思考 - 卷。1

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

解释器总是直接在源代码上工作(在将它逐行翻译成机器代码之后),因此可能是它在发生错误时可以更加具体的原因。

来自:说源代码始终可供解释器使用是什么意思?

速度是使用解释器的标准之一。是的,发生错误时可以直接参考源代码。但是当运行时运行编译后的代码时,它不能引用发生错误的确切行。

现在,调试器呢?
GDB 处理编译器产生的输出,所以这里 GCC 和 GDB 有相同的文件可以处理。

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

4

2 回答 2

3

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

这是两个具有不同目的的不同软件。首先你应该明白这一点。

所以这里 GCC 和 GDB 有相同的文件可以处理

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

我不太确定 GCC,但它应该有debugrelease构建选项。在调试模式下编译时,默认情况下会生成帮助 GDB 调试的符号。但在发布模式下,默认符号不会生成,GDB 无法调试发布版本。

于 2012-12-26T08:13:12.967 回答
0

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

此外,如果您尝试gdbexe没有符号表信息的情况下附加,则会gdb警告您无法找到符号表并且无法附加exegdb

当您附加到exewith gdb- 时,您需要键入run命令来运行exe. 希望这可以帮助。

于 2013-01-06T11:54:10.343 回答