Linux 使用 GDB 进行调试的常用命令与技巧

GDB 调试的常用命令与技巧

    • 1. GDB 常用命令
      • 1.1 安装 GDB
      • 1.2 启动 GDB
      • 1.3 设置程序的参数
      • 1.4 设置断点
      • 1.5 启动程序并运行至断点
      • 1.6 执行一步
      • 1.7 打印变量值
      • 1.8 查看函数调用栈
    • 2. GDB 调试 Core 文件
      • 2.1 生成 Core 文件
      • 2.2 使用 GDB 调试 Core 文件
    • 3. GDB 调试正在运行的程序
      • 3.1 附加到正在运行的进程
      • 3.2 在进程中设置断点
      • 3.3 恢复程序执行

GDB(GNU Debugger)是一个功能强大的调试工具,可以帮助开发者在程序运行过程中查找和修复问题。本文将介绍如何使用 GDB 调试程序,包括常用命令、调试 core 文件和正在运行的程序。

1. GDB 常用命令

在使用 GDB 调试程序时,掌握一些常用命令非常重要。以下是一些基础命令和用法:

1.1 安装 GDB

在 Linux 系统中,使用以下命令安装 GDB:

yum -y install gdb

或者在 Ubuntu 系统中使用:

sudo apt-get install gdb

1.2 启动 GDB

要启动 GDB 并调试一个程序,可以使用以下命令:

gdb 目标程序

例如,调试一个名为 my_program 的程序:

gdb my_program

1.3 设置程序的参数

在 GDB 中,你可以使用 set args 来为程序设置命令行参数。例如:

set args 张三 西施 我是一只傻傻鸟

这将模拟命令行参数传递给程序。假设程序的命令行参数使用 argcargv 获取,执行程序时,它将使用这些参数。

1.4 设置断点

使用 break 或简称 b 命令设置断点。例如:

break 20

该命令会在程序的第 20 行设置一个断点。你也可以为函数名设置断点:

break main

1.5 启动程序并运行至断点

使用 run 或简称 r 来启动程序,程序会在设置的断点处停止:

run

如果程序没有遇到断点,它会直接运行至结束。

1.6 执行一步

使用 step 或简称 s 命令可以逐步执行当前语句,并且进入函数内部:

step

如果你只是希望跳过当前函数调用而不进入函数体,可以使用 next 或简称 n

1.7 打印变量值

要查看变量的当前值,可以使用 print 或简称 p 命令:

print variable_name

例如,查看变量 i 的值:

print i

1.8 查看函数调用栈

使用 bt(backtrace)命令查看当前的函数调用栈:

bt

2. GDB 调试 Core 文件

当程序崩溃时,系统可能会生成一个 core 文件,包含了程序的内存快照和崩溃时的状态信息。使用 GDB 可以帮助分析这些文件。

2.1 生成 Core 文件

在 Linux 中,可以通过 ulimit 命令设置生成 core 文件的最大大小:

ulimit -c unlimited

这将允许程序在崩溃时生成 core 文件。运行程序并发生崩溃后,可以使用以下命令:

gdb 程序名 core 文件名

例如,调试一个名为 my_program 的程序和它的 core 文件:

gdb my_program core

2.2 使用 GDB 调试 Core 文件

调试 core 文件时,首先可以使用 bt 命令查看函数调用栈,以便了解崩溃发生的位置:

bt

你还可以使用 print 命令查看崩溃时的变量值,以进一步分析问题所在。

3. GDB 调试正在运行的程序

GDB 也可以用于调试正在运行的程序。你可以附加到一个已经启动的进程,并实时调试它。

Linux 使用 GDB 进行调试的常用命令与技巧_第1张图片

3.1 附加到正在运行的进程

使用 attach 命令将 GDB 附加到一个正在运行的进程。例如,如果进程 ID 为 1234:

gdb
(gdb) attach 1234

这将使 GDB 附加到进程,接下来可以设置断点、查看变量等。

3.2 在进程中设置断点

在调试正在运行的程序时,你可以在进程中的特定位置设置断点。例如:

(gdb) break main

这会在程序的 main 函数处设置断点。

3.3 恢复程序执行

使用 continue 或简称 c 命令,可以恢复程序的执行,直到遇到下一个断点为止:

continue

你可能感兴趣的:(Linux网络,linux)