GDB笔记(二):条件断点、命令列表、监视点条件断点break if用法: break main if argc > 1 break 180 if (string == NULL && i < 0) break test.c:34 if (x & y) == 1 break myfunc if i % (j + 3) != 0 break 44 if strlen(mystring) == 0
condition与break if类似,只是condition只能用在已存在的断点上。 条件表达式的返回值上面的条件表达式计算后结果的类型是什么?答案是int型。 (gdb) print cos(0.0) $1 = -1073776640 解决这个问题的方法是类型转换,我们来看这个例子 (gdb) set $p = (double (*) (double)) cos (gdb) print cos(0.0) $2 = -1073776640 (gdb) print $p(0.0) $3 = 1 在这里,通过设置变量$p为“一个参数为double,返回类型为double的指向cos函数入口地址的函数指针”,来对参数进行强制类型转换。 为断点设置命令列表我们知道,设置一个断点并且在上面中断后,我们必然会查询一些变量或者做一些其他动作。 步骤如下:
用法: (gdb) commands 1 Type commands for when breakpoint 1 is hit, one per line. End with a line saying just "end". >silent >printf "n = %d \n", n >continue >end 定义宏(define)宏可以在调试期间录制,也可以事先录制在.gdbinit文件中。 define print_and_go print $arg0 continue end 然后在断点1处定义如下命令: commands 1 silent print_and_go end 监视点(watch)用法: 注意监视点的设定不依赖于断点的位置,但是与变量的作用域有关,也就是说,要设置监视点必须在程序运行时才可设置。 在不确定发生问题的地方时,通过使用监视点的条件表达式,可以非常方便地找出问题代码: watch i > 999 一旦i > 999,程序就会被中断,GDB指出改变条件的代码。 next, continue, step区别: next表示跳往当前代码栈中的下一条指令,如果下一条指令是函数调用,并且函数中存在断点,则直接跑到该断点中止。 continue 表示跳往下一个断点, next和continue的区别是: 在当前代码堆栈中,step和next都会一条条的执行,而continue直接跑到下一个断点去执行去了。 如果当前代码中调用的是函数栈,则next和continue没有任何区别【直接跑到断点处中止】。 step 和next 在当前代码栈中相似,都是一条条语句执行,不同的是在函数栈调用时,next进入的方式直接跑到断点处中止(所以叫做"下一个"),step是从函数栈的起始位置中止(所以叫做“单步”)。 4. 执行run指令,则遇到断点,就会停止,通过watch + 变量名 查看结果, next执行到下一个断点, continue下一个断点,kill结束 5. 为加快调试速度,以上命令都可以简写为第一个字母。在 gdb 提示符下按回车健将重复上一个命令。 |
|