linux程序设计笔记10:gdb调试

 

1.在程序中遇到错误时,要重新阅读源代码或与其他人进行探讨,这个办法虽然因为简单而容易被人忽视,但它却非常有效。
2.建议大家启用-Wall 选项,他在追踪程序的错误时,它可以产生非常有用的信息。
3.__LINE__  __FILE__  __DATE__  __TIME__ 4个对调试很有帮助的宏定义。
4.gcc -g 可以添加调试信息,但是文件会很大哦。

二.gdb调试:
gdb obj.exe
help 帮助
run 运行
backtrace 栈跟踪 bt  帮组我们找到程序到达错误地点的路径。 为了与其他调试程序兼容:gdb还有一个where命令与bt功能一致。
quit 退出gdb
printf 打印出变量值
gdb会用伪变量来保存类似这样的输出值以备后用:最后一次操作的结果总是为$,倒数第二次操作的结果为$$.
 例如:print a[$-1].key
list 列出程序源代码, list n 指定列出代码的行的上下文。
break 21 设置断点。
cont 继续执行。
display arrar[0]@5
commands 命令:在达到断点时执行某个命令,而不是程序停下来。

三。使用gdb:给程序打补丁;
在不修改源代码的情况下,修改程序,并重新编译。
info display 查看曾经设置过的断点及display命令的内容。
info break 查看曾经设置过的断点
disable break 1
disable display 1 禁用这些设置,也可以全部删除。
commands 2  ?
set variable n=n+1
cont
end
run
 
以上是给程序打补丁,但是俺看不懂!!


1.注意:gdb所有的版本都支持“空命令”,即直接按下回车键再次执行最近执行过的那条命令。在使用step or next命令单步执行程序时,这个空命令就非常有用罗。


linux 和 unix 系统通常会产生一个核心转储(core dump ),并将它保存在core文件中,该文件是对程序的内存映像文件,包含程序在运行失败的那个时刻的全局变量的取值。  我们通过它查看错误信息哦。


二。断言。
他的作用是测试某个假设是否成立,如果不成立就停止程序的运行。
#include <assert.h>
void assert(int expression)
头文件 assert.h 受宏NDEBUG的影响,可以通过#define NDEBUG 来关闭断言功能 必须包含在#include <assert.h>之前哦。 或者在编译的时候 加上 -DNDEBUG 选项啦编译。
例子:
#include <stdio.h> #include <assert.h>  #include <stdlib.h> #include <math.h>
double my_sqrt(double x){
 assert(x>=0.0);
 return sqrt(x);
}
int main(){
 printf("%g",my_sqrt(-2.0)); 
 exit(0);
}

 

GDB  调试
  1.gcc  -g  XXX.c
  2. gdb   执行文件名
  3. list    查看源代码
  4. break  函数名设置断点
  5. next   程序执行一行代码
  6. print  变量
  
  7.程序 执行到函数 进入 函数调试
   断点打到函数的行
   break 2
   这样  next 的含义 和step 相同
   next  程序执行一行
   step  程序执行一步
  8. 可以直接调用函数  
    call  函数名(参数值)
   
  9.程序中动态改变变量的值 
   set var 变量名=值
 
  10多文件调试
    1.可以先把断点打到 main文件上
     然后用step  跟进调试文件
    2.直接在调试文件上打断点
     break   文件名:行号    

  准备一下匹配函数的写法    

你可能感兴趣的:(linux程序设计笔记10:gdb调试)