2.22 运行时表达式计算
在调试过程中,可能需要计算一些表达式的值,以便更好地理解程序状态。GDB提供了print或p命令来评估表达式。例如,p variable将显示变量的值,而p func(5)将计算函数func在参数5上的返回值。
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安装)。
(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
3.本地计算机连接调试服务器:
先进入gdb:
gdb
连接远程目标:
target remote xxx.xxx.xxx.xxx:7865
4.开始调试:
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
源程序:
#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; }