【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
相关文章
|
1月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
83 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
1月前
|
Linux 编译器 C语言
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
|
18天前
|
Linux
Linux - 如何编译源码安装软件
源码编译安装通常包括三个步骤:1) `./configure` 检测平台特征和依赖项,生成 Makefile;2) `make` 编译源码,生成可执行文件;3) `make install` 将可执行文件安装到指定目录并配置环境变量。
32 0
|
1月前
|
Linux 编译器 C语言
Linux c/c++之多文档编译
这篇文章介绍了在Linux操作系统下使用gcc编译器进行C/C++多文件编译的方法和步骤。
39 0
Linux c/c++之多文档编译
|
1月前
|
Linux 开发工具
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
|
6月前
|
NoSQL 搜索推荐 openCL
【C/C++ 调试 GDB指南 】gdb调试基本操作
【C/C++ 调试 GDB指南 】gdb调试基本操作
379 2
|
3月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
62 10
|
3月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
|
3月前
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
103 0
|
5月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
42 1