当前位置:首页 > gdb - first - part
指定GDB的工作目录为directory pwd 打印GDB的工作目录
通常很难找到被调试程序的当前工作路径(因为它可以在运行的时候改变)。如果你是在支持‘/proc‘文件系统的系统下
运行GDB的,你可以用info proc命令来查找当前被调试程序的工作目录。(参见18.1.3节,[SVR4进程信息],183页)
4.6 程序的输入输出
缺省情况下,GDB里运行的程序在与GDB相同的终端上输入输出。GDB会在和你交互的时候切换到它自己的终端模式,
不过它会记住你的程序的终端模式然后在继续运行程序切换到那个模式上。 info terminal
显示GDB记录的你的程序使用的终端模式。 你可以用run命令重定向程序的输入/输出。例如: run > outfile
开始运行程序,将打印输出到文件‘outfile‘。
另外一个指定程序输入输出的命令是tty命令。这个命令接受一个文件名作为参数,然后将这个文件作为接下来的
run命令的缺省值。它也可以为子进程重置控制终端。例如: tty /dev/ttyb
将接下来run命令运行的进程的输入输出定向到‘/dev/ttyb‘,并将此作为控制终端。 run命令将改变tty命令对于输入输出的设备的设置,但不改变其控制终端。
用tty命令或者在run命令里重定向输入只会影响你调试的程序。GDB的输入仍然来自于你的终端。tty是set inferior-tty的别名。
你可以用show inferior-tty命令来趟GDB显示程序将要使用终端名。 set inferior-tty /dev/ttyb
将被调试程序的tty设备设置为/dev/ttyb show inferior-tty
显示被调试程序目前的tty设备名
4.7 调试一个已经在运行的进程 attach process-id
这个命令attach到一个从GDB外启动的进程上。(info files显示你当前活跃的目标)这个命令需要一个进
程id作为参数。通常用ps工具来找到一个Unix进程的ID,或者用‘jobs -l‘shell命令。 在你执行attach命令之后,按下回车键attach将不会再次执行。
只有在支持进程的环境下,attach命令才有效;例如,attach在没有操作系统的裸机上市无效的。你必须有发给 进程送信号的权限。
在你执行attach命令的时候,调试器首先在当前工作目录下查找进程的可执行程序,如果没有找到,接着会用源
代码文件搜索路径(参见7.5节[指定源代码目录],70页)。你也可以用file命令来加载可执行文件。参见15.1节[
指定文件的命令],155页。
GDB在准备好要调试的进程后第一件事就是中断这个进程。可以在run启动的进程上的使用的命令也可以用在你
attach的进程上,你可以检查,修改这个进程。你可以插入一个断点;你可以step和continue;你可以修改存储器。
如果你希望进程继续执行,你可以在attach之后用continue命令来继续。 detach
在完成了调试之后,可以用detach来释放GDB对进程的控制。detach进程后,进程继续执行。detach命令之
后,进程和GDB就没有关系了,你还可以attach到另外一个进程或者用run启动一个程序。detach执行之后
,按下回车键不会再重复。
如果你attach过一个进程,退出GDB会detach这个进程。如果你是用run命令启动的话,你将kill这个进程。缺省
的,GDB会要求得到你的确认;你可以用set confirm命令来控制是否需要确认(参见19.7节[可选的警告和消息],213页)。
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‘,对线程列表执行命令 线程特定断点
?set print thread-events‘,控制线程开始和结束时打印消息
警告:在各个支持线程的操作系统里,不是所有的GDB配置都支持这些工具的。如果你的GDB不支持线程,这个命
令就无效。例如,不支持线程的系统里‘info threads‘命令就不能输出信息,也会拒绝thread命令,如下:
(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察觉到进程的新线程,GDB就会用?[New systag]‘的方式显示目标系统的标识。systag是线程的标识,各
个系统不一样。例如,当GDB发现一个新线程的时候,在GNU/Linux你可能看到 [New Thread 46912507313328 (LWP 25582)]。
而在SGI系统里,systag就简单的形如?process 368‘,没有更多信息。 出于调试的目的,GDB自己会给线程一个编号–总是一个整数。 info threads
显示当前进程里的线程的总概要。GDB显示每个线程(以此为序): 1.GDB分配的线程号
2.目标系统的线程标识(systag) 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
在HP-UX系统里:
出于调试目的, GDB为进程里每个线程分配一个线程号(以线程创建顺序分配小整数)。 无论何时GDB察觉到一个新线程,它会用?[New systag]‘的形式显示GDB自己的线程号和目标系统的线程标志 。
systag是线程标识,各个系统下可能不同。例如,GDB察觉到新线程,在HP-UX,你能看到 [New thread 2 (system thread 26594)]。 info threads
显示所有线程的概要。GDB显示每一个线程(以此为序): 1.GDB分配的线程 号
2.目标系统的线程标识(systag) 3.线程当前栈的概要
线程号左边的星号‘*'代表此线程是当前线程。例如: (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 threads‘
命令显示第一列。
GDB会显示你选择的线程的系统标识和它当前栈的概要: (gdb) thread 2
[Switching to process 35 thread 23] 0x34e5 in sigpause ()
伴随着‘[New...]?消息,‘Switching to‘之后的文本形式由你的系统线程标识表示方式决定。 thread apply [threadno] [all] command
thread apply命令可以让你在一个或多个线程上执行名为command命令。用参数threadno指定你希望操作的
线程数目。可以是单个线程号,‘info threads‘显示的第一列;或者可以是线程范围,像2-4.要操作所有
线程,敲入thread apply all command。 set print thread-events set print thread-events on set print thread-events off
GDB察觉到新线程启动或线程结束的时候,set print thread-events命令可以开启或关闭打印信息。缺省
下,如果目标系统支持的话,这些事件发生的时候,这些信息会打印出来。注意,这些信息不一定在所有目
标系统里都可以关闭的。 show print thread-events
显示是否在GDB察觉线程启动或结束时打印信息。
由断点或者信号决定,无论何时GDB停止程序,它都会选择断点或信号发生的线程。GDB会用?[Switching to syst
ag]‘形式标识线程提示线程上下文的切换。
更多关于GDB在停止启动多线程程序的行为的信息,参见5.4节[停止核启动多线程程序],59页。
更多多线程程序观察点的信息,参见5.1.2[设置观察点],44页。
4.10 调试多个程序
在多数系统下,GDB没有为能用fork调用创建附加进程的程序提供特殊的支持。程序创建子进程时,GDB会继续调试
父进程,而子进程则不受影响。如果你此前在子进程的代码上设置了一个断点,则子进程会被SIGTRAP信号结束。
不过,如果你想调试子进程的话,有一个不那么麻烦的替代方案。在fork调用之后的子进程代码里调用sleep调
共分享92篇相关文档