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

GDB调试器使用手册(九)



         断点条件
    ===========
    最简单的断点就是当你的程序每次执行到的时候就简单将程序挂起。你也可以为断点
    设置“条件”。条件只是你所使用的编程语言的一个布尔表达式,带有条件表达式的断点
    在每次执行时判断计算表达式的值,当表达式值为真时才挂起程序。
    这是使用“断言”的一中形式,在这种形式中你只有在断言为真时才挂起程序。如果
    在C语言中你要使断言为假时挂起程序则使用:“!表达式”。
    条件表达式对观察点也同样有效,但你并不需要它,因为观察点本身就计算一个表达式?nbsp;
    ?nbsp;
    但它也许会简单一些。比如只在一个变量名上设置观察点然后设置一个条件来测试新的赋
    值。
    断点条件可能有副作用(side effects)会影响程序的运行。这一点有时也是很有用的
    比如来激活一个显示程序完成情况的的函数,或使用你自己的打印函数来格式化特殊的
    数据结构。当在同一位置没有另一个断点设置时,结果是可预见的。(在gdb中如果在同一
    个地方使用了一个断点和一个条件断点则普通断点可能先被激活。)在条件断点的应用上
    有很多技巧。
    断点条件可以在设置断点的同时被设置。使用\"if\"命令作为\"break\"命令的参数。断点
    条件也可以在任何时候使用\"condition\"命令来设置。\"watch\"命令不能以\"if\"作为参数

    所以使用\"condition\"命令是在观察点上设置条件的唯一方法。

    `condition BNUM EXPRESSION\"
    把\"EXPRESSIN\"作为断点条件。断点用\"BNUM\"来指定。在你为BNUM号断点设置了条件
    后,只有在条件为真时程序才被暂停。当你使用\"condition\"命令GDB马上同步的检查
    \"EXPRESSION\"的值判断表达式中的符号在断点处是否有效,但GDB并不真正计算表达式
    的值。

    `condition BNUM\"
    删除在\"BNUM\"号断点处的条件。使之成为一个普通断点。
    一个条件断点的特殊例子是时一个程序在执行了某句语句若干次后停止。由于这
    个功能非常常用,你可以使用一个命令来直接设置它那就是\"ignore count\"。每个
    断点都有\"ignore count\",缺省是零。如果\"ignore count\"是正的那么你的程序在
    运行过断点处\"count\"次后被暂停。

    `ignore BNUM COUNT\"
    设置第BNUM号断点的\"ignore count\"为\"COUNT\"。
    如果要让断点在下次执行到时就暂停程序,那么把\"COUNT\"设为0.
    当你使用\"continue\"命令来继续你程序的执行时,你可以直接把\"ignore count\"
    作为\"continue\"的参数使用。你只要直接在\"continue\"命令后直接跟要\"ignore\"的
    次数就行。
    如果一个断点同时有一个ignore count和一个条件时,条件不被检查。只有当
    \"ignore count\"为零时GDB才开始检查条件的真假。
    另外你可以用\"condition\"命令来获得与用‘ignore count\"同样效果的断点。用法
    是用类似于\"$foo--<=0\"的参量作为\"condition\"命令的参数(使用一个不停减量的变量
    作为条件表达式的成员)。
    断点命令列表
    ==================
    你可以为任一个断点或观察点指定一系列命令,当你程序执行到断点时,GDB自动执行
    这些命令。例如:你可以打印一些表达式的值,或使能其他的断点。

    `commands [BNUM]\"
    `... COMMAND-LIST ...\"
    `end\"
    为断点号为BNUM的断点设置一个命令列表。这些命令在\"...COMMAND-LIST...\"中列
    出使用\"end\"命令来表示列表的结束。
    要删除断点上设置的命令序列,你只需在\"command\"命令后直接跟\"end\"命令就可以
    了。
    当不指定BNUM时,GDB缺省为最近遇到的断点或是观察点设置命令列表。
    使用回车来表示重复使用命令的特性在\"...command list...\"中不能使用。
    你可以使用命令列表中的命令来再次使你的程序进入运行状态。简单的在命令列表
    中使用\"continue\"命令,或\"step\"命令。
    在使程序恢复执行的命令后的命令都被忽略。这是因为一旦你的程序重新运行就可
    能遇到新的命令列表,那么就应该执行新的命令。防止了二义。
    如果你在命令列表中使用了\"silent\"命令,那么你程序在断点处停止的信息将不被
    显示。这对于用一个断点然后显示一些信息,接着再继续执行很有用。但\"silent\"命令
    只有在命令列表的开头有效。
    命令\"echo\",\"output\"和\"printf\"允许你精确的控制显示信息,这些命令在\"silent\"
    断点中很有用。
    例如:这个例子演示了使用断点命令列表来打印\"x\"的值.

    break foo if x>0
    commands
    silent
    printf \"x is %d\\n\",x
    cont
    end
    断点命令列表的一个应用是在遇到一个buf之后改正数据然后继续调试的过程。
    使用命令来修改含有错误值的变量,然后使用\"continue\"命令继续程序的运行。
    使用\"silent\"命令屏蔽输出:

    break 403
    commands
    silent
    set x = y + 4
    cont
    end
    断点菜单
    ==============
    一些编程语言(比如象C++)允许一个函数名被多次使用(重载),以方便应用的使用。
    当一个函数名被重载时,\"break FUNCITON\"命令向GDB提供的信息不够GDB了解你要设置
    断点的确切位置。如果你了解到这个问题,你可以使用\"break FUNCITONS(TYPES)\"命令
    来指定断点的确切位置。否则GDB会提供一个函数的选择的菜单供你选择。使用提示符
    \">\"来等待你的输入。开始的两个选择一般是\"[0] cancel\"和\"[1] all\"输入1则在所有
    同名函数上加入断点。输入0则退出选择。
    下例为企图在重载的函数符号\"String::after\"上设置断点。
    (gdb) b String::after
    [0] cancel
    [1] all
    [2] file:String.cc; line number:867
    [3] file:String.cc; line number:860
    [4] file:String.cc; line number:875
    [5] file:String.cc; line number:853
    [6] file:String.cc; line number:846
    [7] file:String.cc; line number:735
    > 2 4 6
    Breakpoint 1 at 0xb26c: file String.cc, line 867.
    Breakpoint 2 at 0xb344: file String.cc, line 875.
    Breakpoint 3 at 0xafcc: file String.cc, line 846.
    Multiple breakpoints were set.
    Use the \"delete\" command to delete unwanted
    breakpoints.
    (gdb)

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