GDB 多线程调试

简介: 线程有自己的寄存器,运行时堆栈或许还会有私有内存。 gdb提供了以下供调试多线程的进程的功能: * 自动通告新线程。 * \ "thread THREADNO\ ",一个用来在线程之间切换的命令。 * \ "info threads\ ",一个用来查询现存线程的命令。

线程有自己的寄存器,运行时堆栈或许还会有私有内存。 
gdb提供了以下供调试多线程的进程的功能: 
* 自动通告新线程。 
* \ "thread THREADNO\ ",一个用来在线程之间切换的命令。 
* \ "info threads\ ",一个用来查询现存线程的命令。 
* \ "thread apply [THREADNO] [ALL] ARGS\ ",一个用来向线程提供命令的命令。 
* 线程有关的断点设置。 
注意:这些特性不是在所有gdb版本都能使用,归根结底要看操作系统是否支持。 
如果你的gdb不支持这些命令,会显示出错信息: 
    (gdb) info threads 
    (gdb) thread 1 
    Thread ID 1 not known. Use the \ "info threads\ " command to 
    see the IDs of currently known threads. 
gdb的线程级调试功能允许你观察你程序运行中所有的线程,但无论什么时候 
gdb控制,总有一个“当前”线程。调试命令对“当前”进程起作用。 
一旦gdb发现了你程序中的一个新的线程,它会自动显示有关此线程的系统信 
息。比如: 
    [New process 35 thread 27] 
不过格式和操作系统有关。 
为了调试的目的,gdb自己设置线程号。 
`info threads\ " 
显示进程中所有的线程的概要信息。gdb按顺序显示: 
1.线程号(gdb设置) 
2.目标系统的线程标识。 
3.此线程的当前堆栈。 
一前面打\ "*\ "的线程表示是当前线程。 
例如: 
(gdb) info threads 
3 process 35 thread 27 0x34e5 in sigpause () 
2 process 35 thread 23 0x34e5 in sigpause () 
* 1 process 35 thread 13 main (argc=1, argv=0x7ffffff8) 
at threadtest.c:68 
`thread THREADNO\ " 
把线程号为THREADNO的线程设为当前线程。命令行参数THREADNO是gdb内定的 
线程号。你可以用\ "info threads\ "命令来查看gdb内设置的线程号。gdb显示该线程 
的系统定义的标识号和线程对应的堆栈。比如: 
(gdb) thread 2 
[Switching to process 35 thread 23] 
0x34e5 in sigpause () 
\ "Switching后的内容取决于你的操作系统对线程标识的定义。 
`thread apply [THREADNO] [ALL] ARGS\ " 
此命令让你对一个以上的线程发出相同的命令\ "ARGS\ ",[THREADNO]的含义同上。 
如果你要向你进程中的所有的线程发出命令使用[ALL]选项。 
无论gdb何时中断了你的程序(因为一个断点或是一个信号),它自动选择信号或 
断点发生的线程为当前线程。gdb将用一个格式为\ "[Switching to SYSTAG]\ "的消息 
来向你报告。

对于多线程程序,你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。GDB很容易帮你完成这一工作。 
break <linespec> thread <threadno> 
break <linespec> thread <threadno> if ... 
linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过“info threads”命令来查看正在运行程序中的线程信息。如果你不指定thread <threadno>则表示你的断点设在所有线程上面。你还可以为某线程指定断点条件。如: 
(gdb) break frik.c:13 thread 28 if bartab > lim 
当你的程序被GDB停住时,所有的运行线程都会被停住。这方便你你查看运行程序的总体情况。而在你恢复程序运行时,所有的线程也会被恢复运行。那怕是主进程在被单步调试时。

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
3月前
|
NoSQL 编译器 C语言
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。高级技巧包括内存检查、性能分析和符号调试。通过实践案例学习如何有效定位和解决问题,同时注意保持耐心、合理利用工具、记录过程并避免过度调试,以提高编程能力和开发效率。
77 1
|
6月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
87 10
|
6月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
269 3
|
6月前
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
175 0
|
8月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
66 1
|
8月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
46 0
|
8月前
|
NoSQL Linux C++
Linux C/C++ gdb调试正在运行的程序
Linux C/C++ gdb调试正在运行的程序
|
8月前
|
NoSQL Linux C++
Linux C/C++ gdb调试core文件
Linux C/C++ gdb调试core文件
|
8月前
|
NoSQL Linux C++
Linux C/C++ gdb调试
Linux C/C++ gdb调试
|
9月前
|
NoSQL Ubuntu 测试技术
【GDB自定义指令】core analyzer结合gdb的调试及自定义gdb指令详情
【GDB自定义指令】core analyzer结合gdb的调试及自定义gdb指令详情
133 1