【工具使用】VSCode+GDB实现可视化调试
本文最后更新于 19 天前,其中的信息可能已经有所发展或是发生改变。

配置环境

  1. 安装微软官方提供的C/C++插件
  2. 配置将文件launch.json改为如下
{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 启动", //配置名称,显示在配置下拉菜单中
            "type": "cppdbg", //配置类型
            "request": "launch", //请求配置类型,可以是启动或者是附加
            "program": "${fileDirname}/a.out", //程序可执行文件的完整路径,${workspaceFolder}表示远程连接的初始路径
            "args": [], //传递给程序的命令行参数
            "stopAtEntry": true, //可选参数,如果为true,调试程序应该在入口(main)处停止
            "cwd": "${workspaceFolder}", //用于查找依赖项和其他文件的当前工作目录
            "environment": [], //表示要预设的环境变量
            "externalConsole": false, //如果为true,则为调试对象启动控制台
            "MIMode": "gdb", //要连接到的控制台启动程序
            "setupCommands": [ //为了安装基础调试程序而执行的一个或多个GDB/LLDB命令
                {
                    "description": "开启pretty-printer",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "设置反汇编风格为inter",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}
  • 如果调试时出现Module containing this breakpoint has not yet loaded or the breakpoint address could not be obtained.的提示,请在gcc编译时添加-g参数
  • 如果调试时提示无法找到对应的动态库,使用如下命令修改环境变量
  export LD_LIBRARY_PATH=/path/to/your/libs:$LD_LIBRARY_PATH
  • 可将右键变量添加到监视,在监视中可使用gdb命令查看数组结构体等元素的值 例如可在监视中手动添加*r@10来监视数组r的前10位元素

如何调试库函数

在调试时如果单步执行遇到库函数srand(time(NULL));则GDB会提示无法加载源文件

此时代码中的time(NULL)函数指向libc.so.6库,由于在GDB配置路径中不存在对应版本的glibc源代码所以无法正常跳转至函数定义处

/lib/x86_64-linux-gnu/libc.so.6是Linux操作系统中的动态链接库,全称为C标准库。在Linux系统中,所有使用C语言编写的程序都需要使用C标准库提供的函数、变量和常量。C标准库的主要功能包括文件操作、字符串操作、数学计算、内存管理、时间处理、网络通信等方面。C标准库是Linux操作系统中的一项核心组件,对于开发Linux应用程序非常重要。/lib/x86_64-linux-gnu/libc.so.6这个文件是C标准库的本地动态链接库,也就是所谓的libc库。在运行Linux程序时,如果发现程序需要用到C标准库中的函数或变量,就会自动调用该库中相应的代码来完成操作

通过ldd --version、直接执行对应的libc.so.6文件都可以找到自身系统的libc.so.6对应的glibc版本是多少

下载对应版本的glibc源代码,并将源代码目录放在配置文件中的"cwd": "${workspaceFolder}/glibc-2.31",中,此时再使用gdb调试遇到库函数时便会跳转至glibc源码中对应的函数实现

上一篇
下一篇