gdb调试常见命令详细总结

简介: gdb调试常见命令详细总结

运行(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 +函数名/行号
• 1

暂停设置的断点(可再次开启)

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 <stdio.h>
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<stdio.h>
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] <addr>
其中number,format和u都是可选参数,addr为查看变量的内存地址

eg :

(gdb) print input
(gdb) x/20 0x400c90
#表示查看0x400c90到向后0x400c90+20的内容

查看当前文件的程序语言

info source
#会显示当前文件名,编译路径


分割窗口


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

layout
相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
3月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
64 10
|
3月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
102 3
|
3月前
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
105 0
|
5月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
43 1
|
5月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
31 0
|
5月前
|
NoSQL Linux C++
Linux C/C++ gdb调试正在运行的程序
Linux C/C++ gdb调试正在运行的程序
|
5月前
|
NoSQL Linux C++
Linux C/C++ gdb调试core文件
Linux C/C++ gdb调试core文件
|
5月前
|
NoSQL Linux C++
Linux C/C++ gdb调试
Linux C/C++ gdb调试
|
6月前
|
NoSQL Ubuntu 测试技术
【GDB自定义指令】core analyzer结合gdb的调试及自定义gdb指令详情
【GDB自定义指令】core analyzer结合gdb的调试及自定义gdb指令详情
95 1
|
6月前
|
NoSQL 编译器 C语言
【GDB调试技巧】提高gdb的调试效率
【GDB调试技巧】提高gdb的调试效率
82 1