当前位置:首页 > gdb手册
GDB会询是否尝试这么做的确认,可以使用set confirm命令控制是否需要确认。(参见可选的警告与消息一节)。
4.8 杀掉子进程
kill杀掉运行在GDB下的程序的子进程。
这个命令在你想要调试一个core dump,而不是一个进程时很有用。程序运行时,GDB会忽略所有的core dump。
在某些操作系统上,当你在GDB中给某个程序设置了断点,那么这个程序就不能在GDB以外被执行了。可以在这里使用kill命令,准许在GDB以外运行程序。
kill在想要重新编译或重新连接程序的时候也很有用,因为在大多数系统上是不允许修改正在运行的进程的可执行文件的。在这种情况下,当你下次敲入run时,GDB会通知那个文件已经被修改了,并重新读取符号文件(会尽量维持当前的断点设置)。
4.9 多线程程序的调试
在某些操作系统中,例如HP-UX和Solaris,一个单独的程序可能拥有不止一个线程。一个操作系统对于另外一个操作系统,现程的精确语义是不相同的,但是大体上,单个程序的线程,除了共享同一个地址空间之外(更确切地说,它们都可以访问并修改同一个变量),与多进程近似。从另外一个角度讲,每一个线程拥有自己的寄存器和执行栈,而且也可能有自己专用的存储器。
GDB为调试多线程程序提供了如下功能: ? 新线程的自动通知。
? “thread threadno”,在线程间进行切换的命令。 ? “info threads”,查询现有线程的命令。
? “thread apply [threadno] [all] args”,让一列线程应用某个命令的命令 ? 线程特有的断点。
警告:这些功能并不是在每一个操作系统支持线程的GDB配置中都可用。你的GDB不支持线程的话,这些命令是不会起作用的。例如,有一个不支持线程的系统,来自“info
threads”命令的输入没有显示,而且总是拒线程命令,就像下面这样:
(gdb) info threads (gdb) thread 1
Thread ID 1 not known. Use the \see the IDs of currently known threads.
GDB的线程调试工具可以让你观察运行在你的程序中的所有线程——有个特殊的线程总会是调试的焦点所在,而且任何时候GDB都要获得对它的控制权。这个线程就被称作当前线程。调试命令透过对当前线程的观察来显示程序的信息。
只要GDB检测到程序中有新线程,它就使用“[New systag]”格式的一个消息显示目标系统对于这个线程的标识。systag是一个线程表示符,各式会因具体的系统而不同。例如,在LynxOS上,当GDB通知有一个新线程时,你看到的可能会是这样的消息:
[new process 35 thread 27]
相对的,在一个SGI系统上,systag就很简单,如“process 3 68”,没有过多的限定词。
为了调试的目的,GDB使用它自己的线程号——总是一个单独的整数——对应于程序中的各个线程。
info thread
显示目前程序中所有线程的一个摘要。GDB对于每一个线程的显示(按这种顺序):
1. 由GDB分配的线程号
2. 目标系统的线程标识符(systag) 3. 对应线程当前的堆栈帧的摘要信息
GDB线程号左边有一个“*”号,表明这是当前线程。例如:
(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
在HP-UX系统上:
为了调试的目的,GDB使用它自己的线程号——按照线程创建顺序分配的一个小整数——对应于程序中的各个线程。
只要GDB检测到了程序中有新的线程,它就使用“[New systag]”格式的一个消息显示目标系统对于这个线程的标识。systag是一个线程表示符,各式会因具体的系统而不同。例如,在HP-UX系统上,当GDB通知有一个新线程时,你看到的可能会是这样的消息:
[New thread 2 (system thread 26594)]
info thread
显示目前程序中所有线程的一个摘要。GDB对于每一个线程的显示(按这种顺序):
1. 由GDB分配的线程号
2. 目标系统的线程标识符(systag) 3. 对应线程当前的堆栈帧的摘要信息
GDB线程号左边有一个“*”号,表明这是当前线程。例如:
(gdb) info threads
* 3 system thread 26607 worker (wptr=0x7b09c318 \ at quicksort.c:137 2 system thread 26606 0x7b0030d8 in __ksleep () \\ from /usr/lib/libc.2 1 system thread 27905 0x7b003498 in _brk () \\ from /usr/lib/libc.2
在Solaris系统上,使用一个Solaris专有命令,能够显示更多有关用户线程的信息:
maint info sol-threads
显示Solaris上的用户线程信息。
thread threadno
使线程号为threadno线程成为当前线程。这个命令的参数threadno是GDB内部线程编号,也就是上述“info thread”所显示的那个。GDB以显示你所选择的线程的标识符,以及它目前的堆栈帧的摘要作为应答:
(gdb) thread 2
[Switching to process 35 thread 23] 0x34e5 in sigpause ()
同样带有“[New …]”消息,Switching to后面的文字格式依赖于你的操作系统所规定的线程标识。
thread apply [threadno] [all] args
thread apply命令使你可以给一个或多个线程应用某个命令。利用命令参数threadno指定你想要影响的线程的编号。threadno是GDB内部线程编号,也就是上述“info thread”所显示的那个。要对所有线程应用某个命令,使用thread apply all args。
只要GDB停止了你的程序,不管是因为某个断点还是某个信号,它都会自动地选择那个发生断点或信号的线程。GDB用一个“[Switching to systag]”格式消息提醒你注意上下文切换,鉴别线程。
参见停止与启动多线程程序一节,了解更多有关停止和启动某个带有多个线程的程序时,GDB是如果工作的信息。
参见设置观察点一节,了解有关带有多个线程的程序中的观察点信息。
4.10 多进程程序的调试
在大多数系统上,GDB没有对调试那些利用fork函数创建额外进程的程序提供特殊支持。当某个程序forks时,GDB会继续调试父进程,而不会对子进程的运行有所妨碍。如果你已在子进程能够执行到的任意代码中设置了一个断点话,那么子进程将会获得一个SIGTRAP信号,这(除非它获得了这个信号)会导致它的中断。
不管怎样,你要是想调试子进程,还是有一个不算太费力的工作区的。在子进程fork之后要执行的代码中放置一个sleep调用。只有当某个环境变量被设置了,或者已存在某个文件,那也许会对sleep有作用,所以,你不想在子进程上运行GDB时,那个延迟就没有必要发生。当子进程正睡眠时,利用ps程序获得它的进程ID。然后告诉GDB(要是还想
共分享92篇相关文档