文章目录
- 前言
- 一、GDB概念
- 二、GDB具体使用方法
- 三、GDB断点类型
- 总结
前言
本篇文章我们来介绍一下Linux中的调试利器GDB工具,在Linux的调试中GDB可以帮助我们来解决非常多的问题。
一、GDB概念
GDB是一个功能强大的调试工具,可以用于分析程序崩溃,跟踪程序执行过程,查看内存和寄存器状态等。以下是使用 GDB 进行基本调试的步骤和命令:
1.编译程序并使用 -g 参数开启调试信息
在使用 GDB 进行调试前,需要在编译程序时添加 -g 参数开启调试信息。
gcc -g -o program program.c
2.启动GDB
在 shell 中输入 gdb 命令来启动 GDB 调试器,并将编译的程序作为参数传递给 GDB。
gdb program
3.设置断点
使用 break 命令设置断点,可以暂停程序的执行并进入调试模式。
(gdb) break main
4.运行程序
使用 run 命令运行程序,并执行到设定的断点处。程序停止运行并在 GDB 控制台显示为 (gdb)。
(gdb) run
5.打印变量值
使用 print 命令可以查看变量的值。
(gdb) print variable_name
6.单步执行
使用 step 命令执行程序的当前行,并进入函数的内部。
(gdb) step
7.继续执行
使用 continue 命令继续执行程序,直到程序结束或下一个断点位置。
(gdb) continue
8.进入汇编模式
使用 disassemble 命令可以在 GDB 控制台显示当前代码的汇编指令。
(gdb) disassemble
9.退出 GDB
使用 quit 命令可以退出 GDB 调试器。
(gdb) quit
以上是 GDB 的一些基本命令和使用方法,如果需要更多命令,请查阅 GDB 的官方文档或者使用 help 命令查看 GDB 命令列表。
二、GDB具体使用方法
首先编写一个测试代码:
#include <stdio.h>
int *g_pointer;
void func(void)
{
*g_pointer = (int)"Hello World";
}
int main(void)
{
func();
return 0;
}
编译时加上-g选项:
运行程序:
运行后直接崩溃了,这个时候我们就可以来使用GDB来调试我们的代码了。
启动GDB调试后直接就可以找到问题出现的地方了:
GDB也可以传递参数:
#include <stdio.h>
int main(int argc, char** argv)
{
printf("argv : %s\n", argv[0]);
printf("argv : %s\n", argv[1]);
printf("argv : %s\n", argv[2]);
return 0;
}
执行GDB命令传递参数:
这样传递参数的方式相当于:
在执行GDB来让程序运行的时候也可以使用ctrl加c来打断程序的执行。使用continue来让程序继续运行:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv)
{
int i = 0;
for(i = 0; i < 10; i++)
{
printf("i = %d\n", i);
sleep(1);
}
return 0;
}
三、GDB断点类型
软件断点:
软件断点也称为“内存断点”,这类断点是通过修改对应指令的内存地址进行实现的。换句话说,这些断点不会占用处理器的硬件资源。因此,在同一时间点上,GDB 可以设置许多软件断点,而不用担心硬件反应带来的性能开销。
当程序执行到设定断点的地址时,会首先检查这个地址是否被设置了断点,如若设置了,CPU会停下来执行相应的调试操作。由于软件断点是通过对指令地址进行修改实现的,因此断点会覆盖指令地址,并且在断点被移除之后,程序可以恢复执行。
硬件断点:
硬件断点是由调试器设置的硬件的断点条件。它利用处理器的硬件调试功能,避免了软件断点导致增加程序的执行开销。硬件断点是设置在程序指令地址上的,使用了特殊的断点寄存器来识别局部读写操作。
数据断点:
数据断点也称为“监视点”,是一种特殊的硬件断点,用于监视内存中特定的变量或内存地址。当被监视的变量或内存地址被读或写时,GDB 便会停下程序以进行调试。
设置软件断点:
在 GDB 中,可以通过 break 命令来设置软件断点。具体语法为:
break [location]
其中,location 可以是代码行号、函数名、函数地址等。例如:
(gdb) break main.c:10 # 在 main.c 文件的第 10 行设置断点
(gdb) break function # 在 function 函数入口处设置断点
(gdb) break *address # 在地址为 address 处设置断点
如果省略 location,则会在当前行设置断点:
(gdb) break # 在当前行设置断点
设置断点后,可以使用 run 命令运行程序。当程序执行到断点处时,程序会停止执行,并进入 GDB 调试界面。
使用next可以执行下一条语句
使用info breakpoints命令可以查看到当前的断点信息:
使用delete可以删除断点:
删除完成断点后代码就会向下执行了。
通过print命令可以查看到变量的信息:
当然了也可以进行变量的设置:
总结
本篇文章我们就讲解到这里,熟练使用GDB工具将给我们带来极大的便利。