赞
踩
注意,如果要在linux操作系统底下,进行调程序需要把文件调成debug版中。debug中有一些调试信息,而release是发布版本,在这个版本中运行更快,并且最终debug版本比release版本大,因为debug里面有调试信息。Linux操作系统底下默认在编译的时候生成的是release版本,如果在Linux想要生成一个debug版本需要增加“-g”命令行参数。
命令:gcc test.c -o bb -g
调试的起手式
调试可执行程序
命令: gdb可执行程序名称
查看源代码: l(list)
打断点: b(breakpoint) 行号(源码文件中的行号)
去除断点: delete 断点的序号
查看断点信息: i b (info breakpoint)
注意:因为之前先打了一个断点,之后又把那个断点删除了,所以断点序号是从2开始的,在linux中断点序号即使被删除,也会算是一个编号。
使断点失效: disable 断点的序号
使断点生效: enable 断点的序号
使程序跑起来: run
如何逐语句执行,对标到window当中是F11,执行的命令是:s(step),逐过程执行,window中是F10,执行的命令是:n(next)。逐语句执行进函数,逐过程执行不进函数。
继续执行: c(countinue)直到遇到下一个断点的时候停止。
注意: 当开始执行gdb命令的时候,可以直接回车,执行上一次的命令。
打印变量的值: p(print)
p 变量名称
p 对象
p 指针
退出: q(quit)
调试coredump文件
前提: 本质上是调试程序崩溃之后的内存镜像文件。
Segmentation fault:段错误,内存访问越界,或者访问空指针导致的。
产生cordump文件的条件:
linux操作系统当中需要设置core size的大小。
命令:unlimit -c
磁盘大小并不是无限制,磁盘大小大于镜像文件大小。
例如:core 31351就是内存镜像文件保存的是程序崩溃那一瞬间内存当中的值。
报错:program terminated with signal 11, Segmentation fault.
程序收到了11号信号,产生了段错误,*lp = a ,提示程序员崩溃的代码是哪一行。错误原因,解引用崩溃,有可能解引用了空指针,也有可能引用了野指针。
例如:
char * lp (char *)malloc(1024)
strcpy(lp,"aaa");
free(lp)
*lp = 'a'
bt查看函数的调用堆栈,查看的时候需要从下往上看
f 堆栈序号 跳转到某一个具体的堆栈
tips:
11号信号:1.解引用空指针 2.解引用野指针 3. 越界访问内存
6号信号: double free 重复释放
分布式管理
svn
集中式管理
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。