GDB调试 小结

2023-05-16

本文介绍使用GDB进行C调试

参考:用gdb调试程序笔记: 以段错误(Segmental fault)为例

GDB操作基本命令

1.编写调试测试代码如下

bugging.c--1到100的求和函数,代码调试

/* bugging.c */

#include <stdio.h>

int foo(int n)
{

    int sum;
    int i;

    for (i=0; i<=n; i++)
    {
        sum = sum+i;
    }

    return sum;
}

int main(int argc, char** argv)
{
    int result = 0;
    int N = 100;

    result = foo(N);

    printf("1+2+3+...+%d= %d\n", N, result);

    return 0;

}

1.如果要调试程序,需要在 gcc 编译可执行程序时加上 -g 参数,首先我们编译 bugging.c 程序,生成可执行文件bugging:其中 -o 指定输出文件名, -m32 表示构建32位可执行程序,楼主的环境是 64 位的 Ubuntu 14.04,所以默认会编译为 64 位的程序

gcc -g -o bugging bugging.c -m32

对编译文件进行验证

结果出错,说明有逻辑错误,如下开始使用GDB进行在线调试!

2.下载gdb调试软件进行调试

GDB 概述:
 GDB 是 GNU开源组织发布的一个强大的 UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像 VC、 VS,BCB等 IDE的调试,但如果你是在 UNIX平台下做软件,你会发现 GDB这个调试工具有比 VC、 BCB的图形化调试器更强大的功能。所谓 “寸有所长,尺有所短 ”就是这个道理。 一般来说, GDB主要帮忙你完成下面四个方面的功能:  
1 、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。  
2 、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)  
3 、当程序被停住时,可以检查此时你的程序中所发生的事。
4 、动态的改变你程序的执行环境。
从上面看来, GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现 GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。
在网上找一个链接使用wget下载!

# 下载代码压缩包
wget http://labfile.oss.aliyuncs.com/courses/496/gdbtest.zip
# 解压
unzip gdbtest.zip
# 进入到代码目录查看文件列表
cd gdbtest/
ls -l

如图:

接下来开始使用GDB调试


root@ubuntu:/home/skyler/share/Justin/gdb/gdbtest# ./bugging<---------- 启动程序--逻辑错误
1+2+3+...+100= -144836892
root@ubuntu:/home/skyler/share/Justin/gdb/gdbtest# gdb bugging<---------- 启动 GDB
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
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-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from bugging...done.
(gdb) r<-------------------- r--run运行指令,查看全速运行结果如下
Starting program: /home/skyler/share/Justin/gdb/gdbtest/bugging
1+2+3+...+100= -136153372
[Inferior 1 (process 6159) exited normally]
(gdb) l<-------------------- l 命令相当于 list,从第一行开始例出原码
7
8           int sum;
9           int i;
10
11          for (i=0; i<=n; i++)
12          {
13              sum = sum+i;
14          }
15
16          return sum;
(gdb)
17      }
18
19      int main(int argc, char** argv)
20      {
21          int result = 0;
22          int N = 100;
23
24          result = foo(N);
25
26          printf("1+2+3+...+%d= %d\n", N, result);
(gdb)
27
28          return 0;
29
30      }
31
(gdb) break 9 <-------------------- 在第9行设置断点!设置断点之后再输入运行
Breakpoint 1 at 0x8048411: file bugging.c, line 9.
(gdb) r<--------------------r-run运行调试指令
Starting program: /home/skyler/share/Justin/gdb/gdbtest/bugging

Breakpoint 1, foo (n=100) at bugging.c:11
11          for (i=0; i<=n; i++)
(gdb) p i<-------------------- 查看此处的变量i
$1 = 1
(gdb) p sum<-------------------- 查看此处的变量sum
$2 = -136158422
(gdb)           <-------------------- 空格代表下一次变量值查看
$3 = -136158422
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/skyler/share/Justin/gdb/gdbtest/bugging

Breakpoint 1, foo (n=100) at bugging.c:11
11          for (i=0; i<=n; i++)
(gdb) info break
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08048411 in foo at bugging.c:9
        breakpoint already hit 1 time
(gdb) p sum
$4 = -136158422
(gdb) p i
$5 = 1
(gdb)
$6 = 1
(gdb) n
13              sum = sum+i;
(gdb) p i
$7 = 0
(gdb)
$8 = 0
(gdb) n
11          for (i=0; i<=n; i++)
(gdb) p i
$9 = 0
(gdb) n
13              sum = sum+i;
(gdb) p i
$10 = 1
(gdb) n
11          for (i=0; i<=n; i++)
(gdb) p i
$11 = 1
(gdb) n
13              sum = sum+i;
(gdb) n
11          for (i=0; i<=n; i++)
(gdb) n
13              sum = sum+i;
(gdb) p i
$12 = 3
(gdb) p sum
$13 = -136158419
(gdb) finish
Run till exit from #0  foo (n=100) at bugging.c:13
0x08048458 in main (argc=1, argv=0xffffd684) at bugging.c:24
24          result = foo(N);
Value returned is $14 = -136153372
(gdb) quit<-------------------- quit退出调试指令

经过调试发行,sum的初值是一个随机数,未初始化就使用是常见的低级错误;

此处只要,在sum处定义是赋值初值0;即可修复bug!


其他常用的gdb指令

(gdb) bt        <--------------------- 查看函数堆栈。
#0  func (n=250) at tst.c:5
#1  0x080484e4 in main () at tst.c:24
#2  0x400409ed in __libc_start_main () from /lib/libc.so.6
(gdb) finish    <--------------------- 退出函数。
Run till exit from #0  func (n=250) at tst.c:5
0x080484e4 in main () at tst.c:24
24              printf("result[1-250] = %d \n", func(250) );
Value returned is $6 = 31375
(gdb) c     <--------------------- 继续运行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GDB调试 小结 的相关文章

  • 在 Linux 上以编程方式为 gdb 在 C 或 C++ 代码中设置断点

    如何以编程方式在 C 或 C 代码中设置适用于 Linux 上的 gdb 的断点 I e int main int argc char argv set breakpoint here int a 3 a In gdb gt print a
  • gdb print :执行的每个语句的行号

    我有一个确定性的 halting 程序与no IO 我想要使用 gdb 运行并让它打印执行的每个 c 语句 例如文件名 行号
  • 如何在使用 GDB 遍历代码时禁用 C++ 模板中的单步执行?

    我试图使用 GDB 遍历代码 而 GDB 总是尝试显示 C 模板源代码 这使得调试不方便并且浪费了我很多时间 GDB 尝试介入该函数 当它找不到实现模板的文件时 它会显示错误 或者它会跳转到我不想看到的模板代码 我找不到如何禁用显示 单步进
  • 在 gdb 中设置应用程序关联

    有没有一种简单的方法可以设置我正在调试的应用程序的亲和力 而无需将 gdb 锁定到同一核心 我问的原因是应用程序以实时优先级运行 并且需要在单核上运行 目前我使用这个命令行 taskset c 3 gdbserver 1234 app ou
  • GDB 函数参数上的条件中断

    我想在函数参数大于某个值时设置断点 下面的虚拟代码 int main void uint64 t num 123456 uint64 t x 847534 uint64 t other num x x num other stuff her
  • 有没有办法在 gdb 中设置一个以调用堆栈为条件的断点?

    我正在 Linux 上的 gdb 7 1 中调试 C 我有一个函数a 代码中很多地方都会调用它 我想在其中设置一个断点 但前提是它是从b 有什么办法可以做到吗 有没有办法做到这一点 只有当b 被叫自c 等等无穷无尽 Update 现在有一个
  • dprintf 与 break + 命令 + continue 之间有什么区别?

    例如 dprintf main hello n run 生成与以下内容相同的输出 break main commands silent printf hello n continue end run 使用是否有显着的优势dprintf ov
  • 在 GDB 中显示结构体值

    在 GDB 中 给定一个指向结构体的变量 print将显示原始指针值并x将显示指向的原始字节 有什么方法可以显示指向该结构的数据 即字段及其值的列表 print variable 如果这样做 它将在 GDB 中显示该变量的值 您还可以选择显
  • 使用 gdb 调试反汇编库

    在Linux和Mac OS X中可以使用strapi和next来调试应用程序而无需调试信息 在 Mac OS X 上 gdb 显示在库内部调用的函数 尽管有时会在每个 stepi 指令中推进多个汇编程序指令 在 Linux 上 当我进入动态
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • gdb 不会从外部架构读取核心文件

    我正在尝试在 Linux 桌面上读取 ARM 核心文件 但似乎无法找出我的核心文件 有什么方法可以指示 gdb 我的核心文件是什么类型吗 file daemon daemon ELF 32 bit LSB executable ARM ve
  • 如何将整个 GDB 会话转储到文件中,包括我输入的命令及其输出?

    在 bash 中 我可以使用script命令 它将 shell 上显示的所有内容转储到文件中 包括 键入的命令 PS1 line 命令的 stdout 和 stderr gdb 中的等效项是什么 我试着跑shell script从 GDB
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • gdb 声称它不知道如何运行

    我在 Mac Pro 上的 Mac OS X 10 6 6 上使用 Xcode 3 2 3 来构建 GrowlTunes 的修订版 5fd480ef577f咆哮开发存储库 http growl info hg growl developme
  • 评估 gdb 中的变量/函数

    我有以下代码 char seg mmap 0 printf seg x n seg 该程序打印seg b7ffd000 而在 gdb 中 对于相同的执行 当使用p x seg 它打印 2 0x0 我在这里很困惑 这不是同一个var吗seg
  • GDB命令了解程序是否正在运行或停止

    我正在尝试自动化 GDB 调试会话 我想知道 GDB 中是否有任何命令或任何其他方式可以帮助我知道程序是否正在运行或停止 Use gdb selected inferior threads 0 is running 来自 GDB Pytho
  • 内存转储格式类似于 gdb 中的 xxd

    我正在尝试检查一个缓冲区 其中包含二进制格式的消息 但也包含字符串数据 作为示例 我正在使用以下 C 代码 int main void char buf 100 x01 x02 x03 x04String Data xAA xBB xCC
  • 要让 DDD 在 XP 上正常运行,Cygwin 的最低安装量是多少?

    我在 Windows XP 上使用 Strawberry Perl 附带的 MinGW 中的 gcc 我想要ddd http www gnu org software ddd 数据显示调试器 也是如此 但显然在 Windows 上获得 dd

随机推荐

  • 直接上干货!为什么Flutter能最好地改变移动开发?成功拿下大厂offer

    前言 这里整理的是一些与技术没有直接关系的面试题 xff0c 但是能够考察你的综合水平 xff0c 所以不要以为不是技术问题 xff0c 就不看 xff0c 往往有时候就是这样一些细节的题目被忽视 xff0c 而错过了一次次面试机会 想要成
  • Gson 用户指南(中文)

    整体概括 Gson 是一个将Java对象转换成Json字符串 xff0c 将Json字符串转换陈成Java对象的工具库 Gson能够处理任何类型的Java对象 xff0c 甚至包括那些你没有源代码的Java类 不了解对象的属性 Gson能干
  • shell脚本编程

    导语 xff1a shell 就是一个用户跟操作系统之间的一个命令解释器 Linux Shell 种类非常多 xff0c 不同的 Shell 语言的语法有所不同 xff0c 所以不能交换使用 最常用的 shell 是 Bash xff0c
  • 认识函数strok()--eg.分解保存读到的IP配置

    strtok 函数详解 xff01 1 定义 分解字符串为一组字符串 s为要分解的字符 xff0c delim为分隔符字符 xff08 如果传入字符串 xff0c 则传入的字符串中每个字符均为分割符 xff09 首次调用时 xff0c s指
  • Win10 Ubuntu子系统(内嵌ubuntu18.04)运行32bit Linux原生程序 解决Exec format error错误

    一 缘由 电脑重装后 xff0c 重装arm板的开发环境 xff0c win10有内嵌linux环境非常好用 xff0c 就用上了 安装正常流程进行安装 xff1a 1 下载压缩包文件 xff1a arm none linux gnueab
  • eclisp安装 过程 问题 小结

    安装过程 1 下载 安装eclisp xff0c 根据自己电脑版本 xff0c 下载对应版本 jdk版本和对应的eclise版本 xff08 64位 jdk对应64位的eclise xff0c 很关键 xff01 xff09 java jd
  • shell-服务监控 系统检查脚本 小结

    告警监控服务的要点 xff1a 查看某个进场是否启动的方式 xff1a 举例子 xff1a 案例 磁盘报警高级脚本 脚本分析 xff1a 1 磁盘达到85 发送报警邮件 2 发送邮件命令格式 3 多个报警设置 4 把分区的信息写入文件 Ma
  • Linux环境下对Cmake的版本快速更新

    本文将介绍一种在Ubuntu系统下快速升级CMake到指定版本的方法 之前找了很多方法 xff0c 要么需要删除原来的版本 xff0c 如果安装不成功会非常危险 xff0c 之前的编译环境都没了 另外就是ppa的更新 xff0c 我试了也不
  • APDU指令返回码及其代表含义

    APDU指令返回码及其代表含义 9000 正常 成功执行 6200 警告 信息未提供 6281 警告 回送数据可能出错 6282 警告 文件长度小于Le 6283 警告 选中的文件无效 6284 警告 FCI格式与P2指定的不符 6300
  • Source Insight4 常用设置

    1 Source Insight 简介 Source Insight 是一个面向软件开发的代码编辑器和浏览器 xff0c 它拥有内置的对 C C 43 43 C 和 Java 等源码的分析 xff0c 创建并动态维护符号数据库 xff0c
  • git安装包 阿里镜像-git-for-windows' is not a git command解决方法

    更新git版本时候 xff0c 好多时候使用 git update git update git for windows 命令时 xff0c 会提示 xff1a git 39 update 39 is not a git command g
  • diskgenius 操作sd卡问题 内存变小 合并错误 盘符消失

    SD卡用着用着 xff0c 内存容量就变小 原本16g现在不到8个G 使用 使用本软件可以将硬盘上的空闲区域分配给现有分区 xff0c 调整过程不会影响现有数据 本功能既可以把空闲空间合并到相邻的分区 xff0c 也可以合并到其他不相邻的分
  • vtk 提取等值面并显示

    marchingcube是提取等值面比较通用的算法 xff0c 本文利用vtk 的marching cube接口提取等值面 xff0c 并通过其绘制管线把等值面绘制出来 其原理请参考下文 xff1a 1 等值面的定义及其三角面片近似 等值面
  • curl库函数 说明

    目录索引 xff1a 一 LibCurl基本编程框架 libcurl是一个跨平台的网络协议库 xff0c 支持http https ftp gopher telnet dict file 和ldap 协议 libcurl同样支持HTTPS证
  • 10大经典排序算法-已经亲自验证

    10大经典排序 参考书籍 王道 数据结构第8章节 算法代码在Visio Stdio 2019验证过 xff01 根据操作方式可分5类 xff1a 插入排序 xff0c 交换排序 xff0c 选择排序 xff0c 归并和基数排序 其中 xff
  • 线性表--顺序表、单链表、双链表 总结

    线性表 顺序表 单链表 双链表 基础操作总结 函数 xff1a 王道 数据结构 已在Visio Stdio 2019验证成功 xff01 顺序表插入 删除 查找 单链表的头插法 尾插法 xff0c 按值 按序查找 xff0c 插入 删除 双
  • 串的模式识别和kmp算法

    串的简单模式匹配 与 KMP 获取next数组 参考书籍 王道 数据结构 代码验证软件 xff1a vs2019 include lt iostream gt typedef char SString 暴力比对 S abcabaaabaab
  • 二叉树和二叉排序树的操作

    二叉树和二叉排序树的操作 参考书籍 王道 书籍结构 代码已在vs2019验证过 1 二叉树的遍历 二叉树的建树 xff08 层次建树 xff09 xff0c 前序 中序 后序遍历 中序非递归遍历 层次遍历 include lt iostre
  • 图的遍历和相关操作

    图的遍历和相关操作 参考书籍 xff1a 王道 数据结构 代码在vs2019验证过 xff01 图的创建 xff0c 打印 xff0c 广度优先遍历 xff0c 深度优先遍历 测试代码 xff1a include lt stdio h gt
  • GDB调试 小结

    本文介绍使用GDB进行C调试 参考 xff1a 用gdb调试程序笔记 以段错误 Segmental fault 为例 GDB操作基本命令 1 编写调试测试代码如下 bugging c 1到100的求和函数 xff0c 代码调试 buggin