当前位置:首页 > gdb手册
调试父进程的话,就启动一个新的GDB)附着到这个子进程上(参见4.7调试某个已运行的进程一节)。从那一点开始,你就可以像调试其他附着到的进程一样,调试这个子进程了。
在某些系统上,GDB对那些利用fork或者是vfork函数创建额外进程的程序提供了支持。目前,仅有的带有这一特性的几个平台是:HP-UX(仅11.x及后续版本?)和GNU/Linux(2.5.60及后续版本)。
一般情况下,当程序forks时,GDB会继续调试父进程,而不会对子进程的运行有所妨碍。
如果你想跟随子进程而不是父进程的话,就使用命令set follow-fork-mode。
set follow-fork-mode
设置调试器响应程序对fork或vfork的调用。一个fork或vfork的调用创建一个新的进程。mode参数可以是: parent
fork之后的原有进程被调试。子进程的运行不受妨碍。这也是默认的。
child
show follow-fork-mode
假如你要求调试子进程,同时vfork之后又跟着一个exec的话,GDB执行那个新的目标直到遇到目标中的第一个断点。如果在原有程序的main中有一个断点的话,那么这个断点也会被设置在子进程的main中。
当子进程被vfork产生时,直到exec调用完成之前,既不能对子进程调试也不能对父进程调试。
如果在exec调用执行之后,你对GDB发出了一个run命令,这个新的目标重新启动。要重新启动父进程,须利用以父进程可执行文件名为参数的file命令。可以使用catch命令,只要有fork,vfork或exec调用产生,就让GDB停止。参见设置捕获点一节。
显示调试器目前对fork或vfork调用的响应。
fork之后的新进程被调试。父进程的运行不受妨碍。
5.0停止与继续
使用调试器的首要目的是为了在程序终止之前停止程序;抑或为了程序运行有问题时,可以探查并寻找原因。
在GDB内部,程序可以因为多种因素而停止,如信号、断点,或者是使用step这样的命令后到达了新的一行。然后可以查看和更改变量,设置新的断点或去除老的断点,然后继续执行。通常,GDB所显示的消息对程序的状态都提供了充分的说明——也可以在任时候显示的请求这些信息。
info program
显示有关程序状态的信息:是否在运行、它的进程是什么,还有他为什么停止了。
5.1 断点、观察点和捕捉点 5.2 持续与步进 5.3 信号
5.4 停止与启动多线程程序
恢复执行
5.1 断点、观察点和捕捉点
只要到达了程序中的某一断点,程序就会停止。对于每一个断点,都可以附加一些条件,在细节上控制程序的停止与否。可以利用break命令设置断点和它的变体(参见设置断点一节),用行号、函数名或者是程序中的确切地址,指定程序应在何处停止。
在有些系统上,在可执行文件运行以前,就可以在共享库中设置断点。在HP-UX系统上会有一点限制:要想在那些不被程序直接调用的共享库例程(例如,作为pthread_create调用的参数的例程)中设置断点,必须等到可执行文件运行才行。
观察点是一种特殊的断点,当某个表达式的值改变时,停止程序。必须使用一个不同的命令来设置观察点(参见设置观察点一节),但除此以外,就可以向管理断点那样管理观察点:可以利用相同的命令启用,停用和删除观察点和断点。
可以安排程序中的某些值,只要GDB停在了某个断点上,就可以自动地被显示出来(参
见自动显示一节)。
捕获点是另外一种特殊的断点,当有某些事件发生时,停止程序,例如抛出C++异常,或者某个库的加载。与观察点一样,使用不同的命令设置捕获点,但除此以外,可以像管理断点那样管理捕获点。(要使程序在接收到某个信号时停止,使用handle命令;参见信号一节)。
当创建一个断点、观察点或者捕获点时,GDB会为他们分配一个编号;这些编号是从1开始的连续整数。在许多的控制断点不同特性的命令中,使用编号说明要改变哪一个断点。要是被停用了,直到再次启用前是不会对程序有任何影响的。
有些GDB命令可以接受某一范围的断点,对其操作。一个断点范围即可以使一个单独的编号,像“5”,也可以是两个编号,递增顺序,中间用横线连接,像“5-7”。当某个断点范围指定给了某个命令时,在那范围以内的所有断点都会受到影响。
5.1.1 设置断点 5.1.2 设置观察点 5.1.3 设置捕获点 5.1.4 删除断点 5.1.5 停用断点 5.1.6 中断条件 5.1.7 断点命令列表 5.1.8 断点菜单 5.1.9 “不能插入断点”
5.1.10 “调整过的断点地址……”
5.1.1 设置断点
断点由break(简写b)命令设置。调试器便利变量(debugger convenience variable)“$bpnum”记录了最近设置的断点的数量;参见便利变量一节,讨论了使用便利变量都可以做什么。
有多种方法说明断点的去向:
break function 在函数function的入口处设置断点。当使用允许符号重载的源语言时,如C++,function可能会涉及到多个可能的中断位置。参见断点菜单一节,对于这种情形的讨论。
break +offset break –offset
从当前选取的堆栈帧的执行停止处,向前或向后若干行处设置一个断点。参见帧一节,对于堆栈帧的描述。
break linenum
在当前源文件的第linenum行处设置一个断点。当前源文件即最后那个被打印出源程序文本的文件。断点会正好在执行那以行的任何代码之前停止程序。
break filename:linenum
在源文件filename的linenum行处设置一个断点。
break filename:function
在文件filename中找到的函数function的入口处设置一个断点。即指定文件名又指定函数名是多余的,除非是有多个文件中包含了相同名称的函数。
break *address
在地址address处设置一个断点。可以使用这个命令,在程序中那些没有调试信息或源文件的部分中设置断点。 break
当不使用任何参数调用的时候,break在被选取的堆栈帧内的下一个要执行的指令处设置一个断点(参见检查堆栈一节)。在被选取的任何堆栈帧内除最深处的以外,这会使得一旦控制回到那一帧,程序就会停止。这有些类似于被选择帧的内部帧内的finish命令的作用——除了finish还没有离开活动断点之外。要是在最内
共分享92篇相关文档