目录

前文列表

程序编译流程与 GCC 编译器

C 语言编程 — 基本语法

C 语言编程 — 基本数据类型

C 语言编程 — 变量与常量

C 语言编程 — 运算符

C 语言编程 — 逻辑控制语句

C 语言编程 — 函数

C 语言编程 — 高级数据类型 — 指针

C 语言编程 — 高级数据类型 — 数组

C 语言编程 — 高级数据类型 — 字符串

C 语言编程 — 高级数据类型 — 枚举

C 语言编程 — 高级数据类型 — 结构体与位域

C 语言编程 — 高级数据类型 — 共用体

C 语言编程 — 高级数据类型 — void 类型

C 语言编程 — 数据类型的别名

C 语言编程 — 数据类型转换

C 语言编程 — 宏定义与预处理器指令

C 语言编程 — 异常处理

C 语言编程 — 头文件

C 语言编程 — 输入/输出与文件操作

C 语言编程 — 堆栈与内存管理

C 语言编程 — 指令行参数

代码调试

  • 断点:所谓断点(BreakPoint),可以理解为障碍物,人遇到障碍物不能行走,程序遇到断点就暂停执行。
  • 逐语句调试:逐语句,就是每次执行一行语句,如果碰到函数调用,它就会进入到函数里面。
  • 逐过程调试:逐过程,碰到函数时,不进入函数,把函数调用当成一条语句执行。
  • 跳出当前执行过程:跳出,是当你进入到函数内,跳出可以让你直接执行函数内剩余的语句,直到返回到该函数被调用时的后面的语句处。
  • 监视窗口:程序执行完某条语句时,使用监视窗口可以查看程序中变量的具体内容、程序中的内存状态、程序中的寄存器状态等。

GDB

GDB(GNU Debugger)包含在 GNU 的 GCC 开发套件中,是基于命令行的、功能强大的程序调试工具。对于一名 Linux 平台下工作的 C/C++ 程序员,GDB 是必不可少的工具。

安装

yum install gdb -y

GDB 主要能够帮忙我们完成下面四个方面的功能:

  1. 可以按照自定义的要求运行程序。
  2. 支持基于条件表达式的断点。
  3. 当程序被停住时,可以检查此时程序中所发生的事情。
  4. 动态的修改程序的执行环境。

程序的调试过程主要有:单步执行,跳入函数,跳出函数,设置断点,设置观察点,查看变量。

简单示例

$gdb programmer     # 启动 gdb
>break main # 设置断点
>run # 运行调试程序
>next # 单步调试
>print var1 # 打印变量值
>list # 显示当前调试处的源代码
>info b # 显示当前断点设置情况

启动 GDB

对 C/C++ 程序的调试,需要在编译前就加上 -g 选项。-g 选项的作用是在可执行文件中加入源文件信息,所以在调试时必须保证 gdb 能找到源文件。不使用 -g 的话将看不见程序的函数名和变量名,代替它们的全是运行时的内存地址。

  • DEBUG 模式编译
$ gcc -g main.c -o main
  • 调试执行文件:
$ gdb main
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-115.el7
Copyright (C) 2013 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-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/main...done.
(gdb)

NOTE:如果没有加 -g 进行编译的话,会出现错误。意思是没能从可执行文件中获得符号表(symbol table)信息,你可以使用 -se file 指令,从指定文件中读取符号表信息,并把它用在可执行文件中。

No symbol table is loaded.  Use the "file" command.
  • 调试服务程序:GDB 也可以用于调试服务程序,可以指定服务程序运行时的进程 ID。GBD 会自动 Attach 上去,并开启调试。此时,程序的执行文件应该已经被加入到 PATH 环境变量中。
$ gdb <program> <PID>

交互命令

启动了 GDB 后,就进入到指令行的交互模式,可以通过以下指令完成对程序的调试。

运行程序

  • run [arglist](r)运行程序:当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令。如果指定了 arglist,则作为参数运行程序。
  • set var 变量名=变量值:设置运行时参数。
  • continue(c)继续执行:到下一个断点处(或运行结束)。
  • next(n)单步执行:当遇到函数调用时,不会进入函数体。
  • step(s)单步执行:当遇到函数调用时,则进入函数。与 next 的主要区别是,step 遇到自定义函数后,会步进到函数中运行,而 next 则直接调用函数,不会进入到函数体内。
  • until:当你厌倦了在一个循环体内单步执行时,这个命令可以运行程序直到退出循环体。
  • until n:运行至 n 行,不仅仅用来跳出循环。
  • return:强制从当前函数返回。
  • finish:运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。
  • call 函数(参数):调用有效函数,并传入实参,如:call gdb_test(55)
  • Ctrl-C:在当前位置停止执行正在执行的程序,断点在当前行。
  • quit(q):退出 GDB 调试终端。
  • shell:使你能不离开 gdb 就执行 UNIX shell 命令。

暂停程序

在 GDB 中,程序有以下几种暂停方式:

  • 断点(BreakPoint)
  • 观察点(WatchPoint)
  • 捕捉点(CatchPoint)
  • 信号(Signals)
  • 线程停止(Thread Stops)

当已定义好的停止点没有用时,可以使用 delete、clear、disable、enable 这几个命令来进行维护。此外还有 ignore,可以指定程序运行时,忽略停止条件几次。

设置断点

  • break linenum(b n):在第 n 行处设置断点。
  • break [file:]function、break [file:]linenum:在指定源文件的指定函数或行号设置断点,e.g. b OAGUPDATE.cpp:578
  • b fn1 if a>b:设置条件断点。
  • txbreak:在当前函数的退出的点上设置一个临时的断点,只可使用一次。
  • info b :显示当前程序的断点设置情况。
  • delete n:删除第 n 个断点。
  • enable n:开启第 n 个断点。
  • clear n:清除第 n 行的断点。
  • delete breakpoints:清除所有断点。

设置观察点

观察点通常用来观察某个表达式的值是否变化了。如果有变化,马上停住程序。

  • watch:设置一个监视点,一旦被监视的表达式的数值改变了,停住程序。
  • rwatch:当表达式被读时,停住程序。
  • awatch:当表达式的值被读或被写时,停住程序。
  • info watchpoints:列出当前设置的所有观察点。

设置捕捉点

设置捕捉点来补捉程序运行时的一些事件,e.g. 载入共享库(动态链接库)或是 C++ 的异常。

  • catch:当时间发生时,停住程序。
  • tcatch:只生效一次的捕捉点。

Event 列表:

打印信息

  • list [linenum]/[function](l n/func):列出程序的源代码,默认每次显示 10 行。重复执行则输出下边的内容。
  • print(p):打印当前程序所有的有效表达式。
  • print func(x):将实参 x 传入并调用 func 函数。x 可以使一个数值,也可以是一个有效变量。
  • ptype:显示变量的类型。
  • display:在单步运行时非常有用,设置了一个表达式后,将在每次单步执行时,紧接着输出被设置的表达式及值。
  • display list:查看 display 索引。
  • undisplay:删除一个 display 设置的变量显示。
  • whatis :查询变量或函数。
  • info func: 查询函数。
  • info locals:显示当前堆栈页的所有变量。
  • bt:Backtrace,显示程序堆栈信息。

查询运行信息

  • where/bt:当前运行的堆栈列表。
  • bt backtrace:显示当前调用堆栈。
  • up/down:改变堆栈显示的深度。
  • set args:指定运行时的参数。
  • show args:查看设置好的参数。
  • info program:查看程序的是否在运行,进程号,被暂停的原因。

分割窗口

  • layout:分割窗口。
  • layout src:显示源代码窗口。
  • layout asm:显示反汇编窗口。
  • layout regs:显示源代码、反汇编、CPU 寄存器窗口。
  • layout split:显示源代码、反汇编窗口。
  • Ctrl + L:刷新窗口。

C 语言编程 — GDB 调试工具的更多相关文章

  1. linux 操作系统下c语言编程入门

    2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理  ...

  2. Linux下C语言编程基础学习记录

    VIM的基本使用  LINUX下C语言编程 用gcc命令编译运行C语言文件 预处理阶段:将*.c文件转化为*.i预处理过的C程序. 编译阶段:将*.i文件编译为汇编代码*.s文件. 汇编阶段:将*.s ...

  3. Linux基础与Linux下C语言编程基础

    Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...

  4. LINUX下C语言编程基础

    实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...

  5. 第二章 C语言编程实践

    上章回顾 宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法 第二章 第二章 C语言编程实践 C语言编程实践 预习检查 异或的运算符是什么 宏定义最主要的特点 ...

  6. Go语言编程 (许式伟 等 著)

    第1章 初识Go语言 1.1 语言简史 1.2 语言特性 1.2.1 自动垃圾回收 1.2.2 更丰富的内置类型 1.2.3 函数多返回值 1.2.4 错误处理 1.2.5 匿名函数和闭包 1.2.6 ...

  7. 【转】Linux基础与Linux下C语言编程基础

    原文:https://www.cnblogs.com/huyufeng/p/4841232.html ------------------------------------------------- ...

  8. GDB调试工具总结

    程序调试的基本思想是“分析现象->假设错误原因->产生新的现象去验证假设”这样一个循环过程,根据现象如何假设错误原因,以及如何设计新的现象去验证假设,需要非常严密的分析和思考.程序中除了一 ...

  9. 【Linux】GDB调试工具

    GDB调试工具 Linux中包含一个很强大的调试工具GDB(GNU Debuger),可以用它来调试C和C++程序. 一. GDB的主要功能有: 设置断点,当程序运行到断点处暂停 显示变量的值,可以打 ...

  10. linux下的C语言开发 GDB的例子

    在很多人的眼里,C语言和linux常常是分不开的.这其中的原因很多,其中最重要的一部分我认为是linux本身就是C语言的杰出作品.当然,linux操作系统本身对C语言的支持也是相当到位的.作为一个真正 ...

随机推荐

  1. #贪心#CF605A Sorting Railway Cars

    题目 一个长度为 \(n\) 的排列,每次可以将一个数移至开头或者结尾,问最少多少次使其升序排列 分析 让数字连续的情况尽量多才能让移出来的次数尽量少, 找到最长的数字连续段,若其长度为 \(len\ ...

  2. 浅谈OpenHarmony LiteOS-A内核之基础硬件——中断控制器GIC400

    一.前言 OpenAtom OpenHarmony(以下简称"OpenHarmony")采用多内核架构,支持Linux内核的标准系统.LiteOS-A的小型系统.LiteOS-M的 ...

  3. HMS Core Discovery第16期直播预告|与虎墩一起,玩转AI新“声”态

    [导读] 随着人工智能不断发展,机器学习技术也开始被广泛地应用到教育.金融.零售.交通.医疗等各个领域,给我们的生活带来巨大的便利.本期Discovery直播以<与虎墩一起,玩转AI新" ...

  4. 【Nano Framework ESP32 篇】刷入 nanoCLR 固件以及相关问题

    老周在几个世纪前曾写过树莓派相关的 iOT 水文,之所以没写 Nano Framework 相关的内容,是因为那时候这货还不成熟,可玩性不高.不过,这货现在已经相对完善,老周都把它用在项目上了--第一 ...

  5. c# .net缓存(旧)

    前言 是迁移以前的blog. 关于c# 缓存在web应用中的一个引导,能够建立起一个缓存的基本思路. System.Web.Caching 这个真的是老生常谈了,我们只需要key和iv,然后我们就可以 ...

  6. winform之在主窗体中不显示子窗体的菜单栏

    在MDi窗体嵌入子窗体后不显示菜单栏 背景: 由于之前做的一个程序的功能全部都是放在一个界面上的,有一个功能能够在数据库查询数据,并返回到界面上,数据量比较小的时候还好,但是数据量多了,导致它阻塞的其 ...

  7. MyBatis 核心配置讲解(上)

    大家好,我是王有志,一个分享硬核 Java 技术的互金摸鱼侠. 前两篇的文章中我们分别介绍了 MyBatis 和 MyBaits 的应用组成,到这里基础篇的内容就结束了. 从今天开始,我们正式进入 M ...

  8. 日志架构演进:从集中式到分布式的Kubernetes日志策略

    当我们没有使用云原生方案部署应用时采用的日志方案往往是 ELK 技术栈. 这套技术方案比较成熟,稳定性也很高,所以几乎成为了当时的标配. 可是随着我们使用 kubernetes 步入云原生的时代后, ...

  9. 跃居AppStore第一!X-Engine如何支撑钉钉数据量激增

    钉钉作为国内领先的企业IM工具,在中国有超过亿级别的用户.随着新型冠状病毒肺炎疫情的爆发,大量的企业员工选择了soho模式,企业办公协同工具的需求瞬间爆发. 钉钉作为中国企业办公IM的首选应用,不仅具 ...

  10. Kubernetes API 编程利器:Operator 和 Operator Framework

    本文整理自<CNCF x Alibaba 云原生技术公开课>第 24 讲,点击"阅读原文"直达课程页面. 关注"阿里巴巴云原生"公众号,回复关键词& ...