最近在看C++ Concurrency in Action,有些代码需要调试查看运行过程,结合以前单线程的调试和网上的一些资料进行多线程调试。在此简单记录一下步骤,方便日后使用。
1、编译
gcc -g -ggdb -std=c++11 -pthread test.cpp -o test
2、gdb常用命令
r(run)启动
start启动-停留在main函数,分步调试
n(next)下一条指令
s(step)下一条指令,可进入函数,原函数无法进入
q(quit)退出gdb
set args 10,6 设置输入参数
set argc=2 动态设置变量值
list显示代码(list fun.c:1查看指定的文件代码)
b(break) 17 在17行打断点
b sum 在sum函数打断点
b func.c:11 为func.c的11行打断点
Info b查看断点信息
del 编号 删除第6编号的断点
p(print) 变量 查看变量的值
ptype 变量 查看变量类型
c(continue)跳到下一断点
display 变量 跟踪变量的值,查看变量什么时候变化
undisplay 编号 不跟踪
b 行号 if i==1设置条件断点
3、常用的多线程调试命令
- pstree -p 主线程id 以树的形式查看线程关系
- pstack 线程号 查看线程结构(pstack可能会出错,可以在网上找个shell源码就行)
- info inferiors 查看进程
- info threads 查看线程
- bt 查看线程栈结构
- thread n 切换到n号线程
- set scheduler-locking on 锁定当前线程,类似只看当前线程执行
- set scheduler-locking off 默认不锁定,都执行
- thread apply ID1 ID2 command 让id1 id2执行gdb命令
- thread apply all command 所有的线程都执行
4、使用
4.1 进入调试
gdb test
r
Ctrl+c 暂定运行
4.2 查看线程信息
info thread
bt
4.3、切换线程
thread 2
4.4、锁定线程
set scheduler-locking on
4.5、取消锁定
set scheduler-locking off