gdb调试常见命令详细总结
创始人
2024-01-28 14:51:25
0

gdb调试常见命令

    • 运行(run/continue/next/step/until/finish/call/quit)
    • 断点
          • 显示当前程序的断点设置情况
          • 设置断点(在某个函数入口或指定行号处)
          • 暂停设置的断点(可再次开启)
          • 清除断点(delete/clear)
    • 函数堆栈中进行调试
          • 对于当前状态(可以是发生崩溃后)返回上/下一层调用函数
          • 查看当前调用函数堆栈列表
          • 跳转到堆栈中的某个函数
    • 打印信息
          • set命令传参或修改参数值进行调试
          • 查看某个变量或者表达式的值
          • 查看某个内存地址中的值
          • 查看当前文件的程序语言
    • 分割窗口
          • 分割窗口,一边查看代码一边测试

参考链接
layout很有用

运行(run/continue/next/step/until/finish/call/quit)

run(简写r): 运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入;
continue(简写c):继续执行,到下一个断点处(无断点即执行到结束或崩溃)
next(简写n): 单步跟踪程序,当遇到函数调用时,直接调用,不进入函数
step(简写s):单步调试如果有函数调用,则进入函数,与命令n区分;
until:运行程序直到退出循环体; / until+行号: 运行至某行(退出循环
finish: 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。(退出函数
call 函数(参数):调用函数并传递参数,如:call gdb_test(55)
quit:简记为 q ,退出gdb

断点

显示当前程序的断点设置情况
info breakpoints
设置断点(在某个函数入口或指定行号处)
break +函数名/行号
暂停设置的断点(可再次开启)
disable [breakpoints] [num…]
#breakpoints 参数可有可无;num…表示可以有多个参数
#如果指定 num…,disable 命令会禁用指定编号的断点;反之若不设定 num…,则 disable 会禁用当前程序中所有的断点。
enable +num 
#可再次开启某号断点。

eg:

(gdb)dis 1 #表示禁用断点1
清除断点(delete/clear)
delete 断点号n:删除第n个断点
clear 行号n:清除第n行的断点

函数堆栈中进行调试

对于当前状态(可以是发生崩溃后)返回上/下一层调用函数
up 
#返回到达当前步骤的上一步
down
#进入下一个堆栈中的函数
查看当前调用函数堆栈列表
(gdb) backtrace [-full] [n]
(gdb)bt
跳转到堆栈中的某个函数

该命令会依次打印出当前栈帧的如下信息:
1、当前栈帧的编号,以及栈帧的地址;
2、当前栈帧对应函数的存储地址,以及该函数被调用时的代码存储的地址
3、当前函数的调用者,对应的栈帧的地址;
4、编写此栈帧所用的编程语言;
5、函数参数的存储地址以及值;
6、函数中局部变量的存储地址;
7、栈帧中存储的寄存器变量。

frame

eg :

f 2
#跳转到堆栈中 编号为2的函数中

打印信息

ctrl + x + a 快捷键可以浏览当前所在代码上下几行。

set命令传参或修改参数值进行调试

set args作为程序运行时参数

#include 
int main(int argc,char**argv){printf("argv[0] is %s\n",argv[0]);printf("argv[1] is %s\n",argv[1]);printf("argv[2] is %s\n",argv[2]);
}
#调试运行结果
(gdb) set args hello world
(gdb) r
Starting program: /home/huqw/test/a.out hello world
argv[0] is /home/huqw/test/a.out
argv[1] is hello
argv[2] is world

set还可以将变量的值进行修改,可以查看自己期待得到的结果

#include
int main(){int a = 5;printf("a is %d\n",a);printf("a is %d\n",a);return 0;
}
Breakpoint 1, main () at set_param.c:4
4		printf("a is %d\n",a);
(gdb) n
a is 5
5		printf("a is %d\n",a);
(gdb) print a
$1 = 5
(gdb) set var a=3
(gdb) print a
$2 = 3
(gdb) n
a is 3
查看某个变量或者表达式的值

print 表达式:简记为 p ,其中“表达式”可以是任何当前正在被测试程序的有效表达式,比如当前正在调试C语言的程序,那么“表达式”可以是任何C语言的有效表达式,包括数字,变量甚至是函数调用。
display 表达式:在单步运行时将非常有用,使用display命令设置一个表达式后,它将在每次单步进行指令后,紧接着输出被设置的表达式及值。如: display a
watch 表达式:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。如: watch a

查看某个内存地址中的值
x :查看内存地址中的值
x/[number][format] 
其中number,format和u都是可选参数,addr为查看变量的内存地址

eg :

(gdb) print input
(gdb) x/20 0x400c90
#表示查看0x400c90到向后0x400c90+20的内容
查看当前文件的程序语言
info source
#会显示当前文件名,编译路径

分割窗口

分割窗口,一边查看代码一边测试
layout

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...