您的位置:首页 > 运维架构 > Linux

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

2012-03-19 18:39 716 查看
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 文件名:行号

准备一下匹配函数的写法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: