GDB(实验楼转)
如果要调试程序,首先需要在gcc编译可执行程序时加上
-g
参数
gcc bugging.c -o bugging -g -m32
其中-m32
表示编译为32位,默认编译根据操作系统决定。如果所在环境编译报错,请安装libc6-dev-i386
后再次编译:
sudo apt-get install llibc6-dev-i386
然后输入gdb bugging
进入gdb
即可调试bugging
程序。
GDB调试命令行界面使用技巧
部分 gdb 常用命令一览表:
命令 | 简写形式 | 说明 |
---|---|---|
list | l | 查看源码 |
backtrace | bt、where | 打印函数栈信息 |
next | n | 执行下一行 |
step | s | 一次执行一行,遇到函数会进入 |
finish | 运行到函数结束 | |
continue | c | 继续运行 |
break | b | 设置断点 |
info breakpoints | 显示断点信息 | |
delete | d | 删除断点 |
p | 打印表达式的值 | |
run | r | 启动程序 |
until | u | 执行到指定行 |
info | i | 显示信息 |
help | h | 帮助信息 |
当然,可以使用help command
查看命令的用法
在gbd命令行界面可以执行外部的shell
命令:
!shell命令 !pwd
查看源码(list)
list 行号
,显示某一行附近的代码list 文件名:行号
:显示某一个文件某一行附近的代码,用于多个源文件的情况list函数名
:显示某个函数附近的代码list 文件名:函数名
:显示某一个文件某个函数附近的代码,用于斗个源文件的情况。
断点(break)
设置断点
break 行号
,断点设置在该行开始处,注意:该行代码未被执行break 文件名:行号
,适用于有多个源文件的情况。break 函数名
,断点设置在该函数的开始处,断点所在行未被执行break 文件名:函数名
,函数名,适用于有多个源文件的情况。
查看断点信息:
info breakpoints
命令用于显示当前断点信息。
其中每一项的信息如下表所示:
Num | Type | Disp | Enb | Address | What |
---|---|---|---|---|---|
1 | breakpoint | keep | y | 0x0804844c | in main at bugging.c:19 |
该编号可以多为delete/enable/disable/ 等控制断点命令的参数 |
代表断点类型,一般为breakpoint | 代表断点被命中后,该断点保留(keep)、删除(del)还是关闭(dis) | 代表断点是开(y)还是关(n) | 代表改短点出虚拟内存的地址 | 代表该断点在源文件中的信息 |
删除断点
delete
命令用于删除断点。
delete Num
,删除指定断点,断点编号可通过info breakpoints
获得delete
不带参数,默认删除所有断点。
关闭和启用断点
disable
命令和enable
命令分别用于关闭和启用断点:
disable Num
,关闭指定断点,断点编号可通过info breakpoints
获得disable
,不带任何参数,默认关闭所有断点。enable Num
,启用指定断点,断电编号可通过info breakpoint
获得enable
,不带任何参数,默认启用所有断点
断点启用的更多方式
enable
命令还可以用来设置断点被执行的次数,比如当断点设在循环中的时候,某断点可能被多次命中。
enable once Num
,断点hit一次之后关闭该断点enable delete Num
,断点hit一次之后删除该断点
这两个命令影响的是 info breakpoints 的 Disp 列,表示该断点被命中之后的行为。
断点调试的一些命令
- 打印变量
调试的过程中需要观察变量或者表达式的值,所以先介绍两个基本的显示变量值的命令:
info locals
打印当前断点处所在函数的所有局部变量的值,不包括函数参数。
print 变量或表达式
打印表达式的值,可显示当前函数的变量的值、全局变量的值等
print/FMT
可以控制打印的格式,常见的有x(十六进制)、t(二进制)、c(显示为字符)等。
- 启动程序
run 命令用于启动待调试程序,并运行到断点处停下。
run
不带任何参数,启动待调试程序,不传递参数。
run 参数
有些程序需要跟参数,直接带上参数列表即可,会传递给 main 函数的 argc、argv 变量。
- 单步命令
next, step, finish, continue, until 用于控制整个调试过程中,程序执行的流程。
next
next 单步执行,函数调用当做一条指令,不会进入被调用函数内部
next N,表示单步执行N次
step
step 单步执行,会进入到函数调用内部
step N,表示单步执行N次
finish
执行程序到当前函数结束
continue
执行程序到下个断点
until
until N,执行程序到源代码的某一行
函数与函数栈
info proc mappings
可以查看待调试进程的内存分布情况backtrace
查看函数调用栈的情况
backtrace、where、info stack
这三个命令都可以查看函数的调用情况
backtrace full、where full、info stack full
这三个命令查看函数调用情况的同时,打印所有局部变量的值
- 栈帧
#1 是 main 函数用到的栈空间,这一部分可以称之为 main 函数的 stack frame
#0 是 foo 函数用到的栈空间,同样可称之为 foo 函数的 stack frame,0 代表当前执行停在 foo 函数内
可以得到函数调用关系为,main 调用 foo
info frame Num
查看某个函数栈帧的详细信息
本文来自博客园,作者:StimuMing,转载请注明原文链接:https://www.cnblogs.com/fole-del/articles/16013874.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2021-03-16 线程demo_C++
2021-03-16 自动化部署项目hook
2021-03-16 关于QByteArray的toPercentEncoding()函数
2021-03-16 所见即所得_Typora及用法
2021-03-16 Hello,博客园