Linux上GNU调试器入门:速成教程
对程序员和安全研究人员来说,安全性是一项不可或缺的技能。对调试有很强的掌握,可以让您在较低级别上理解可执行文件,并捕捉任何潜在的错误。
GNU调试器或GDB,是一个永恒的调试工具,多年来一直被程序员所依赖。以下是如何在Linux上使用GDB。
准备示例程序
为了探索GDB的特性,您需要一个可执行文件来进行实验。为了演示,您将在一个键检查程序上运行GDB,一次有源代码和调试符号可用,一次没有源代码,一次在一个简单的多线程程序上运行GDB,该程序将消息打印到屏幕上,这两个程序都是用C编写的,并使用GCC(GNU C编译器)编译。
你可以
使用任何其他C编译器
但千万别去掉二进制文件
你很可能会在自己的程序上运行GDB。因此,请确保使用gcc的—g标志来编译它们,以启用调试符号。
如果不存在调试符号,并且使用严重剥离的二进制文件,您将不得不调试程序的反汇编。这将要求您对汇编语言和内存分配在Linux上的工作方式有很强的掌握,以了解堆栈和寄存器中的数据。
在GDB中运行程序
在GDB中你可以用几种方式运行一个程序。要么输入gdb program,一旦加载,输入run。<>或者启动gdb,然后使用file program命令,将二进制文件加载到gdb中,然后使用run命令执行它。<>
如果您的程序需要命令行参数才能正常运行,请确保在程序名后添加参数。下面是将程序加载到gdb并使用参数执行它的语法:
gdb程序运行参数<><>
或者:
gdbfile program run args<><>
使用GDB设置断点
调试中的断点是在代码中手动设置的硬停止,当程序到达断点时会停止执行流。通过设置断点,您可以单步执行代码并检查执行的每个阶段如何影响数据和变量。
在GDB中,当您使用调试符号调试程序时,您可以通过函数名设置断点,也可以根据行号设置断点。下面是语法:
中断主干中断47
若要查看当前调试会话中的所有断点,请键入:
信息断点
要删除特定断点或多个断点,请键入以下内容:
删除2删除3—5
GDB还允许您设置条件断点,这意味着程序只有在执行过程中满足特定条件时才会停止。它可能是变量值的变化,或者失败的函数调用,或者,任何你想要的。下面是设置条件断点的语法:
如果n == 2,则中断位置<>
如果您想在遇到断点后继续执行程序,请键入continue命令:
继续
步进代码
单步执行代码对于了解程序如何处理数据至关重要。通过单步执行程序中的各种函数并检查数据状态,您可以更好地了解程序如何实现您用代码编写的逻辑。
它还可以帮助您检测崩溃的根源,并以外科手术的精确度研究程序行为,因为您能够按照自己的意愿逐步遍历每一行代码。在GDB中,您可以通过三种主要方式逐步执行代码:
检查变量
当您逐步执行代码时,您会希望检查变量的值,以了解程序逻辑如何改变它们。下面是查看GDB中变量值的语法:
打印变量<>
如果您希望每次更新变量时都打印变量值的更改,则应使用DISPLAY命令。当您想要跟踪和打印循环中变量的值时,这尤其有用:
显示变量<>
设置观察点
观察点和条件断点密切相关,因为它们都响应程序中的更改。监视点用于跟踪代码中数据的更改。例如,您可能希望每当变量的值发生变化时程序中断。以下是如何使用GDB:
Watch<;Variable_Name>;
使用GDB的线程专用器
GDB允许您在使用多线程程序时执行线程特定的调试。为了演示,我们将使用一个简单的C程序,它使用四个线程来打印每个线程的消息。
要查看程序中当前生成的线程,请使用info命令:
信息线程
若要使用特定线程,可以使用其索引号从列表中选择该线程。例如:
线程2
选择线程后,您可以使用步骤、下一步和finish命令逐步执行它的执行流程,如上所述。
使用GDB远程访问
您还可以远程调试位于不同系统上的程序。为此,您需要在目标计算机上设置gdbserver。您可以使用发行版的默认包管理器或系统上安装的其他包管理器轻松安装它。
例如,要在Ubuntu或Debian系统上安装gdbserver,请使用APT:
Sudo apt安装gdb服务器
安装完毕后,移到二进制文件夹中并运行以下命令来启动gdbserver:
gdbserver ip:端口二进制<><><>
gdbserver应该返回输出,说明它正在运行并侦听您定义的端口。现在,在客户端机器上,启动GDB,然后使用target命令连接到远程服务器:
目标远程服务器_ip:端口<><>
编写GDB数据库实现自动数据库数据库
GDB允许程序员编写GDB脚本,自动执行GDB命令。当您尝试多次调试同一部分代码时,这将非常有帮助。您可以使用GDB脚本来自动化整个过程,而不必在每次加载二进制文件时设置断点、逐步执行代码和打印变量值。
这里有一个例子:
SET LOGGING ENABLED START LOGGING FILE SAMPLE。EXPORATION Main命令1;回溯命令;打印N;继续;退出
在上面的脚本中,您告诉GDB启用日志并将日志保存到名为sample.out的文件中,然后在main函数处设置断点。
对于1号断点,在本例中是函数Main处的断点,运行以下命令:Backtrace、Print、Continue。基本上,gdb将首先运行回溯,然后打印变量“N”的值,继续执行,最后退出。
要执行此脚本,请使用用途:
gdb—x脚本二进制<><>
现在您知道如何使用GDB调试您的程序了!
调试是一项必不可少的技能,而使用GDB进行调试是一项很好的技能。GDB的不同特性,如遍历代码、设置断点、选择性线程调试等,使其在Linux上调试二进制文件时成为一个强大的工具。
如果您希望在Windows上调试应用程序,您可以考虑了解更多有关Windows本地调试器WinDBG的信息。
延伸阅读:
Windows 记事本终于获得自动更正和拼写检查功能
在首次引入 Windows 大约 41 年后,记事本终于更新了自动更正和拼写检查功能。这家科技巨头于今年 3 月推出了拼...
Ubuntu 的 apt 和 apt-get 命令有什么区别?
在Ubuntu及其他基于Debian的Linux发行版中,软件包管理是系统维护的一个重要方面。apt和apt-get是两...
Ubuntu远程桌面:如何设置和连接
远程桌面是一种允许您远程接管和使用另一台计算机的服务。在Ubuntu中,可以在图形客户端机器上启用它来控制主机。此功能对...
苹果公司在“放开”iPad活动上宣布的4款产品(以及你错过了什么)
利用当天的视频 苹果2024年5月的“放开”活动标志着iPad系列的一个重要里程碑,该公司推出了自成立以来最重大的升级。...
将照片从iPhone传输到iPhone的8种快速方法
已升级到新iPhone,是否要从旧设备中移动所有照片?或者你只是想从别人的iPhone上转移照片?以下是在两部iPhon...