gdb使用笔记

简介: gdb是一款UNIX及UNIX-like下的调试工具,本文是对于gdb在Linux下使用的基本命令的总结gdb调试视频演示,gdb调试基础指令,gdb调试其他命令,gdb常见错误说明

gdb是一款UNIX及UNIX-like下的调试工具

gdb可用于调试用gcc编译的可执行文件,用gdb调试时gcc编译需要使用参数-g

本文是对于gdb在Linux下使用的基本命令的总结gdb调试视频演示gdb调试基础指令gdb调试其他命令gdb常见错误说明

image.gif编辑

目录

gdb调试视频演示

gdb调试基础指令

gdb调试其他命令

gdb常见错误说明


image.gif编辑

gdb调试视频演示

视频中使用gdb调试一个文件,下面有视频中命令的介绍,帮助大家直观理解一下GDB调试

GDB调试

image.gif

视频中

l是list,列出代码

可以看出每行代码有行号,需要b+行号命令,给程序打断点,这样程序就会停止在断点位置

打好断点后,使用run命令,程序将运行到断点处停下来

我们可以从断点开始一行一行执行代码

两种单步运行命令

s是step,如果一行代码是函数的话,会进入函数

n是next,如果这一行代码是函数的话,不会进入这个函数,会运行本函数的下一条命令

continue可以运行断点之后的命令

我们这样断点调试一个程序,就是为了查看一下程序在运行过程中变量存储的数值,可以使用命令p+变量,打印变量在运行过程中存储的值

quit命令可以退出调试

gdb调试基础指令

1.gcc检查语法错误

2.-g 使用该参数编译可以执行文件,得到调试表

gcc -g main.c -o main(加了-g才能用gdb)

3.gdb检查逻辑错误

4.gcc 文件名.c -o gdbtest

5.gcc 文件名.c -o gdbtest2 -g

6.gcc gdbtest.c -o a.out -g 编译

gdb a.out 进入调试

在(gdb)后面加“l”或者“list”

在(gdb)后面加“list 1”,使得从第一行开始显示十行,再在(gdb)后面再写”l“,会出现后续的行

7.设置断点

在gdb后面输入“break”和“b”

e.g

b 52

8.(gdb)后输入run,执行程序到断点处,断点处语句没有执行

(gdb)后面输入“s”或“step”,下一条命令,不会越过函数

(gdb)后面输入“n”或“next”,下一条命令,会越过函数

9.如果函数是系统函数只能用“n“,不能用”s”

10.until 循环次数 可以退出循环

11.p 变量

print 变量

可以查看变量

12.continue

继续执行断点后续命令

13.quit:退出gdb当前调试

gdb调试其他命令

1.用gdb调试查找段错误出现位置

段错误是访问了不可访问的内存

用gdb打开一个程序,直接“run”,程序停下的位置就是段错误的位置

2.start

默认从当前程序第一行开始运行

3.finish 可以结束当前函数调用,回到函数的调用点

4.set args 设置main函数命令行参数

可以有带参数的main函数,在“./文件名”后面加上参数

在(gdb)后面加上“set args 参数 参数”(要设置在start之前),可以加入参数

5.run 参数 参数2,设置main函数参数

6.display

display命令查看变量或表达式的值,每当程序暂停执行(例如单步执行)时,GDB 调试器都会自动帮我们打印出来,而 print 命令则不会。

7.info b 查看断点信息

8.条件断点:b 行号 if 变量=数据

e.g b 20 if i=5

一般用于循环

9.ptype 变量 查看变量类型

在子函数中不能查看没有通过参数传入子函数的变量

10.栈里面存放栈帧

栈帧是随着函数调用而在stack上开辟的一片内存空间,用于存放函数调用时时产生的局部变量和临时值

kernel(内核数据)
环境变量,main参数
stack(栈)
.so加载位置
heap(堆)
.bss
.data
.rodata(只读数据段)
.text(代码段)

有一个函数调用就会产生一个栈帧,调用结束,栈帧消失

如果想彻底理解栈帧有关机制的话,可以学习一下汇编语言

调用子函数main函数的栈帧不会消失,因为main函数没有结束

子函数栈帧中有形参和局部变量,子函数调用结束,子函数栈帧消失

11.利用指针可以在一片栈帧去修改另一片栈帧的值

12.backtrace:查看函数调用的栈帧和层级关系

frame:根据栈帧编号切换栈帧

bt:查看栈帧(#后面的是栈帧号)

frame 栈帧号

13.display 变量 设置跟踪变量

undisplay 变量 取消设置跟踪变量

gdb常见错误说明

常见错误

编译没有加“-g”

用gdb打开文件

list会出现 没有符号被读取,请使用“file”命令

解决方法

1.quit,重新编译

2.file a.out(a.out必须经过gdb调试)

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
麒麟系统开发笔记(十一):在国产麒麟系统上使用gdb定位崩溃异常方法流程进阶定位代码行数及专项测试Demo
上一篇,通过研究,可以定位到函数,本篇进一步优化,没有行数,程序较为复杂的时候,就无法定位,所以进一步定位。   本篇做了qBreakpad的研究,但是没有成功,过程也还是填出来,后来突然注意到gdb出现行数的方法,并通过了几轮测试以及实战,确实可以定位到行数,所以为了大家方便,把国企麒麟上的Qt崩溃方法分享出来。   本篇文章比较长,就不分篇了,同时还做了专项测试。
麒麟系统开发笔记(十一):在国产麒麟系统上使用gdb定位崩溃异常方法流程进阶定位代码行数及专项测试Demo
|
NoSQL Ubuntu
麟系统开发笔记(十):在国产麒麟系统上使用gdb定位崩溃异常方法流程以及测试Demo
本篇就适合代码崩溃的方法,可以定位到代码崩溃原因,测试Demo。
麟系统开发笔记(十):在国产麒麟系统上使用gdb定位崩溃异常方法流程以及测试Demo
|
NoSQL Linux C语言
用gdb调试程序笔记: 以段错误(Segmental fault)为例
用gdb调试程序笔记: 以段错误(Segmental fault)为例[转] 1.背景介绍2.程序中常见的bug分类3.程序调试器(如gdb)有什么用4.段错误(Segmental fault)介绍5.gdb调试入门 一、背景介绍这个笔记主要介绍开源的程序调试器(gdb)的入门知识,目的是使unix/linux环境的编程新手能够快速学会使用gdb调试程序的方法,同时也是对我使用gdb的一个经验总结。
2153 0
|
机器学习/深度学习 NoSQL
gdb反汇编详解C函数底层实现笔记(程序堆栈、内存分配)
以下是在读《深入理解计算机系统》前面的章节“程序的机器级表示”时,自己动手在linux上使用了gdb对一个简单的C程序进行反汇编,通过不懈的努力终于查清楚弄明白了绝大多数的语句。
1097 0
|
机器学习/深度学习 NoSQL
gdb反汇编详解C函数底层实现笔记(程序堆栈、内存分配)
以下是在读《深入理解计算机系统》前面的章节“程序的机器级表示”时,自己动手在linux上使用了gdb对一个简单的C程序进行反汇编,通过不懈的努力终于查清楚弄明白了绝大多数的语句。
1114 0
|
5月前
|
NoSQL 搜索推荐 openCL
【C/C++ 调试 GDB指南 】gdb调试基本操作
【C/C++ 调试 GDB指南 】gdb调试基本操作
328 2
|
2月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
50 10
|
2月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
|
2月前
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
38 0