线程的查看以及利用gdb调试多线程

gdb调试常用命令,attach,br,n,bt

在Oceanbase调试中,必须用到gdb,将常用命令搜集记录如下:

1. attach: 用gdb调试一个正在运行中的进程
gdb <program> PID

2. br: 设置断点
br filename:line_num

br namespace::classname::func_name

3. n: 单步跳过   s: 单步进入

4. finish:执行到函数retun返回

5. list: 列出当前位置之后的10行代码;list line_number: 列出line_number之后的十行代码

6. bt(backtrace):列出调用栈

7. info locals:列出当前函数的局部变量

8. p var_:打印变量值

9. info breakpoints:列出所有断点

10. delete breakpoints:删除所有断点;delete breakpoints id:删除编号为id的断点;disable/enable breakpoints id:禁用/启用断点

11. break ... if ... 条件中断

 

表 10.1. gdb基本命令1

命令描述
backtrace(或bt)查看各级函数调用及参数
finish执行到当前函数返回,然后停下来等待命令
frame(或f) 帧编号选择栈帧
info(或i) locals查看当前栈帧局部变量的值
list(或l)列出源代码,接着上次的位置往下列,每次列10行
list 行号列出从第几行开始的源代码
list 函数名列出某个函数的源代码
next(或n)执行下一行语句
print(或p)打印表达式的值,通过表达式可以修改变量的值或者调用函数
set var修改变量的值
start开始执行程序,停在main函数第一行语句前面等待命令
step(或s)执行下一行语句,如果有函数调用则进入到函数中

表 10.2. gdb基本命令2

命令描述
break(或b) 行号在某一行设置断点
break 函数名在某个函数开头设置断点
break...if...设置条件断点
continue(或c)从当前位置开始连续而非单步执行程序
delete breakpoints删除断点
display 变量名跟踪查看一个变量,每次停下来都显示它的值
disable breakpoints禁用断点
enable breakpoints启用断点
info(或i) breakpoints查看当前设置了哪些断点
run(或r)从头开始连续而非单步执行程序
undisplay取消对先前设置的那些变量的跟踪
命令描述
watch设置观察点
info(或i) watchpoints查看当前设置了哪些观察点
x从某个位置开始打印存储器的一段内容,全部当成字节来看,而不区分哪些字节属于哪些变量

 

 

总结调试多线程的命令

命令     用法
info threads     显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程
thread ID(1,2,3…)     切换当前调试的线程为指定ID的线程
break thread_test.c:123 thread all(例:在相应函数的位置设置断点break pthread_run1)     在所有线程中相应的行上设置断点
thread apply ID1 ID2 command     让一个或者多个线程执行GDB命令command
thread apply all command     让所有被调试线程执行GDB命令command
set scheduler-locking 选项 command     设置线程是以什么方式来执行命令
set scheduler-locking off     不锁定任何线程,也就是所有线程都执行,这是默认值
set scheduler-locking on     只有当前被调试程序会执行
set scheduler-locking on step     在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行
 

 


C++中用GDB调试的注意事项:

1. 函数断点的结构是namespace::ClassName::funcName

(gdb) b oceanbase::mergeserver::ObMsSqlScanEvent::process_result
Breakpoint 1 at 0x435c0a: file ob_ms_sql_scan_event.cpp, line 533.


还有一个小问题,网上很少提到:被调试的程序必须和源码放在同一台机器上,才能用list命令列出源码,否则提示找不到。


直接回车,总可以重复执行上一个命令。

参考: http://baigoogledu.blog.51cto.com/738227/153948 举例讲解

涉及到多线程调试,参考:http://wenku.baidu.com/view/ab2b0623bcd126fff7050ba0.html
 线程的查看以及利用gdb调试多线程             https://blog.csdn.net/zhangye3017/article/details/80382496  举例讲解

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值