Debugging with GDB
html
http://www.delorie.com/gnu/docs/gdb/gdb_25.html
web
GDB调试多线程程序总结
多线程
一直对GDB多线程调试接触很少,最近由于工做有了一些接触,简单做点记录吧。 先介绍一下GDB多线程调试的基本命令。 info threads 显示当前可调试的全部线程,每一个线程会有一个GDB为其分配的ID,后面操做线程的时候会用到这个ID。 前面有*的是当前调试的线程。 thread ID 切换当前调试的线程为指定ID的线程。 break thread_test.c:123 thread all在全部线程中相应的行上设置断点thread apply ID1 ID2 command 让一个或者多个线程执行GDB命令command。thread apply all command 让全部被调试线程执行GDB命令command。 set scheduler-locking off|on|step 估计是实际使用过多线程调试的人均可以发现,在使用step或者continue命令调试当前被调试线程的时候,其余线程也是同时执行的,怎么只让被调试程序执行呢?经过这个命令就能够实现这个需求。off 不锁定任何线程,也就是全部线程都执行,这是默认值。 on 只有当前被调试程序会执行。 step 在单步的时候,除了next过一个函数的状况(熟悉状况的人可能知道,这实际上是一个设置断点而后continue的行为)之外,只有当前线程会执行。app
gdb对于多线程程序的调试有以下的支持:函数
(gdb) r
Starting program: /root/thread
[New Thread 1073951360 (LWP 12900)]
[New Thread 1082342592 (LWP 12907)]---如下三个为新产生的线程
[New Thread 1090731072 (LWP 12908)]
[New Thread 1099119552 (LWP 12909)]spa
(gdb) info threads
4 Thread 1099119552 (LWP 12940) 0xffffe002 in ?? ()
3 Thread 1090731072 (LWP 12939) 0xffffe002 in ?? ()
2 Thread 1082342592 (LWP 12938) 0xffffe002 in ?? ()
* 1 Thread 1073951360 (LWP 12931) main (argc=1, argv=0xbfffda04) at thread.c:21
(gdb)线程
注意,行首的蓝色文字为gdb分配的线程号,对线程进行切换时,使用该该号码,而不是上文标出的绿色数字。调试
另外,行首的红色星号标识了当前活动的线程orm
(gdb) info threads
4 Thread 1099119552 (LWP 12940) 0xffffe002 in ?? ()
3 Thread 1090731072 (LWP 12939) 0xffffe002 in ?? ()
2 Thread 1082342592 (LWP 12938) 0xffffe002 in ?? ()
* 1 Thread 1073951360 (LWP 12931) main (argc=1, argv=0xbfffda04) at thread.c:21
(gdb) thread 4
[Switching to thread 4 (Thread 1099119552 (LWP 12940))]#0 0xffffe002 in ?? ()
(gdb) info threads
* 4 Thread 1099119552 (LWP 12940) 0xffffe002 in ?? ()
3 Thread 1090731072 (LWP 12939) 0xffffe002 in ?? ()
2 Thread 1082342592 (LWP 12938) 0xffffe002 in ?? ()
1 Thread 1073951360 (LWP 12931) main (argc=1, argv=0xbfffda04) at thread.c:21
(gdb)htm
以上即为使用gdb提供的对多线程进行调试的一些基本命令。另外,gdb也提供对线程的断点设置以及对指定或全部线程发布命令的命令。
初次接触gdb下多线程的调试,每每会忽视gdb中活动线程的概念。通常来说,在使用gdb调试的时候,只有一个线程为活动线程,若是但愿获得其余的线程的输出结果,必须使用thread命令切换至指定的线程,才能对该线程进行调试或观察输出结果。