gbd调试总结

gdb调试

http://blog.csdn.net/lwbeyond/article/details/7839225

常用基本命令

file 载入待调试文件
run
next
step
breakpoint
print

大纲

输入控制

运行控制

中断控制 (两种点)

查看代码

查看变量信息 (一种点)

调用函数

查看调用堆栈

输入控制

有时候会遇到段错误
需要调试
但是调试过程中要输入很多数据怎么办?
可以使用重定向!
在开始运行程序的时候(s或r)
重定向输入输出均可

(gdb)r < test.in

运行控制

——start(s)

运行直到main函数

——run(r)

运行

——continue(c)

运行直到下一个断电

——finish(f)

用来跳出函数
函数运行玩后自动停止

——next(n)

下一条语句

——step(s)

单步调试
进入函数

——until

跳出循环
循环结束后自动停止

中断控制

断点是程序执行到某行代码是触发,观察点是程序访问某个内存单元时触发

——breakpoint(b)断点

b n
b 函数名
b n(函数名)if 条件

——watch 观察点

watch 变量名
当程序访问变量名指定的内存单元时,停止程序

查看代码

//输出从上次调用list命令开始往后的10行程序代码  
(gdb) list 

//列出 line1 到 line2 行之间的源代码  
(gdb) list line1, line2  

//输出第 n 行附近的10行程序代码  
(gdb) list n  

//输出函数function前后的10行程序代码  
(gdb) list function 

查看变量信息

——print(p) 打印

需要的时候就看一看变量的值

——display(disp)自动显示

一旦程序停止(遇到断电,或者单步进行)
都看一看变量的值

——watch 观察点

一旦访问这个变量,就看变量的值(
同时兼顾断点作用)

——whatis 查看变量类型

——特别:查看数组的值

查看一段连续的内存空间的值。
比如数组的一段,或是动态分配的数据的大小。
你可以使用GDB的“@”操作符,
“@”的左边是第一个内存的地址的值,
“@”的右边则你你想查看内存的长度。
例如,你的程序中有这样的语句:
int *array = (int *) malloc (len * sizeof (int));
于是,在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值:
p *array@len

查看程序信息info

——info args 当前参数

打印出当前函数的参数名及其值。

——info locals 局部变量

打印出当前函数中所有局部变量及其值。

——info break 断点

查看断点信息。

——info watchpoints 观察点

列出当前所设置了的所有观察点。

——info display 自动显示点

——info stack 查看栈中信息

——info frame 更详细的栈层地址信息

调用函数

——call

直接call function(arg…)
就能够查看结果

查看栈信息

——backtrace(bt) 查看调用栈

查看函数调用栈

查看其调用函数的信息

——frame 查看栈详细信息

可在后面加入数字n
n为栈的层次,然后可以用其他命令(info)查看此级别的变量信息

三种点的管理

——观察点与断点 的管理

断点和观察点在info break中都能看到,编号同时管理
disable num
enable num
delete num
(num是点的编号)
disable和enalbe不删除自动显示的设置,而只是让其失效和恢复

clear list_insert //删除函数的所有断点
clear list.c:list_delet //删除文件:函数的所有断点
clear 12 //删除行号的所有断点
clear list.c:12 //删除文件:行号的所有断点

——自动显示点

自动显示点在info display 中能看到
disable diaplay <点编号> // 关闭
enable diaplay <点编号> // 打开
delete diaplay <点编号> // 删除

特有操作
undisplay <编号> // 删除自动显示点
// 效果等同于delete

你可能感兴趣的:(gbd调试总结)