【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
相关文章
|
4天前
|
Linux 开发工具 C语言
Linux 安装 gcc 编译运行 C程序
Linux 安装 gcc 编译运行 C程序
22 0
|
4天前
|
Linux
Linux(5)WIFI/BT调试笔记
Linux(5)WIFI/BT调试笔记
21 0
|
25天前
|
Linux Shell
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
78 1
|
3天前
|
Linux 开发工具 Android开发
Docker系列(1)安装Linux系统编译Android源码
Docker系列(1)安装Linux系统编译Android源码
7 0
|
4天前
|
Linux Shell Android开发
自动化脚本之GPIO/LED相关适用于Android/Linux
自动化脚本之GPIO/LED相关适用于Android/Linux
13 0
|
4天前
|
Linux Android开发
Linux(6)CH9434 SPI调试笔记
Linux(6)CH9434 SPI调试笔记
13 0
|
24天前
|
安全 Linux
嵌入式Linux系统关闭串口调试信息的输出
嵌入式Linux系统关闭串口调试信息的输出
17 1
|
24天前
|
Ubuntu Unix Linux
【Linux/Ubuntu】Linux/Ubuntu运行python脚本
【Linux/Ubuntu】Linux/Ubuntu运行python脚本
|
25天前
|
Shell Linux
Linux的shell入门教程shell脚本入门教程
Linux的shell入门教程shell脚本入门教程
16 0
|
25天前
|
Linux Shell
Linux脚本获取输入参数判断文件还是文件路径
Linux脚本获取输入参数判断文件还是文件路径
12 4