前言
GDB(GNU Debugger)是UNIX及UNIX-like下的强大调试工具,可以调试ada, c, c++, asm, minimal, d, fortran, objective-c, go, java,pascal等语言。
gdb使用指令
下面笔者以c程序为例,讲解各个重要指令的用法
以在此c代码为例:
#include <stdio.h>
2
3 int TopAdd(int rum)
4 {
5 int res = 0;
6 int i = 0;
7 for( i = 0; i <= rum; i++)
8 {
9 res += i;
10 }
11 return res;
12 }
13 int main()
14 {
15 int num = 100;
16 int result = TopAdd(num);
17 printf("result = %d\n", result);
18
19 return 0;
20 }
对于c程序来说,需要在编译的时候加上-g,保留调式信息,否则不能使用GDB进行调试。
gcc -o mytest mytest.c -g
此时,我们在Makefile文件下写入依赖方法(如果这个不理解后面会专门写一篇Linux自动化构建工具make/Makefile)
此时,c程序编译时加上了-g,就可以使用GDB来进行调试了。
但如果不是自己编译的程序,此时我们想要知道该c程序是否带有-g参数,此时我们该怎么办?
如何判断一个文件是否带有调试信息呢?
例如:
用: gdb 文件名
gdb helloworld
Reading symbols from hellowWorld...(no debugging symbols found)...done.
这就是没有调试信息的提示:no debugging symbols found
如果是下面的提示:
Reading symbols from hellowWorld...done.
则可以进行调式。
readelf查看段信息
mytest是一个可执行文件,如果没有任何debug信息,则不能被调试。
解决完能否使用GDB调试的问题,现在,我们来谈论在Linux下如何使用GDB
GDB使用
背景:
1.程序的发布方式有两种,debug模式和release模式
2.Linux gcc/g++出来的二进制程序,默认是release模式
3.要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项
指令(列举现阶段常用的):
0.gdb 文件名: 进入gdb调试
1.list / l 行号 : 显示binFile源代码,接着上次的位置往下列,每次列10行。
由此代码可看,l(list的缩写),可以展示binFile源代码。
或者使用:(l + 行号的用法)
注意:gdb会记录最近一条命令,如果命令无变化,可以直接回车
2.quit:退出gdb
3.run / r : 开始调试,如果没有设置断点,就直接运行结果。
4.break / b 行号 :在某一行设置断点
5.info break(b) : 查看断点信息(断点的编号)
6.delete / d : 删除断点,用法很多
d breakpoints | 删除所有断点 |
d breakpoints n | 删除序号为n的断点 |
d breakpoints | 禁用断点 |
enable breakpoints | 启用断点 |
7.next / n :逐过程编译
注意,不能直接使用n来逐过程编译,要先用r来将程序跑起来
8.printf / p 变量名 : 打印变量内容
9. cintinue / c : 从当前位置开始连续而非单步执行程序
运行到下一个断点处停下来
10. s : 逐语句
11. bt : 查看当前调用的堆栈
12. finish : 执行到当前函数返回,然后停下来等待命令(将当前函数跑完,就停下来)
分析一下该过程:
1.先给binFile源代码打一下断点,此时有了一个断点。
2.r命令,使得程序跑起来,跑到断点的地方停止。
3.使用n到下一个过程,s进入TopAdd函数
4.用finish命令,此时程序将当前函数跑完,此时光标停留在第16段
5.函数返回值为5050传给result
这群代码和解释充分展示了finish命令的用法以及实现效果
13. display 变量名: 设置长显示 (跟踪查看一个变量,每次停下来都显示它的值)
14. undispaly : 取消长显示(设置的那些变量的跟踪)
总结
可以与windows IDE对应例子
以上就是GDB的命令以及命令的如何使用。