128 Linux 系统编程6 ,C++程序在linux 上的调试,GDB调试

今天来整理 GDB 调试。

在windows 上我们使用vs2017开发,可以手动的加断点,debug。

那么在linux上怎么加断点,debug呢?这就是今天要整理的GDB调试工具了。

那么有些同学可能会想到:我们在windows上开发,只是在linux上跑不就行了吗?这样不是更方便吗?

实际上这样做有两个问题需要解决:

1.在linux上写C++,可能我们会用到linux的c函数,这些函数在windows上不支持的,那么在windows上就会有build error,build都build 不过,怎么跑起来debug呢?

2.项目最终是要部署到linux系统上运行的,假设这个bug在部署完成后,有问题,只有在项目运行环境下才有可能发生,这样debug也只能在linux下完成

因此学习GDB是很有必要的。

0.GDB可以运行的前提,必须build的时候要加上-g选项

g++ -g main.c -o a.out

g++ gdb.cpp -o a.out -g -Wall
 

1.GDB常用流程以及命令

1.)开始调试 gdb a.out

2.)list 1 后 回车 ,会调转到第一行看代码

list 1 可以简写成 l 1

3.) 设置断点 b 23 表示断点设置在第23行

b 23  和 break 23 的含义一样。

4.) run 执行,或者 r, 注意这时候23行并没有执行

5)按下 n 或者 s 往下走,n是next , s是step,

n 和s 的区别在于:step是跳入,如果是一个函数 s就会跳到函数内部

要注意的是:如果是系统函数,例如 rand()函数,按下s,会告知 “没有那个文件或目录”,也就是说,如果是系统函数,则进不去,只能在我们自己写的函数内部跳转,因此要注意的是,如果是系统函数,只能用n,如果用了s,就有可能出不来了。

6)跳转到下一个断点 continue 或者 c

7) 从这个断点直接跳到多少行  until 50 或者 u 50,中间有断点则会调用到断点那一行。

8)在某一行的时候,查看某一个变量的值 p key, 使用ptype key1

p arr

p 是print 的意思,也就是打印 arr 的值

ptype arr

查看arr 的类型

9)q是退出调试

2.GDB其他有用指令

gdb 对于段错误在执行 gdb a.out的时候,只要执行run,就会直接跳转到出现段错误的行

start 命令,会从main 函数的第一行开始执行

finish 命令,可以结束当前函数调用,例如我们按下s进入了一个系统函数,则可以使用finish命令退出来。

设置main函数的参数

在正常case 是这样设置的:

./a.out aa bb cc

在gdb中怎么设置呢?

在使用 gdb a.out 开始后,先set args ,然后run

set args aa bb cc

run 

也可以直接 run aa bb cc

查看目前的断点有哪些 info b, 删除断点  d num

注意的是:删除断点 d 后面跟的是 num,不是行数

(gdb) b 23
Breakpoint 1 at 0x4009b0: file gdb.cpp, line 23.
(gdb) b 35
Note: breakpoint 1 also set at pc 0x4009b0.
Breakpoint 2 at 0x4009b0: file gdb.cpp, line 35.
(gdb) b 67
Breakpoint 3 at 0x400b47: file gdb.cpp, line 67.
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004009b0 in select_sort(int*, int) at gdb.cpp:23
2       breakpoint     keep y   0x00000000004009b0 in select_sort(int*, int) at gdb.cpp:35
3       breakpoint     keep y   0x0000000000400b47 in main() at gdb.cpp:67
(gdb) d 2
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004009b0 in select_sort(int*, int) at gdb.cpp:23
3       breakpoint     keep y   0x0000000000400b47 in main() at gdb.cpp:67

设置断点时有 条件 b 50 if i=9

意思是 设置断点在50行,当i=9的时候才会触发这个断点
 

display 和 undisplay 一直观察某一个值,取消某一个值的观察

display a  一直显示a

display arr[a]  一直显示 arr[a]

display   将所有的观察的值列出

undisplay num 不再观察编号num的值

(gdb) display
6: a = 1
7: b = 7
8: arr[a] = 2
9: arr[b] = 13
(gdb) undisplay 6

3.栈帧的概念 引出的GDB 的backtrace 和  frame

bracktrace 查看当前所有的栈帧 简写为bt

使用 frame num 切换栈帧

当函数调用的时候,会在stack上开辟一片内存空间,用于存放函数调用时产生的局部变量和临时值

当一个函数调用结束后,系统就会从stack 中将这个栈帧 删除调用。

如下是main函数中有 select_sort() 函数的 栈帧图

那么在实际开发中,就会有这样的case,当我们debug到select_sort()这个栈帧的时候,需要观察下 main 栈帧中p的值,假设这个main 和select_sort()是两个线程,

但是这时候我们处在 select_sort这个栈帧中,是无法观察main栈帧的数据的。

因此要使用 backtrace 

当我们执行到select_sort函数的时候,使用 bt命令

(gdb) bt
#0  select_sort (arr=0x7fffffffe2c0, len=10) at gdb.cpp:38
#1  0x0000000000400b47 in main () at gdb.cpp:66
(gdb) 
 

可以看到,这时候有两个栈帧的,0是select_sort, 1是main 栈帧

由于我们要查看的变量char *p = (char *)"hellod"; 是在main栈帧中的,

因此要使用 frame 1 切换到main 栈帧,查看 p的值的

(gdb) frame 1
#1  0x0000000000400b47 in main () at gdb.cpp:66
66        select_sort(arr, N);
(gdb) p p
$1 = 0x400c76 "hellod"

然后可以使用 frame 0 切换到当前的 栈帧


 

4. GDB 常见错误分析

当我们使用 gdb gdbtest.out的时候,可能会遇见入下的错误,这说明你的gdbtest可执行文件在编译的时候就有问题,,并没有加上 -g的选项

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

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

相关文章

UML---活动图

活动图概述 活动图(Activity Diagram)是UML(Unified Modeling Language,统一建模语言)中的一种行为建模工具,主要用于描述系统或业务流程中的一系列活动或操作。活动图通常用于描述用例中的行为&#xff0c…

opengl pyqt 显示文字

目录 效果图 效果图 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QOpenGLWidgetfrom OpenGL.GL import * from OpenGL.GLUT import * from OpenGL.GLU import *class OpenGLWidget(QOpenGLWidget):def __init__(self, parentNone):super(OpenGLWidget…

开源分子对接程序rDock的安装及使用流程

欢迎浏览我的CSND博客! Blockbuater_drug …点击进入 前言 本文介绍开源分子对接程序rDock在Linux Ubuntu 22.04系统上的conda安装、编译安装过程及程序使用流程。 一、rDock是什么? rDock来源 rDock是一个快速、多功能的开源对接程序,可用…

IOS不使用默认的mainStroryboard作为首个controller的方法

步骤1: 删除info.plist文件下的一条配置,如图 步骤2: 编辑AppDelegate.m,参考以下代码 interface AppDelegate () //property (strong, nonatomic) UIWindow * window; property(nonatomic,strong) UIWindow * win; property(…

【Ubuntu】使用WSL安装Ubuntu

WSL 适用于 Linux 的 Windows 子系统 (WSL) 是 Windows 的一项功能,可用于在 Windows 计算机上运行 Linux 环境,而无需单独的虚拟机或双引导。 WSL 旨在为希望同时使用 Windows 和 Linux 的开发人员提供无缝高效的体验。安装 Linux 发行版时&#xff0c…

K8s安全一

Kubernetes是一个开源的,用于编排云平台中多个主机上的容器化的应用,目标是让部署容器化的应用能简单并且高效的使用, 提供了应用部署,规划,更新,维护的一种机制。其核心的特点就是能够自主的管理容器来保证云平台中的…

医院信息系统(HIS):一文扫盲,算是所有信息系统里面复杂的

大家好,我是贝格前端工场,本期继续分享常见的B端管理系统,欢迎大家关注,如有B端写系统界面的设计和前端需求,可以联络我们。 一、什么是HIS系统 HIS系统(Hospital Information System)是医院信…

K线实战分析系列之三:吞没形态

K线实战分析系列之三:吞没形态 一、吞没形态二、看涨吞没形态三、看跌吞没形态四、吞没形态判别标准 一、吞没形态 两根或两根以上的K线形成的组合形态,吞没形态就是一种主要的反转形态。 这个形态由两根K线组成,前短后长,一阴一…

第三百六十五回

文章目录 1. 概念介绍2. 方法与信息2.1 获取方法2.2 详细信息 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取设备信息"相关的内容,本章回中将介绍如何获取App自身的信息.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本…

LeetCode LCR 085.括号生成

正整数 n 代表生成括号的对数,请设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 1: 输入:n 3 输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”] 示例 2: 输入&#x…

备战蓝桥杯—— 双指针技巧巧答链表1

对于单链表相关的问题,双指针技巧是一种非常广泛且有效的解决方法。以下是一些常见问题以及使用双指针技巧解决: 合并两个有序链表: 使用两个指针分别指向两个链表的头部,逐一比较节点的值,将较小的节点链接到结果链表…

leetcode单调栈

739. 每日温度 请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。 例如,给定一个列表 temperatures [73, …

【Linux】 logout命令使用

logout命令 Linux logout命令用于前登录的用户退出系统。 它会终止当前用户的会话并返回到登录界面或者重新登录。当使用logout命令时,系统会关闭所有与当前用户相关的进程和程序,并释放占用的资源。 使用logout命令可以方便地切换用户或者注销当前用…

vue教程

v 创建一个vue实例插值表达式{{}}vue响应式特性vue指令v-if vs. v-show 指令v-else-if 指令v-on指令 注册监听内联语句methods中的函数名![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/8b9d81539ba74e6691b27694813e0f65.png)v-on 调用传参 v-bind 动态的设置html…

Machine Learning - 机器学习笔记

文章目录 1. 机器学习简介1.1 机器学习是什么? 2. 机器学习分类2.1 监督学习2.2 无监督学习 3. 初识机器学习3.1 线性回归模型3.2 代价函数3.2.1 代价函数公式3.2.2 理解代价函数 4. 了解梯度下降算法4.1 梯度下降4.2 梯度下降的实现4.3 理解梯度下降4.4 学习率4.5 …

MobaXterm连接VirtualBox虚拟机

目录 1.下载MobaXterm 2.获取连接配置 3.mobaXterm连接虚拟机 4.更好的方案 1.下载MobaXterm 据说MobaXtrem是远程终端的超级全能神器,官网下载地址:MobaXterm free Xserver and tabbed SSH client for Windows 选择适合你的版本:一个是Home Editi…

Matlab/simulink光伏发电的扰动观察法MPPT仿真(持续更新)

1.光伏发电的电导增量法MPPT仿真 2.光伏发电的恒定电压法MPPT仿真 3.光伏发电的扰动观察法MPPT仿真 4.光伏发电的占空比法MPPT仿真 5.基于神经网络的MPPT光伏发电仿真 6. 基于模糊控制的MPPT光伏发电仿真 7. 基于粒子群算法(PSO)的500w光伏系统MPPT控…

洛谷P8869 [传智杯 #5 初赛] A-莲子的软件工程学

#先看题目 题目背景 在宇宙射线的轰击下,莲子电脑里的一些她自己预定义的函数被损坏了。 对于一名理科生来说,各种软件在学习和研究中是非常重要的。为了尽快恢复她电脑上的软件的正常使用,她需要尽快地重新编写这么一些函数。 题目描述 …

【GPTs分享】每日GPTs分享之Canva

简介 Canva,旨在帮助用户通过Canva的用户友好设计平台释放用户的创造力。无论用户是想设计海报、社交媒体帖子还是商业名片,Canva都在这里协助用户将创意转化为现实。 主要功能 设计生成:根据用户的描述和创意需求,生成定制的设…

美团外卖流程解析:便捷、高效、安全的美食配送

美团外卖作为中国最大的外卖平台之一,提供了丰富多样的美食选择,并通过高效的配送服务将美食送到用户手中。本文将深入探讨美团外卖的流程,从下单到送达,揭秘背后的便捷、高效、安全的运营体系。 1. 下单与支付 美团外卖的下单过…