gdb 入门

gdb 入门

简介

gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具。

一般来说,GDB主要帮助你完成下面四个方面的功能:

1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。

2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)

3、当程序被停住时,可以检查此时你的程序中所发生的事。

4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。

gdb可以调试的对象

gdb 可以调试的语言

Ada, Assembly, C, C++, D, Fortran, Go, Objective-C, OpenCL, Modula-2, Pascal, Rust

gdb 可以调试的文件类型

注意在编译时需要加上-g选项。gdb可以调试的文件类型有三种:

  1. 二进制文件。

    gdb a.out

  2. core文件。通常,我们在遇到错误时得到一个core文件(如果没有,请通过ulimit -a命令查看core file siez是否为0,若为0,通过ulimit -c unlimited改为unlimited即可)

    gdb a.out core.12345

  3. 运行中的进程,其中[1234]时要调试的进程号

    gdb -p 1234

gdb的常用命令(入门)

本小节仅介绍入门级的常用命令,稍微进阶的用法会慢慢补全。

以下索引表解释常用命令基本的含义,有些细节会在下一小节具体说。

命令(简写)含义
help (h)查看命令帮助
run (r)重新开始运行文件
run argv[1] argv[2]调试时命令行传参
start单步执行,运行程序,停在第一执行语句
list (l)查看源代码
set设置变量的值
next (n)单步调试(逐过程,函数直接执行)
step (s)单步调试(逐语句,跳入自定义函数内部执行)
braktrace (bt)查看函数的调用的栈帧和层级关系
frame (f)切换函数的栈桢
info (i)查看函数内部局部变量的值
finish结束当前函数,返回到调用点
continue (c)继续运行(至下一个断点或程序结束)
print (p)打印值
quit (q)退出gdb
break (b)设置断点
info breakpoints(i break)查看当前设置的所有断点
enable/disable breakpoints启用 / 禁用断点
delete num(d num)删除第num个断点
display追踪查看具体的变量值
undisplay取消追踪观察变量
watch被设置观察点的变量发生修改时,打印显示
info watchpoints(i watch)显示观察点
x查看内存x/20xw 显示20个单元,16进制,4字节每单元

几个常用的命令详解

list

list 可简写为l,可以列出所调试程序的代码

  1. list linenumber:列出linenumber附近的代码
  2. list function:列出某个函数附近的源代码

break

gdb调试时使用break命令来设置断点,简写为b,有如下几种下断点地方法:

  1. break function:在进入指定的函数function处打断点,C++中可以使用class::function或function(type, type)格式来指定函数名称

    break filename:function:在指定文件的指定函数处打断点

  2. break linenumber:在指定的行数打断点

    break filename:linenumber:在指定文件的指定行数打断点

  3. break +/- offeset:在当前行的前面或后面打断点

  4. break *address:在程序运行的指定地址出打断点

  5. break:在下一条命令处停止运行

  6. break .. if condition:在在处理某些循环体中可使用此方法进行调试,其中…可以是上述的break lineNumberbreak +/-offset中的参数,其中condition表示条件,在条件成立时程
    序即停止运行,如设置break if i=100表示当i为100时程序停止运行。

查看断点时,也可以使用info命令如info breakpoints [n]、info break [n]其中n 表示断点号来查看断点信息。

可以通过delete命令删除所有的断点

next

使用next命令单步执行程序代码,next的单步不会进入函数的内部,与next对应的step命令则在单步执行一个函数时进入函数内部,类似于VC++中的step into,其用法为next count,单步跟踪,如果有函数调用不会进入函数,如果后面不加count表示一条一条的执行,加count表示执行后面的count条指令。

continue

continue:当程序遇到断点停下来之后,可以执行continue继续执行到下一个断点或到程序结束。

print

简写为p,可以通过print命令查看参数或程序运行数据

值得注意的是print输出可以指定显示变量的输出格式:

符号输出格式
x十六进制
d十进制
u十六进制无符号数
o八进制
t二进制
c字符格式
f浮点数格式

print可以输出东西可多:全局变量,静态全局变量,局部变量,如果你的局部变量和全局变量发生冲突(也就是重名),一般情况下是局部变量会隐藏全局变量。

  1. 全局变量利用::,例如在1.c中看x:(gdb)p "1.c"::x

  2. 数组(动):p *array@len
    array:数组的首地址,len:数据的长度

  3. 数组(静):直接p数组名

  4. 所有寄存器的值:info registers

  5. 查看指定的寄存器的值:p $eip

  6. 结构体。如果你想很漂亮的输出结构体请设置set print pretty on,打开print pretty这个东西,没错,输出很漂亮滴。

disassemble

disassemble function来查看汇编代码,如下图示某个main函数的反汇编代码:

在这里插入图片描述

我们可以通过反汇编代码的偏移量来在汇编代码中打上断点,比如我们想要在图中红色箭头处打断点,只需b *main+45

我们可以通过disassemble /m function指令,来将C/C++源代码和其反汇编一起显示,这样会更加直观:

在这里插入图片描述

backtrace

可以简写为bt,功能为显示函数的栈。

当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。你可以用这条命令来查看当前的栈中的所有信息。

在递归时可以很方便地查看栈上各个递归函数的栈帧:
在这里插入图片描述

图中的Delete函数会被递归调用,功能时删除二叉搜索树种的某个节点,具体功能不重要,这里是为了展示递归函数多层递归时通过backtrace来查看栈帧信息。

显示栈顶的几个层的信息:bt n

显示栈底下的几层信息:bt -n

但是,如果要查看某一层的信息,你需要在切换当前的栈,一般来说,程序停止时,最顶层的栈就是当前栈,如果你要查看栈下面层的详细信息,首先要做的是切换当前栈。这就要用到下面的frame命令。

frame

可以简写为f,n是一个从0开始的整数,是栈中的层编号。比如:frame 0,表示栈顶,即当前函数的栈帧,frame 1,表示栈的第二层,即调用当前函数的函数的栈帧。

up n:表示向栈的上面移动n层,可以不打n,表示向上移动一层。

down n:表示向栈的下面移动n层,可以不打n,表示向下移动一层。

info f:会打印出更为详细的当前栈层的信息。

在这里插入图片描述

layout

用于分割窗口,可以一边查看代码,一边测试。如下图是layout src的窗口展示:

在这里插入图片描述

命令及参数功能
layout src显示源代码窗口
layout asm显示汇编窗口
layout regs显示源代码/汇编和寄存器窗口
layout split显示源代码和汇编窗口
layout next显示下一个layout
layout prev显示上一个layout

另外我们可以通过一些功能键调整窗口选项:

Ctrl + L,刷新窗口
Ctrl + x,再按1:单窗口模式,显示一个窗口
Ctrl + x,再按2:双窗口模式,显示两个窗口
Ctrl + x,再按a:回到传统模式,即退出layout,回到执行layout之前的调试窗口。

Ref

https://www.gnu.org/software/gdb/

https://blog.csdn.net/awm_kar98/article/details/82840811

http://blog.chinaunix.net/uid-29611934-id-5168746.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下的CUDA多版本管理

Linux下的CUDA多版本管理 关于CUDA、cuDNN等的简介和安装可参考:显卡、显卡驱动、CUDA、CUDA Toolkit、cuDNN 梳理。 CUDA多版本 有时我们会在一台机器上同时看到多个版本的CUDA,比如nvcc -V和nvidia-smi的输出就可能会不同: 在我们实验室…

ONNX初探

ONNX初探 转载自:https://blog.csdn.net/just_sort/article/details/112912272 0x0. 背景 最近看了一些ONNX的资料,一个最大的感受就是这些资料太凌乱了。大多数都是在介绍ONNX模型转换中碰到的坑点以及解决办法。很少有文章可以系统的介绍ONNX的背景…

服务器修改地址,服务器修改管理地址

服务器修改管理地址 内容精选换一换在弹性云服务器上安装完成后输入公网IP,无法连接目的虚拟机,端口无法访问工具。源端网络未连通目的端。目的端安全组未开放8084端口。目的端网络ACL禁用了8084端口。登录源端服务器后,在源端服务器中ping 目…

ONNX再探

ONNX再探 本文转自:https://blog.csdn.net/just_sort/article/details/113802330 这篇文章从多个角度探索了ONNX,从ONNX的导出到ONNX和Caffe的对比,以及使用ONNX遭遇的困难以及一些解决办法,另外还介绍了ONNXRuntime以及如何基于…

图解自监督学习(CV)

图解自监督学习(CV) 译自:https://amitness.com/2020/02/illustrated-self-supervised-learning/ 作者:Amit Chaudhary 注:译者在某些地方对原文的表述做了调整,使其适合汉语的阅读习惯,并在…

机器学习中的归纳偏置

机器学习中的归纳偏置 带着偏见看世界,否则你根本没有看待世界的方式。 本文主要参考整理自知乎问题:如何理解Inductive bias? No-Free-Lunch(NLF)定理指出学习是不可能的,除非有先验知识。通常情况下&…

【c语言数据结构笔记】1.2 数据结构

1.2数据结构 数据元素并独立 结构实体关系 形式定义&#xff08;D&#xff0c;S&#xff09; 其中D是数据元素的有限集&#xff0c;S是D上关系的有限集 eg&#xff1a;12位数&#xff1a;132423451233 分成三组四位数 次序关系<a1,a2><a2,a3> 遵守次序关系 eg&…

使用Apex进行混合精度训练

使用Apex进行混合精度训练 转自&#xff1a;https://fyubang.com/2019/08/26/fp16/ 你想获得双倍训练速度的快感吗&#xff1f; 你想让你的显存空间瞬间翻倍吗&#xff1f; 如果我告诉你只需要三行代码即可实现&#xff0c;你信不&#xff1f; 在这篇博客里&#xff0c;瓦砾…

【数据结构1.3笔记】研究内容

1.3研究内容 数据结构&#xff08;D&#xff0c;S&#xff09; {逻辑结构&#xff1a; {物理结构&#xff08;存储结构&#xff09; {数据的运算 1.逻辑结构 1 集合&#xff1a;集合&#xff0c;没有逻辑关系 2 线性结构 “一对一” 3树形结构 层次关系 4图形结构 练习&…

2019年蓝桥杯第一题

第一题 标题&#xff1a;组队&#xff08;本题总分&#xff1a;5 分&#xff09; 作为篮球队教练&#xff0c;你需要从以下名单中选出 1 号位至 5 号位各一名球员&#xff0c; 组成球队的首发阵容。 每位球员担任 1 号位至 5 号位时的评分如下表所示。请你计算首发阵容 1 号位…

深度学习编译:MLIR初步

深度学习编译MLIR初步 深度模型的推理引擎 目前深度模型的推理引擎按照实现方式大体分为两类&#xff1a;解释型推理引擎和编译型推理引擎。 解释型推理引擎 一般包含模型解析器&#xff0c;模型解释器&#xff0c;模型优化器。 模型解析器负责读取和解析模型文件&#xff…

深入浅出LLVM

深入浅出LLVM 转自&#xff1a;https://www.jianshu.com/p/1367dad95445 什么是LLVM&#xff1f; LLVM项目是模块化、可重用的编译器以及工具链技术的集合。 美国计算机协会 (ACM) 将其2012 年软件系统奖项颁给了LLVM&#xff0c;之前曾经获得此奖项的软件和技术包括:Java、A…

一分钟系列:什么是虚拟内存?

一分钟系列&#xff1a;什么是虚拟内存&#xff1f; 转自&#xff1a;https://mp.weixin.qq.com/s/opMgZrXV-lfgOWrNUMKweg 注&#xff1a;一分钟系列的篇幅都不长&#xff0c;适合吃饭蹲坑、地铁公交上食用&#xff5e; 内存对于用户来说就是一个字节数组&#xff0c;我们可…

11-Kafka

1 Kafka Kafka是一个分布式流式数据平台&#xff0c;它具有三个关键特性 Message System: Pub-Sub消息系统Availability & Reliability&#xff1a;以容错及持久化的方式存储数据记录流Scalable & Real time 1.1 Kafka架构体系 Kafka系统中存在5个关键组件 Producer…

虚拟内存精粹

虚拟内存精粹 标题&#xff1a;虚拟内存精粹 作者&#xff1a;潘建锋 原文&#xff1a;HTTPS://strikefreedom.top/memory-management–virtual-memory 导言 虚拟内存是当今计算机系统中最重要的抽象概念之一&#xff0c;它的提出是为了更加有效地管理内存并且降低内存出错的概…

深度学习自动编译和优化技术调研

深度学习自动编译和优化技术调研 转自&#xff1a;https://moqi.com.cn/blog/deeplearning/ 作者&#xff1a;墨奇科技全栈开发 在墨奇科技&#xff0c;我们需要将一些包含深度神经网络&#xff08;DNN&#xff09;的 AI 算法移植到边缘端的设备&#xff0c; 这些设备往往使用 …

Copy-On-Write COW机制

Copy-On-Write COW机制 转自&#xff1a;https://zhuanlan.zhihu.com/p/48147304 作者&#xff1a;Java3y 前言 只有光头才能变强 在读《Redis设计与实现》关于哈希表扩容的时候&#xff0c;发现这么一段话&#xff1a; 执行BGSAVE命令或者BGREWRITEAOF命令的过程中&#xff0c…

第2章线性表的基本使用及其cpp示例(第二章汇总,线性表都在这里)

2.1线性表的定义和特点 【类型定义&#xff1a; *是n个元素的有限序列 *除了第一个元素没有直接前驱和最后一个没有直接后驱之外&#xff0c;其余的每个元素只有一个直接前驱和直接后驱&#xff1b; &#xff08;a1,a2…an&#xff09; 【特征&#xff1a; *有穷性&#xff1…

2.3单链表的基本使用及其cpp示例

2.3线性表的链式表现与实现 2.3.1.1单链表 【特点&#xff1a; *用一组任意的存储单元存储线性表的数据元素 *利用指针实现用不同相邻的存储单元存放逻辑上相邻的元素 *每个元素ai&#xff0c;除存储本身信息外&#xff0c;还存储其直接后继的元素&#xff08;后一个元素的地址…

TVM:简介

TVM&#xff1a;简介概述 Apache TVM 是一个用于 CPU、GPU 和机器学习加速器的开源机器学习编译器框架。它旨在使机器学习工程师能够在任何硬件后端上高效地优化和运行计算。本教程的目的是通过定义和演示关键概念&#xff0c;引导您了解 TVM 的所有主要功能。新用户应该能够从…