当前位置:嗨网首页>书籍在线阅读

04-调试的先决条件

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

17.1.2 调试的先决条件

编译后的程序或目标文件是由0和1组成的一组序列,它和原始的源代码文件没有映射关系。为了让程序能够被调试器检查,我们需要以某种方式将编译过的二进制指令映射到源文件。这种映射是通过在编译期注入额外的标记符号和检测代码来完成的,以便调试器能够锁定它们。这些符号保存在符号表中,该表包含有关程序元素的信息,例如变量、函数及类型的名称。它们遵循一种被称为使用属性记录信息调试(Debugging With Attributed Record Format,DWARF)的标准格式,大多数标准调试器都知道如何解析它。这些符号使开发者能够检查程序,例如将源代码与正在运行的二进制文件进行匹配,保存帧调用的信息,记录程序内存映射的值等。

要调试某个程序,我们需要在调试模式下编译它。在调试模式下,编译的二进制文件将包含DWARF格式的调试符号。这里的二进制文件增加了一些大小,并且运行速度更慢,因为它必须在运行时更新调试符号表。编译C程序时,需要使用-g标记进行编译,以告知编译器引用调试符号进行编译。通过Cargo,项目的调试版本默认会编译到target/debug/目录下,并且其中包含调试符号。

179.png 注意

当使用除 Cargo 以外的软件包管理器时,还可以将-g标记传递给rustc。

我们也可以针对预览版程序运行调试器,但这时可供选择的操作非常有限。如果要在预览版程序中启用DWARF符号,可以在Cargo.toml文件中的profile.release部分进行配置,如下所示:

[profile.release]
debug = true

接下来,让我们开始深入介绍GDB。