当前位置:Linux教程 - Linux - GDB调试器使用手册(七)

GDB调试器使用手册(七)



         结束子进程
    =========================
    `kill\"
    Kill命令结束你程序在gdb下开的子进程
    这个命令当你想要调试(检查)一个core dump文件时更有用。gdb在调试过程中
    会忽略所有的core dump。
    在一些操作系统上,一个程序当你在上面加了断点以后就不能离开gdb独立运行。
    你可以用kill命令来解决这个问题。
    \"kill\"命令当你想重新编译和连接你的程序时也很有用。因为有些系统不允许修改
    正在执行的可执行程序。这样当你再一次使用\"run\"命令时gdb会知道你的程序已经被改
    变了,那么gdb会重新load新的符号。(而且尽量保持你当前的断点设置。
    附加的进程信息
    ==============================
    一些操作系统提供了一个设备目录叫做\"/proc\"的,供检查进程映象。如果gdb被在这
    样的操作系统下运行,你可以使用命令\"info proc\"来查询进程的信息。(\"info proc\"命
    令只在支持\"procfs\"的SVR4系统上有用。
    `info proc\"
    显示进程的概要信息。
    `info proc mappings\"
    报告你进程所能访问的地址范围。
    `info proc times\"
    你进程和子进程的开始时间,用户时间(user CPU time),和系统CPU时间。
    `info proc id\"
    报告有关进程id的信息。
    `info proc status\"
    报告你进程的一般状态信息。如果进程停止了。这个报告还包括停止的原因和收到的
    信号。
    `info proc all\"
    显示上面这些命令返回的所有信息。
    对多线程程序的调试
    ========================================
    一些操作系统中,一个单独的程序可以有一个以上的线程在运行。线程和进程精确的定?nbsp;
    ?nbsp;

    ?nbsp;
    ?nbsp;
    有自己的寄存器,运行时堆栈或许还会有私有内存。
    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]\"的消息
    来向你报告。
    *参见:运行和停止多线程程序。
    *参见:设置观察点

    调试多进程的程序
    ==========================================
    gdb对调试使用\"fork\"系统调用产生新进程的程序没有很多支持。当一个程序开始
    一个新进程时,gdb将继续对父进程进行调试,子进程将不受影响的运行。如果你在子
    进程可能会执行到的地方设了断点,那么子进程将收到\"SIGTRAP\"信号,如果子进程没
    有对这个信号进行处理的话那么缺省的处理就是使子进程终止。
    然而,如果你要一定要调试子进程的话,这儿有一个不是很麻烦的折衷的办法。在
    子进程被运行起来的开头几句语句前加上一个\"sleep\"命令。这在调试过程中并不会引
    起程序中很大的麻烦(不过你要自己注意例外的情况幺:-))。然后再使用\"ps\"命令列出
    新开的子进程号,最后使用\"attach\"命令。这样就没有问题了。
    关于这一段,本人觉得实际使用上并不全是这样。我在调试程中就试过,好象不一定
    能起作用,要看gdb的版本和你所使用的操作系统了。
    停止和继续
    ***********************
    调试器的基本功能就是让你能够在程序运行时在终止之前在某些条件下停止下来,然
    后再继续运行,这样的话你就可以检查当你的程序出错时你的程序究竟做了些什么。
    在gdb内部,你的程序会由于各种原因而暂时停止,比如一个信号,一个断点,或是
    由于你用了\"step\"命令。在程序停止的时候你就可以检查和改变变量的值,设置或去掉
    断点,然后继续你程序的运行。一般当程序停下来时gdb都会显示一些有关程序状态的信
    息。比如象程序停止的原因,堆栈等等。如果你要了解更详细的信息,你可以使用\"info
    program\"命令。另外,在任何时候你输入这条命令,gdb都会显示当前程序运行的状态信
    息。

    `info program\"
    显示有关你程序状态的信息:你的程序是在运行还是停止,是什么进程,为什么停
    止。

    断点,观察点和异常
    ========================================
    断点的作用是当你程序运行到断点时,无论它在做什么都会被停止下来。对于每个断点
    你都可以设置一些更高级的信息以决定断点在什么时候起作用。你可以使用\"break’命令
    来在你的程序中设置断点,在前面的例子中我们已经提到过一些这个命令的使用方法了。
    你可以在行上,函数上,甚至在确切的地址上设置断点。在含有异常处理的语言(比如象
    c++)中,你还可以在异常发生的地方设置断点。
    在SunOS 4.x,SVR4和Alpha OSF/1的设置中,你还可以在共享库中设置断点。
    观察点是一种特殊的断点。它们在你程序中某个表达式的值发生变化时起作用。你必
    须使用另外一些命令来设置观察点。除了这个特性以外,你可以象对普通断点一样对观察
    点进行操作--使用和普通断点操作一样的命令来对观察点使能,使不能,删除。
    你可以安排当你程序被中断时显示的程序变量。
    当你在程序中设置断点或观察点时gdb为每个断点或观察点赋一个数值.在许多对断点
    操作的命令中都要使用这个数值。

    发布人:netbull 来自:中国LINUX开发联盟