GDB调试cmake工程

文章介绍了如何在CMake中配置编译选项以生成用于调试的二进制文件,以及如何使用GDB进行调试,包括加载本地动态库、设置断点、常用GDB命令的使用。同时,文章详细讲解了多线程调试的方法,如查看和切换线程,控制线程执行等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译项配置:

CMakelists.txt配置:
在其中添加:

set(CMAKE_BUILD_TYPE DEBUG)
add_definitions(-g)

或:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -g")

或:
执行cmake时,添加-DCMAKE_BUILD_TYPE=Debug编译选项。

cmake -DCMAKE_BUILD_TYPE=Debug  ..

此方法可以不用改变CMakelist.txt。

https://blog.csdn.net/weixin_42322256/article/details/124638725
https://blog.csdn.net/heibao111728/article/details/131092329

gdb使用

gdb --args ./exefile arg1 args2
或:
gdb ./exefile
set args arg1 args2

本地动态库加载

在gdb运行之后,在gdb的输入界面

(gdb) r 或run
(gdb) load /pathtoso/xxx.so
(gdb) b file:linenum或 b func

此时,可以将动态库对应的源文件及符号表导入到gdb,从而可以通过b file:linenumb func来设置断点

此外,可以手动设置源文件搜寻路径及导入符号表

(gdb) sharedlibrary <要调试的动态库> # 将动态库的符号读入gdb,为了你能找到变量和函数名
(gdb) breakpoint <要调试动态库的断点位置,如 src/test.cpp:100 >

https://blog.csdn.net/fireroll/article/details/107780929

其他GDB常用命令

r:run,执行程序
n:next,下一步,不进入函数
s:step,下一步,会进入函数
b:breakponit,设置断点
l:list,查看源码
c:continue,继续执行到下一断点
bt:backtrace,查看当前调用栈
p:print,打印查看变量
q:quit,退出 GDB
whatis:查看对象类型
info threads:查看线程
info breakpoints(info b):查看所有的断点
info locals:查看局部变量
info args:查看函数的参数值及要返回的变量值
info frame:堆栈帧信息

在遇到段错误等问题时,可以利用bt打出符号表,进而可知出现段错误的地方。
https://blog.csdn.net/Jailman/article/details/125758651

多线程调试

(1)查看可切换调试的线程:info threads
(2)切换调试的线程:thread 线程id
(3)只运行当前线程:set scheduler-locking on
(4)运行全部的线程:set scheduler-locking off
(5)指定某线程执行某gdb命令:thread apply 线程id gdb_cmd
(6)全部的线程执行某gdb命令:thread apply all gdb_cmd

https://blog.csdn.net/weixin_42158742/article/details/113100151

### 使用CMakeGDB进行断点调试的方法 对于希望利用CMake配合GDB来进行带有断点功能的调试操作,可以遵循如下说明: #### 配置编译环境以支持调试信息 为了确保能够顺利地通过GDB对由CMake管理构建过程的应用程序实施有效的调试工作,在配置阶段应当指定`-DCMAKE_BUILD_TYPE=Debug`选项[^1]。这一步骤至关重要,因为它会告知编译器保留必要的符号表和其他辅助数据结构用于后续的调试活动。 ```bash cmake -DCMAKE_BUILD_TYPE=Debug <path_and_other_arguments> ``` #### 启动并连接至GDB调试器 完成上述准备工作之后,可以通过命令行启动目标应用程序,并让其处于等待状态以便于接入GDB调试工具链。具体做法是在终端输入待执行二进制文件路径的同时附加`--args`参数传递给gdbserver服务端口监听指令(如果涉及远程调试场景),或者是直接调用`gdb ./your_program_name`进入交互模式下加载本地可执行映像。 当采用图形化集成开发平台如Visual Studio Code时,则需事先安装好相应的扩展插件——例如C/C++ IntelliSense, debugging, code browsing and other features (Microsoft),随后按照提示创建`.vscode/launch.json`配置文件定义不同类型的debugging sessions;其中特别关注的是有关`type`, `request`, 和`program`字段的内容设定应该匹配实际需求情景下的预期行为表现形式[^2]。 #### 设置与管理断点 无论是基于命令行还是IDE内部集成功能实现方式,均允许开发者灵活地在感兴趣的代码位置处插入临时性的暂停标记即所谓的“breakpoints”。对于纯文本编辑环境下作业而言,只需简单地键入诸如`b main`之类的语句即可指示GDB每当遇到main()函数入口之时自动中断流程供进一步探究分析之便;而借助现代化软件工程实践产物之一VSCode的话,则可通过点击左侧边栏对应行号前的小圆圈图标轻松达成相同目的[^3]。 值得注意的是,“断电情况”通常指的是意外掉线或强制终止进程的情形而非字面意义上面电力供应缺失的状态。因此在此背景下讨论如何妥善处理因非正常关闭而导致丢失未保存更改的问题显得更为贴切一些。针对这种情况建议采取预防措施比如定期存盘以及启用版本控制系统Git等手段来保障源码的安全性和连续性。 至于恢复之前已设立好的断点记录方面,由于大多数现代IDE都具备持久化的特性所以一般不会造成困扰;而对于原始GDB来说则可能需要重新手动重建这些控制点除非额外编写脚本自动化此部分任务流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值