linux GDB 调试多线程

本文介绍使用GDB进行多线程程序调试的方法,包括自动通知新线程、线程间切换、查询现存线程、向线程发送命令及设置线程相关断点等功能。

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

 线程有自己的寄存器,运行时堆栈或许还会有私有内存。  
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]/ "的消息  
来向你报告。  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值