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.hqwc.cn/news/487212.html

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

相关文章

Python 在Word中创建表格并填入数据、图片

在Word中,表格是一个强大的工具,它可以帮助你更好地组织、呈现和分析信息。本文将介绍如何使用Python在Word中创建表格并填入数据、图片,以及设置表格样式等。 Python Word库: 要使用Python在Word中创建或操作表格,需…

【更新】ARCGIS之成片区开发方案报备坐标txt格式批量导出工具(定制开发版)

序言 之前开发的成片区开发方案报备格式是按湖北省的标准定制的,目前,自然资源部又有了新的格式要求,现在新增国标版的成片区开发方案报备格式导出。 之前版本软件详见:软件介绍 一、软件简介 本软件是基于arcgis二次开发的工具&…

蜂窝物联网咖WiFi认证解决方案

项目背景 随着目前网咖模式越来越流行,给网吧部署一套无缝漫游的WIFI网络势在必行。同时,网吧无线准入的验证码在客户机上面进行更新,以防周边的人员进行蹭网,损失网吧的外网带宽。 01 需求分析 1. 网吧服务区域全部覆盖无盲区…

分享一个我爱工具网源码优化版

应用介绍 本文来自:分享一个我爱工具网源码优化版 - 源码1688 前几天在网上看到了一个不错的工具网源码,但是源码存在一些问题,遂进行了修改优化。 主要修改内容有: 1、后台改为账号密码登录,上传即用,不…

如何将建筑白模叠加到三维地球上?

​ 通过以下方法可以将建筑白模叠加到三维地球上。 方法/步骤 下载三维地图浏览器 http://www.geosaas.com/download/map3dbrowser.exe,安装完成后桌面上出现”三维地图浏览器“图标。 2、双击桌面图标打开”三维地图浏览器“ 3、点击“建筑白模”菜单&…

云图极速版限时免费活动

产品介绍 云图极速版是针对拥有攻击面管理需求的用户打造的 SaaS 应用,致力于协助用户发现并管理互联网资产攻击面。 实战数据 (2023.11.6 - 2024.2.23) 云图极速版上线 3 个月以来,接入用户 3,563 家,扫描主体 19,961 个,累计发…

【Python笔记-设计模式】装饰器模式

一、说明 装饰器模式是一种结构型设计模式,旨在动态的给一个对象添加额外的职责。 (一) 解决问题 不改变原有对象结构的情况下,动态地给对象添加新的功能或职责,实现透明地对对象进行功能的扩展。 (二) 使用场景 如果用继承来扩展对象行…

linux服务器tomcat日志中文出现问号乱码

目录 一、场景二、排查三、原因四、解决 一、场景 tomcat日志的中文出现问号乱码 乱码示例 ??[377995738417729536]????????? ac??????????????message:二、排查 1、使用locale命令查看服务器当前使用的语言包 发现只用的语言包为utf-8&#xff0…

SpringBoot项目实现文件上传,MINIO+OSS阿里云

MINIO 安装以及部署 官网:MinIO | Code and downloads to create high performance object storage 下载后是一个minio.exe的文件,可以先创一个文件夹来存放数据以及文件 在文件的目录下cmd进入控制台 minio.exe server data 启动成功后控制台会打印账…

opencv判断二值的情况

目的 先说说理论: 什么叫图像的二值化?二值化就是让图像的像素点矩阵中的每个像素点的灰度值为0(黑色)或者255(白色),也就是让整个图像呈现只有黑和白的效果。在灰度化的图像中灰度值的范围为0…

C# OpenVINO 百度PaddleSeg实时人像抠图PP-MattingV2

目录 效果 项目 代码 下载 C# OpenVINO 百度PaddleSeg实时人像抠图PP-MattingV2 效果 项目 代码 using OpenCvSharp; using Sdcb.OpenVINO; using System; using System.Diagnostics; using System.Drawing; using System.Security.Cryptography; using System.Text; us…

C# winfroms使用socket客户端服务端代码详解

文章目录 1️⃣ 通信相关说明1.1服务端与客户端1.2 信息发送原理1.3 信息接收原理 2️⃣ socket代码2.1 客户端代码2.2 服务端代码 3️⃣ 定时任务处理报文3.1 Timers定时任务 优质资源分享 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_4315141…