gdb调试器
2015-10-04 19:11
281 查看
GDB调试器
gdb调试器是一款GNU开发组织并发布的UNIX/Linux下的程序调试工具。下面以一个简单程序为例,介绍gdb使用流程:
编辑文件test.c
#include "stdio.h"
int sum(int m);int main()
{
int i,n = 0;
sum(50);
for(i = 1 ; i <= 50 ;i++)
{
n += i;
}
printf("The sum of 1-50 is %d \n",n);
}
int sum(int m)
{
int i,n =0;
for (i = 1; i <= m; i++)
{
n += i;
printf("The sum of 1-m is %d\n",n);
}
}
对test.c进行编译
hh@hh-virtual-machine:~$ gcc -g test.c -o test
注意:一定要加上 -g 选项,这样编译出的可执行代码中才包含调试信息,否则之后gdb无法载入该可执行文件。
启动调试
hh@hh-virtual-machine:~$ gdb test
注意:gdb进行调试的是可执行文件,而不是“.c”的源代码,因此,需要先通过gcc编译生成可执行文件才能用gdb进行调试。
“l” 查看载入的文件
(gdb) l 1 #include <stdio.h> 2 int sum(int m); 3 int main() 4 { 5 int i,n = 0; 6 sum(50); 7 for(i = 1 ; i <= 50 ;i++) 8 { 9 n += i; 10 } (gdb) l 11 printf("The sum of 1-50 is %d \n",n); 12 } 13 int sum(int m) 14 { 15 int i,n =0; 16 for (i = 1; i <= m; i++) 17 { 18 n += i; 19 printf("The sum of 1-m is %d\n",n); 20 }
“b”设置断点
(gdb) b 6 Breakpoint 1 at 0x804842e: file test.c, line 6.
注意:gdb中利用行号设置断点是指代码运行到对应行之前停止,如上例,代码运行到第6行之前停止(并没有运行第6行)
“info b”查看断点情况
(gdb) info b Num Type Disp Enb Address What 1 breakpoint keep y 0x0804842e in main at test.c:6
运行代码
(gdb) r Starting program: /home/hh/test Breakpoint 1, main () at test.c:6 6 sum(50);
可以看到,程序运行到断点处就停止了。
查看变量值“p”+变量名
(gdb) p n $1 = 0 (gdb) p i $2 = 134513851
“n”(next)单步运行
(gdb) n The sum of 1-m is 1275 7 for(i = 1 ; i <= 50 ;i++)
“s”(step)单步运行
(gdb) s 9 n += i;
注意:它们之间的区别在于,若有函数调用的时候,“s”会进入该函数而“n”不会进入该函数。
10 . "c"恢复程序运行
(gdb) c Continuing. The sum of 1-50 is 1275 [Inferior 1 (process 6666) exited with code 031]
GDB最基本的命令有
gdb programm 启动GDB list(或l) 列出源代码,接着上次的位置往下列,每次列10行 list 行号 列出从第几行开始的源代码 list 函数名 列出某个函数的源代码 b(break) 设断点(要会设4种断点:行断点、函数断点、条件断点、临时断点) delete 删除指定断点 run 开始运行程序 bt 打印函数调用堆栈 info break 查看断点详细信息 p 查看变量值 c 从当前断点继续运行到下一个断点 backtrace(或bt) 查看当前栈的情况,即可以查看到哪些被调用的函数尚未返回 next(或n) 单步恢复程序运行,但不进入函数调用 step(或s) 执行下一行语句,如果有函数调用则进入到函数中 quit 退出GDB]
其他几个我认为应该掌握的调试命令有:
display 跟踪变量值的改变 until 跳出循环 finish 跳出函数 help 帮助
gdb使用时的注意点
在gcc编译选项中一定要加入“-g”
只有在代码处于“运行”或“暂停”状态时才能查看变量值
设置断点后程序在指定行之前停止
相关文章推荐
- C++学习(二)-虚基类(2)
- 最漫长的国庆!!!
- 如何查看mac系统是32位还是64位的操作系统
- Spark中RDD的设计思想
- 网络编程-GET-同步和异步(delegate和block)
- hdu5119 Happy Matt Friends( DP )
- 在Ubuntu上配置域名
- python mysql模块
- 软件工程之软件测试
- Java基础知识点总结(一)
- 插头dp模板(简单路径+一条回路+广义路径)
- HDU2608-0 or 1(数论+找规律)
- Flex SDK bin命令解析–mxmlc参数列表
- Flex SDK bin命令解析–mxmlc参数列表
- 国庆随笔
- Jquery给easyui的表单元素赋值,获取值
- Linux 学习笔记 常用命令
- hadoop学习笔记之分布式计算框架
- [PAT]1097. Deduplication on a Linked List (25)
- 50 Pow(x, n)