iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >【Linux】调试器 gdb 及 ‘\r‘ 的使用
  • 555
分享到

【Linux】调试器 gdb 及 ‘\r‘ 的使用

linux运维服务器 2023-09-05 21:09:42 555人浏览 安东尼
摘要

目录 前言 gdb 断点 打断点 查看、删除断点 断点使能 调试 显示数据 其他指令 ‘\r’的使用 行缓冲区 小程序 前言 🥑在 Linux 下我们可以通过 gcc 进行编译,但与 vs 相比若想对代码进行调试,

目录

前言

gdb

断点

打断点

查看、删除断点

断点使能

调试

显示数据

其他指令

‘\r’的使用

行缓冲区

小程序


前言

🥑在 Linux 下我们可以通过 gcc 进行编译,但与 vs 相比若想对代码进行调试,我们还需要学会使用调试器 gdb 

🥑我们都知道程序的发布方式有两种,release 版本和 debug 版本,而 release 版本是无法进行调试的,在 VS 之中默认为 debug 版本,并且可以通过选取来直接更改程序的不同版本。

🥑但在 Linux gcc/g++ 出来的二进制程序,默认是 release 模式,因此无法调试。若想转换成 debug 版本,则必须在源代码生成二进制程序的时候, 加上 -g 选项。

GCc -g -o text text.c

🥑同时我们也注意到,debug 版本的可执行程序明显占的空间较大,这是因为 release 版本是最终用户在使用的版本,且用户根本不需要对文件进行调试,为了节约空间占比,release 版本便不会加上文件的调试信息,这也是为什么 release 版本下无法进行调试的原因。

-rwxrwxr-x 1 Alpaca Alpaca 9544 Feb  3 11:56 text.debug-rwxrwxr-x 1 Alpaca Alpaca 8384 Feb  3 11:57 text.release

gdb

🥑当我们拿到 debug 版本的可执行文件之后就可以进行调试了。直接 gdb + 可执行文件名 就可以打开调试器了。

[Alpaca@VM-12-9-Centos myfile]$ gdb text.debug    //gdb + 文件名GNU gdb (GDB) Red Hat Enterprise linux 7.6.1-120.el7Copyright (C) 2013 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and Redistribute it.There is NO WARRANTY, to the extent permitted by law.  Type "show copying"and "show warranty" for details.This GDB was configured as "x86_64-redhat-linux-gnu".For bug reporting instructions, please see:...Reading symbols from /home/Alpaca/myfile/text.debug...done.(gdb)                //进入后的命令行

🥑l + 行号(中间要有空格): 从该行开始向下打印10行。若代码过长再按回车会自动重复上一个指令进行操作。

(gdb) l 11#include2#include34void plus(int* p)5{6*p *= 2;7}89int main()10{(gdb)       //再按一次回车11int count = 0;12while (1)13{14printf("%d\n", count);15count++;16plus(&count);17}18return 0;19}(gdb) 

🥑r :开始调试 ,与VS中的F5效果相同,若程序非死循环或过程中无断点则会直接执行到程序结束。

断点

打断点

🥑 d + 行号 :在该行打断点。

🥑 d + 函数名 : 在该函数有效行处打上断点。

(gdb) b 11            //以行号打断点Breakpoint 3 at 0x40054e: file text.c, line 11.(gdb) b main          //找函数打断点Breakpoint 1 at 0x40054e: file text.c, line 11.

查看、删除断点

🥑 info b :查看所有断点信息。

🥑 d + 断点编号 :删除断点

(gdb) info bNum     Type           Disp Enb Address            What3       breakpoint     keep y   0x000000000040054e in main at text.c:114       breakpoint     keep y   0x0000000000400555 in main at text.c:145       breakpoint     keep y   0x0000000000400569 in main at text.c:15
(gdb) d 4(gdb) info bNum     Type           Disp Enb Address            What3       breakpoint     keep y   0x000000000040054e in main at text.c:115       breakpoint     keep y   0x0000000000400569 in main at text.c:15

断点使能

🥑 disable :  禁用断点。(当禁用断点后再次运行直到程序结束才会停止)

🥑 enable :  使用断点。

调试

🥑 n :逐过程调试。(类似于VS中的F10,若遇到函数调用不会进入到函数之中)

🥑 :逐语句调试。(类似于VS中的F11,会进入到函数之中继续调试)

//逐语句Breakpoint 3, main () at text.c:1111int count = 0;(gdb) n14printf("%d\n", count);(gdb) n0Breakpoint 5, main () at text.c:1515count++;(gdb) n16plus(&count);(gdb) 17}//逐语句Breakpoint 5, main () at text.c:1515count++;(gdb) 16plus(&count);(gdb) plus (p=0x7fffffffe42c) at text.c:66*p *= 2;(gdb) 7}(gdb) main () at text.c:1717}

显示数据

🥑 p + 变量名 :打印出该变量当前的值。

🥑 display + 变量名:跟踪查看一个变量,每次停下来都显示它的值。

🥑 undisplay + 编号 : 取消对变量的跟踪查看。

(gdb) p count$4 = 2(gdb) display count3: count = 2(gdb) undisplay 3

其他指令

🥑 c :从一个断点处直接执行到下一个断点。

🥑 set var:修改变量的值。

🥑 finish : 执行完一个函数。

🥑 until + 行号:跳至该行。
🥑 bt :查看各级函数调用及参数。
🥑 quit :退出gdb。

‘\r’的使用

🥑在Linux下以下的三条语句会产生三种不一样的结果。

    printf("hello world\n");     //正常打印后暂停一秒sleep(1);    printf("hello world");       //暂停了一秒后语句和提示符一起打印出来                       sleep(1);    printf("hello world\r");     //无语句打印                       sleep(1);
hello world[Alpaca@VM-12-9-centos myfile]$ hello world[Alpaca@VM-12-9-centos myfile]$[Alpaca@VM-12-9-centos myfile]$ 

行缓冲区

🥑在字符串被打印出来之前,会将其先加载到行缓冲区之中,但不是立刻就会打印出来。因此在第二条语句时,语句还没有打印出来系统就暂停了一秒钟,之后行缓冲区刷新,将之前的内容都打印出来, 因此第二个语句才会是先暂停一秒再打印。又因为提示符是跟随光标打印的,所以便跟在语句之后打印。

🥑我们都知道 \n 为换行符,而 \r 又被称为回车,会将光标会到本行的最开始。当我们使用 \n 便会强行刷新行缓冲区,使之前的数据被打印出来。而第三个语句之所以没有打印出语句则是因为 \r 使得光标回到本行开头,提示符从头开始打印将原来要打印出来的语句覆盖掉了,所以没有语句显示出来。

🥑若使用fflush对缓冲区进行刷新的话,便能够看到语句打印出来一秒钟后,就被系统的提示符覆盖打印了。

#include #include int main(){   printf("hello world\r");   fflush(stdout);          sleep(1);   return 0;}

小程序

🥑通过上面第三个语句的启发,我们可以写出一个类似于进度条的小程序,通过每次重复覆盖打印,得到进度条在持续增长的效果。

#include#include#include #define SIZE 101int main(){  int i = 0;  char s[SIZE];        //转换成重复打印一个数组  memset(s,0,SIZE*sizeof(char)); //对数组初始化  const char *lable ="|/-\\";  while(i<=100)  {    if(i!=100)    {       s[i] = '>';     //i指向最高一位,作为箭头    }     printf("[%-100s][%3D%%][%c]\r",s,i,lable[i%4]); //把数组对其打印出来,并附上其他观赏性信息     fflush(stdout);                 //每次刷新缓冲区                      s[i++] = '=';                   //进度条延长     usleep(100000);  }   printf("\n");   return 0; }

🥑好了这次调试器 gdb'\r' 的介绍就到这里结束了,关注博主共同进步!!

来源地址:https://blog.csdn.net/Lin_Alpaca/article/details/128863346

--结束END--

本文标题: 【Linux】调试器 gdb 及 ‘\r‘ 的使用

本文链接: https://www.lsjlt.com/news/396138.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【Linux】调试器 gdb 及 ‘\r‘ 的使用
    目录 前言 gdb 断点 打断点 查看、删除断点 断点使能 调试 显示数据 其他指令 ‘\r’的使用 行缓冲区 小程序 前言 🥑在 Linux 下我们可以通过 gcc 进行编译,但与 vs 相比若想对代码进行调试,...
    99+
    2023-09-05
    linux 运维 服务器
  • Linux如何使用gdb调试多进程
    这篇文章主要介绍了Linux如何使用gdb调试多进程的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux如何使用gdb调试多进程文章都会有所收获,下面我们一起来看看吧。一.gdb常用目录表操作描述l命令相当...
    99+
    2023-06-28
  • linux中怎么使用gdb调试程序
    在Linux中使用gdb调试程序,可以按照以下步骤进行操作:1. 在命令行中编译你的程序时,加上`-g`选项,以便生成调试信息。例如...
    99+
    2023-09-13
    linux
  • C编译: 使用gdb调试
    介绍gdb调试命令行使用gdb是the GNU Debugger的简称。它是一款UNIX平台的调试器(debugger),可用于为C, C++, Objective-C, Java, Fortran等程序debug。在gdb中,你可以通过设...
    99+
    2023-06-03
  • 怎么使用gdb调试php
    今天给大家介绍一下怎么使用gdb调试php。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。使用gdb调试php简介gdb 是c语言的代码调试工具可以用来调试ph...
    99+
    2023-06-29
  • Linux程序调试工具gdb怎么使用
    这篇文章主要介绍“Linux程序调试工具gdb怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Linux程序调试工具gdb怎么使用”文章能帮助大家解决问题。gdb是GNU开源组织发布的一个强大...
    99+
    2023-06-27
  • Linux下怎么使用gdb调试go程序
    在golang的开发过程中,我们常常会遇到需要调试问题的情况。这时,我们需要工具来辅助我们进行调试。在golang中,最常用的调试工具就是gdb了。本文将介绍如何在Linux操作系统下安装和配置gdb。一、什么是gdb?gdb是一款可以在多...
    99+
    2023-05-14
  • 在Linux中怎么使用gdb调试C程序
    这篇文章主要为大家展示了“在Linux中怎么使用gdb调试C程序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“在Linux中怎么使用gdb调试C程序”这篇文章吧。无论多么有经验的程序员,开发的任...
    99+
    2023-06-16
  • Linux系统下如何使用GDB调试程序
    本文将为大家详细介绍“Linux系统下如何使用GDB调试程序”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“Linux系统下如何使用GDB调试程序”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容...
    99+
    2023-06-28
  • 『Linux从入门到精通』第 ⑪ 期 - Linux调试器——gdb使用详解
    文章目录 💐专栏导读💐文章导读🌷准备工作🌷安装gdb调试器🌷如何进入调试?🌷调试相关指令 💐专栏导读 &#x...
    99+
    2023-08-18
    linux 运维 服务器
  • 如何使用 GDB 调试 Golang 函数?
    使用 gdb 调试 go 函数步骤如下:安装 gdb 和 go 调试包。启用调试信息编译程序。使用 gdb 启动程序。设置断点。使用 run 命令启动程序。使用调试命令进行调试。 如何...
    99+
    2024-04-18
    go gdb linux golang
  • 在Linux系统中使用GDB来调试C++程序的方法
    这篇文章主要讲解了“在Linux系统中使用GDB来调试C++程序的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在Linux系统中使用GDB来调试C++程序的方法”吧!安装GDB大多数的...
    99+
    2023-06-13
  • Linux系统中gdb程序调试工具怎么用
    这篇文章主要为大家展示了“Linux系统中gdb程序调试工具怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux系统中gdb程序调试工具怎么用”这篇文章吧。  一、常规调试  gdb是...
    99+
    2023-06-13
  • 在Centos7中使用vscode和gdb调试PG插件的方法
    目录安装vscodevscode中gdb调试调试动态库调试程序识别需要attach的PG进程安装vscode sudo rpm --import https://packages.m...
    99+
    2024-04-02
  • Linux的gdb命令怎么使用
    这篇“Linux的gdb命令怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux的gdb命令怎么使用”文章吧。L...
    99+
    2023-06-28
  • python pdb调试器及使用方法
    目录pdb 使用方法1. 常用命令a. 断点设置b. 运行c. 查看d. 其他2. 使用方法一3. 使用方法二pdb 使用方法 1. 常用命令 a. 断点设置 b(reak) [([...
    99+
    2024-04-02
  • Python脚本在使用gdb调试时常会遇到的克星指的是什么
    这期内容当中小编将会给大家带来有关Python脚本在使用gdb调试时常会遇到的克星指的是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。使用gdb调试Python脚本我们在实际调试python脚本中一般...
    99+
    2023-06-17
  • Logshark调试Logstash及Filebeatpipelines使用详解
    目录Filebeat processors处理数据启动服务器二进制dockerdocker-compose.yml将的 Logstash 管道的输出指向它logstash.confF...
    99+
    2022-12-09
    Logshark调试Logstash Logshark调试Filebeat pipelines
  • 如何使用 Golang 调试器调试函数?
    使用 dlv 调试器,可以通过以下步骤调试函数:安装 dlv设置断点(dlv break funcname)启动调试器(dlv debug)运行程序(dlv continue)检查变量(...
    99+
    2024-04-17
    go 调试 git golang
  • SAP的ABAP调试器怎么使用
    这篇文章主要讲解了“SAP的ABAP调试器怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SAP的ABAP调试器怎么使用”吧!首先弄清楚ABAP Classic调试器和新调试器的区别:...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作