【Linux C】GCC编译 && GDB调试 从入门到放弃 (gcc调试选项详解、gdb调试、条件断点、远程调试、脚本化调试)(二)

简介: 阅读本文可能需要一些基础,比如:C语言基础、Linux基础操作、vim、防火墙等。篇幅有限,本文讲的“比较浅显”。通过本文你将学会:gcc编译gdb调试

2.22 运行时表达式计算

在调试过程中,可能需要计算一些表达式的值,以便更好地理解程序状态。GDB提供了print或p命令来评估表达式。例如,p variable将显示变量的值,而p func(5)将计算函数func在参数5上的返回值。

5cfd7ffb35b8a0737e73d9ae1a929a18_e5ac91726e4745db9421ebef49956580.png

2.23 显示调试状态信息:info命令

info命令是GDB调试器中的一个命令,用于显示当前调试状态的信息。例如:

  • info args:显示函数的参数列表(运行到一个函数时使用)。
  • info locals:显示当前函数的局部变量。
  • info registers:显示寄存器的值(info r)。
  • info threads:显示当前线程的列表。
  • info signals:显示当前进程接收到的信号。

2.24 追踪执行流程

GDB允许追踪程序的执行流程,以便更好地理解代码中的控制流。通过命令step,可以逐语句地执行程序,并进入函数调用。使用next命令,可以跳过函数调用,直接执行下一条语句。而finish命令则会执行当前函数的剩余部分,并返回到调用该函数的位置。


2.25 观察点

有时,希望在变量发生更改时自动停止程序的执行。GDB的观察点(watchpoint)功能可以帮助实现这一目标。通过watch命令,可以设置观察点来监视变量的值。一旦变量的值发生更改,程序就会停止执行,让我们能够进一步分析问题。


2.26远程调试

恰好我有2台服务器,就不用windows连接了(windows可以在VS code中安装插件使用gdb,或者使用MinGW安装)。


3d2dd4d4a458d7d9a2d8112ab8f54079_e89ac4f6881d423c852ec570cb8b9eea.png

3d2dd4d4a458d7d9a2d8112ab8f54079_e89ac4f6881d423c852ec570cb8b9eea.png

(1)介绍

GDB提供了远程调试功能,允许开发人员在一个计算机上调试运行在另一个计算机上的程序。这对于开发嵌入式系统或远程服务器应用程序非常有用。下面是对GDB远程调试的详细介绍:


1.远程调试设置:

在进行远程调试之前,需要在目标计算机上运行调试服务器。调试服务器是一个在目标计算机上运行的程序,它与GDB建立通信,允许GDB远程控制和调试目标程序。通常,目标计算机上的调试服务器是由调试目标平台的供应商提供的。


2.连接到远程目标:

在本地计算机上,可以使用以下命令将GDB连接到远程目标:

target remote <hostname>:<port>

其中,<hostname>是远程目标计算机的主机名或IP地址,<port>是远程调试服务器的端口号。通过这个命令,GDB将建立与远程目标的连接。


3.远程调试命令:

一旦与远程目标建立连接,就可以使用GDB的标准调试命令来进行远程调试。例如,可以设置断点、运行程序、查看变量和回溯调用栈等。GDB会将调试命令发送到远程调试服务器,服务器会执行相应的操作,并将结果传递回GDB。


4.与本地调试的区别:

远程调试与本地调试类似,但存在一些区别。在远程调试中,由于目标程序在远程计算机上执行,因此调试服务器负责处理与目标程序的通信和控制。GDB作为客户端与调试服务器进行通信,将调试命令发送到服务器并接收服务器的响应。


5.注意事项:

远程调试需要保证本地计算机和远程目标计算机之间的网络连接正常。

调试服务器的配置和设置可能会因目标平台和调试工具的不同而有所不同,需要按照供应商的说明进行正确设置。

可能需要在防火墙或网络设备上打开相应的端口,以允许GDB与远程调试服务器进行通信。

远程调试是一个非常有用的工具,它使开发人员能够在实际运行环境中调试程序,更好地理解和解决问题。通过使用GDB的远程调试功能,开发人员可以在嵌入式系统、远程服务器或其他远程目标上进行高效的调试和分析,加快故障排除和开发过程。


(2)实操

调试服务器防火墙放行端口,我使用端口7865来远程调试;

启动调试服务器,在远程服务器上运行调试服务器:

gdbserver :7865 ./exp

a0cf4f1da8c1e3f0e6cde54fd2fdb0b0_3fd8d9964869464ea4d25c1c2ffa5ff7.png

3.本地计算机连接调试服务器:
先进入gdb:

gdb

连接远程目标:

target remote xxx.xxx.xxx.xxx:7865

3bb498bc7498eaa5bee0caec86d119f2_9ed832a7c7dd46e9821b45957e0b140e.png

4.开始调试:

8c5f5adecf6f5cb60e687ca42601976f_8c64c764977d4b1c9a5794d6c48d2d3e.png

5.退出:本地gdb退出时,远程也会退出

2.27 调试核心转储文件

当程序崩溃或出现错误时,GDB可以加载核心转储文件以进行调试。


核心转储文件是在程序异常终止时生成的内存映像,其中包含了有关程序状态的详细信息。通过core <corefile>命令,我们可以加载核心转储文件并对程序进行调试。


2.28 GDB脚本化调试

GDB脚本测试是使用GDB自动化脚本来执行一系列调试操作和断言,以验证程序的行为和正确性。


这些脚本可以包含GDB命令和Python脚本,用于自动化调试流程和执行复杂的测试场景。


下面是一个简单的示例,演示如何编写和运行GDB脚本测试:


1.创建测试脚本文件:

创建一个新的文本文件,例如test_exp.gdb,并在文件中编写GDB脚本。脚本可以包含GDB命令、Python脚本和断言语句。例如,以下是一个简单的测试脚本示例:

# test_script.gdb
file exp
break main
info b
run
print max(10,20)
quit

2.运行测试脚本:

在终端中运行GDB,并使用-x选项指定测试脚本文件的路径来执行测试。例如,使用以下命令运行测试脚本:

$ gdb -x test_exp.gdb

d0c8cb81ba142f27fd19fb4f0157bc72_eb4729a4aacc45b8b2f02a4fa3b46b18.png

源程序:

#include<stdio.h>
int max(int a,int b){
  return a>b? a:b;
}
int main()
{
  int i=0;
  for(i=0;i<5;i++){
    printf("* * *\n");
  }
  printf("%d is bigger between %d and %d\n",5,4,max(5,4));  
  puts("Done\n"); 
  return 0;
}


相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
8月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
缓存 NoSQL Linux
Linux调试
本文介绍了Linux调试、性能分析和追踪的培训资料,涵盖调试、性能分析和追踪的基础知识及常用工具。
786 63
Linux调试
|
9月前
|
Unix Linux Shell
Linux新手入门手册
在Linux或类Unix系统中,掌握一系列基础命令和快捷键是提升工作效率的关键。这些工具和技巧不仅能帮助用户更高效地管理系统,还能在日常使用中带来极大的便利。以下是对这些基础操作与快捷键的详细解析大全。
176 9
|
11月前
|
存储 NoSQL Linux
linux之core文件如何查看和调试
通过设置和生成 core 文件,可以在程序崩溃时获取详细的调试信息。结合 GDB 等调试工具,可以深入分析 core 文件,找到程序崩溃的具体原因,并进行相应的修复。掌握这些调试技巧,对于提高程序的稳定性和可靠性具有重要意义。
5348 6
|
11月前
|
运维 监控 Linux
BPF及Linux性能调试探索初探
BPF技术从最初的网络数据包过滤发展为强大的系统性能优化工具,无需修改内核代码即可实现实时监控、动态调整和精确分析。本文深入探讨BPF在Linux性能调试中的应用,介绍bpftune和BPF-tools等工具,并通过具体案例展示其优化效果。
506 14
|
12月前
|
NoSQL 编译器 C语言
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。高级技巧包括内存检查、性能分析和符号调试。通过实践案例学习如何有效定位和解决问题,同时注意保持耐心、合理利用工具、记录过程并避免过度调试,以提高编程能力和开发效率。
389 1
|
Unix Linux Shell
linux入门!
本文档介绍了Linux系统入门的基础知识,包括操作系统概述、CentOS系统的安装与远程连接、文件操作、目录结构、用户和用户组管理、权限管理、Shell基础、输入输出、压缩打包、文件传输、软件安装、文件查找、进程管理、定时任务和服务管理等内容。重点讲解了常见的命令和操作技巧,帮助初学者快速掌握Linux系统的基本使用方法。
731 3
|
存储 数据可视化 Linux
Linux 基础入门
Linux 基础入门
109 0
|
2月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
421 1
二、Linux文本处理与文件操作核心命令
|
2月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
291 137