gdb调试

本文详细介绍GDB调试器的使用方法,包括程序启动、数据显示与修改、断点设置、流程控制及多线程调试等核心功能。适用于初学者快速掌握GDB的基本操作。
 编译 

gcc -g test.c -o test

 

启动 

gdb test

 

 

  • 1:查看代码

(gdb) list 行号
查看指定行号附近的代码。
(gdb) search KeyWord
查找当前文件下一个KeyWord
(gdb) reverse-search KeyWord
查找当前文件上一个KeyWord

  • 2:执行程序

(gdb) run 可执行程序名
执行准备调试的程序
同时可以
使用(gdb) set args -x -y 来修改参数
使用(gdb) show args 获取参数

  • 3:数据显示/修改

(gdb) print p
可以显示当前变量p的值
同时可以
print Fun( 1, 2 ) 可以输出函数返回值
print *pMyPtr 可以输出复杂对象的值
print $1 可以输出历史记录变量的值
(gdb) whatis p
可以显示当前变量p的类型(对自定义结构无效)
(gdb) set variable 
对指定变量赋值
(gdb) ptype p
获取一个变量p的类型。(对自定义结构有效)
$pc 寄存器-程序计数器
$fp 寄存器-当前堆栈帧指针
$sp 寄存器-栈指针
$ps 寄存器-处理器状态

  • 4:断点

(gdb) break FileName.cpp:2202
可以让程序在FileName.cpp的2202行设置断点
(gdb) breal FileName.cpp:Myfun if pParam==100
可以让程序在FileName.cpp文件中的MyFun函数处设置断点,该断点触发条件为 pParam==100 为真时才有效。
通常断点后可以使用
(gdb) backtrace 命令查看调用堆栈表。
<上文中的break允许用一个字符b替代>
我们可以查看当前程序项目的所有断点列表,命令为
(gdb) info break
删除全部断点,可使用下面命令
(gdb) delete breakpoint
删除一个断点,可以使用下面命令
(gdb) delete breakpoint 1
则删除了编号为1的断点。
禁止使用断点 (gdb) disable breakpoint 1
允许使用断点 (gdb) enable breakpoint 1
删除指定行上的断点 (gdb) clean 2204
则删除了2204行上的断点。

  • 5:流程控制

(gdb) next
不进入函数内部的单步执行,可用一个字符n替代。
(gdb) step
进入函数内部的单步执行,可用一个字符s替代。
(gdb) finish
若进入了某函数,则直接执行至退出该函数体并显示其返回值。(void不显示)。
(gdb) call FunName( 167 )
直接调用执行一个函数FunName,括号内加参数
(gdb) continue
当进入断点后,希望继续执行下去,则使用continue

  • 6:多线程

(gdb) info threads
获取当前程序的所有线程列表
(gdb) thread ID
切换指定ID的线程为当前调试线程
(gdb) break FileName.cpp:1122 thread all
在所有线程的FileName.cpp文件中1122行设置断点
(gdb) thread apply ID1 ID2 ID3 command
在ID1,ID2,ID3等一个或多个线程中执行GDB的command命令
(gdb) thread apply all command
在所有线程中执行GDB的command命令
(gdb) set scheduler-locking off (或on或step)
当off时,意味着所有线程正常执行。这个是默认状态
当on时,意味着只有当前调试的线程正常执行,其他线程将中断。

当step时,意味着只有当前调试的线程正常执行,但当next过一个函数后,所有线程正常执行。 

  • 查看信息
info functions 查看函数信息

转载于:https://www.cnblogs.com/ahuo/archive/2012/06/30/2570997.html

要使用 GDB 调试程序,首先需要确保程序在编译时包含了调试信息。在使用 GCC 编译程序时,应添加 `-g` 选项,这样 GDB 才能读取源代码和变量信息,例如: ```bash gcc -g example.c -o example ``` 编译完成后,可以通过以下命令启动 GDB 并加载程序: ```bash gdb example ``` 如果程序已经编译完成,也可以先启动 GDB,然后再在 GDB 中加载程序: ```bash gdb (gdb) file example ``` 启动 GDB 后,可以使用 `run` 命令(简写为 `r`)来运行程序: ```gdb (gdb) run ``` 如果希望在启动程序时传递参数,可以在启动 GDB 时使用 `-args` 参数,或者在 GDB 中使用 `set args` 命令设置参数: ```bash gdb -args ./example arg1 arg2 ``` 或者在 GDB 中执行: ```gdb (gdb) set args arg1 arg2 ``` 如果需要调试一个正在运行的进程,可以使用 `attach` 命令,后面跟上进程的 PID: ```gdb (gdb) attach <pid> ``` 为了更有效地调试,可以使用断点来暂停程序的执行。使用 `break` 命令(简写为 `b`)来设置断点: ```gdb (gdb) break main ``` 这将在 `main` 函数处设置一个断点。当程序运行到断点时会暂停,此时可以检查变量的值、单步执行等。 单步执行可以使用 `step` 命令(简写为 `s`),它会进入函数内部执行: ```gdb (gdb) step ``` 如果不想进入函数内部,而是直接执行整个函数,可以使用 `next` 命令(简写为 `n`): ```gdb (gdb) next ``` 查看变量的值可以使用 `print` 命令(简写为 `p`): ```gdb (gdb) print variable_name ``` 查看当前执行的源代码可以使用 `list` 命令(简写为 `l`): ```gdb (gdb) list ``` 如果需要退出 GDB,可以使用 `quit` 命令(简写为 `q`): ```gdb (gdb) quit ``` 以上是使用 GDB 调试程序的基本步骤和常用命令[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值