一. 参考资料
- 《C/C++代码调试的艺术》
二. 调试过程
1. 编译:
使用Debug模式编译,或者使用Release模式编译加入-g参数,-g选项会在可执行文件中加入调试信息,这些信息包含了程序中的变量名、函数名、行号等,能让gdb将程序的机器码与源代码对应起来,从而实现调试,如查看变量值、设置断点等。若编译时未加-g选项,可执行文件中的调试信息会很少或没有,gdb调试时只能看到机器码,难以进行有效的调试。
cmake_minimum_required(VERSION 2.8.12)
project(trajectory_optimization)
# set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_BUILD_TYPE "RELEASE")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -g -Wall")
2. 启动gdb调试
如上图表示启动gdb调试程序成功,这时gdb已经成功加载程序,可以使用一些gdb的命令,比如设置断点,查看代码等,执行list命令结果如下图所示,可以看到main.cpp文件的内容:
此时使用r命令即可启动程序,如下图所示:
3. gdb调试附加参数
直接在可执行文件后面添加参数即可,会作为main的argv传进去
4. gdb调试常用命令&参数
命令类型 | 命令 | 功能 |
启动/停止 | run/r run 命令行参数 run > 输出文件 | 启动程序 以传入参数的方式启动程序 将输出重定向到输出文件 |
kill | 停止程序 | |
quit/q | 退出gdb | |
源代码 | list/l list行号 list函数名 list- list开始,结束 list文件名:行号 | 查看源代码 显示指定行号代码 显示指定函数代码 往前显示代码 显示指定区间的代码 显示指定文件名的指定行代码 |
---|---|---|
set listsize 数字 show listsize | 设置显示的代码行数 查看一次显示的代码行数 | |
directory 目录名/dir 目录名 | 添加目录到源代码搜索路径中 | |
show directories directory | 查看源代码搜索目录 | |
dir | 清空添加到源代码搜索目录中的目录 | |
断点管理 | break 函数名 break 代码行号 break类名:函数名 break文件名:函数名 break文件名:行号 | 为函数设置断点 为某一代码行上设置断点 在某个类的函数上设置断点 在文件名指定的函数上设置断点 在文件名指定的代码行上设置断点 |
break *地址 break +偏移量 break-偏移量 break行号if条件 tbreak watch表达式 | 在指定地址设置断点 在当前代码行加上偏移量的位置设置断点 在当前代码行减去偏移量的位置设置断点 设置条件断点 设置临时断点 添加观察点 | |
clear clear函数 clear行号 | 删除所有断点 删除该函数的断点 删除行号对应的断点 | |
delete/d | 删除所有断点,包括观察点和捕获点 | |
delete 断点编号 delete 断点范围 disable 断点范围 enable 断点范围 enable 断点编号 once | 删除指定编号断点 删除指定范围断点 禁用指定范围的断点 启用指定范围断点 启用指定断点一次 | |
执行 | continue 数量 finish | 继续执行,忽略指定数量的命中次数 跳出当前函数 |
step/s step 步数 | 逐语句执行 逐语句执行步数 | |
next/n next数量 | 逐过程执行 逐过程执行指定行数的代码 | |
where | 显示当前执行的具体函数和代码行 | |
调用栈 | backtrace/bt | 显示调用栈信息 |
bt 栈帧数 bt-栈帧数 backtrace full | 显示指定数量的栈帧(从小到大) 显示指定数量的栈帧(从大到小) 显示所有栈帧的局部变量 | |
frame frame 帧编号/f 帧编号 | 切换帧到指定编号的帧 | |
up down up 帧数量 down 帧数量 | 切换帧,将当前帧增大1 切换帧,将当前帧减少1 切换帧,将当前帧增大指定数量 切换帧,将当前帧减少指定数量 | |
info frame info args info locals | 查看当前帧的信息 查看当前帧的参数 查看当前帧的局部变量 |