【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
相关文章
|
2月前
|
Linux 编译器 C语言
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
|
4月前
|
Linux C语言
成功解决 在Linux CentOS 7 中安装gcc
这篇文章介绍了如何在Linux CentOS 7系统中安装gcc (g++) 8工具集。由于CentOS 7默认的gcc版本是4.8,而这个版本与Qt 5.14、Qt 5.15或更高版本不兼容,可能会导致编译时出现系统头文件错误。文章中提到,即使在项目配置中添加了`CONFIG+=c++11`,如果仍然报错,那么很可能是gcc版本的问题。为了解决这个问题,文章提供了使用CentOS的Software Collections (scl)来安装更新版本的gcc的步骤。
成功解决 在Linux CentOS 7 中安装gcc
|
4月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
71 10
|
3月前
|
Linux 编译器 C语言
Linux内核对GCC版本的检测
Linux内核对GCC版本的检测
|
4月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
157 3
|
4月前
|
NoSQL Linux 编译器
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
如何配置环境并使用QEMU虚拟机结合GDB进行Linux内核代码的断点调试,包括安装QEMU、交叉编译工具链,编译内核以及通过GDB远程连接进行调试的详细步骤。
207 0
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
|
4月前
|
Java Linux 编译器
【Linux】gcc简介+编译过程
【Linux】gcc简介+编译过程
128 0
|
6月前
|
Java 编译器 Linux
程序技术好文:详解Linux安装GCC方法
程序技术好文:详解Linux安装GCC方法
213 0
|
6月前
|
NoSQL 编译器 Linux
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
105 0
|
1月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
110 8