在使用 gdb (GNU Debugger) 进行调试时,有一些非常实用的命令,可以帮助你更高效地进行程序的调试。以下是一些常用的 gdb 命令:

1. 基本命令

2. 查看和打印变量

3. 调试信息

4. 内存和堆栈

5. 条件断点

6. 程序运行控制

7. 调试共享库

8. 其它

9. 调试多线程程序


附加:

进入 gdb (GNU 调试器)有多种方式,主要取决于你的目标和程序的调试方式。以下是几种常见的进入 gdb 的方式:

  1. 从命令行启动 gdb 调试已编译的程序

最常见的方式是直接在终端中启动 gdb,并加载要调试的程序。

gdb

•	<executable-file> 是你要调试的程序的可执行文件路径。
•	例如,如果你有一个名为 a.out 的程序,可以使用以下命令:

gdb a.out

启动 gdb 后,程序会暂停在程序的入口处,你可以使用 run 或 r 命令来启动程序。

  1. 通过调试时指定命令行参数

如果你需要给程序传递命令行参数,可以在进入 gdb 后通过 set args 命令指定参数。例如:

gdb a.out
(gdb) set args arg1 arg2
(gdb) run

这会将 arg1 和 arg2 作为命令行参数传递给 a.out。

  1. 直接从命令行运行程序并进入 gdb

你也可以直接在命令行中使用 gdb 启动程序并直接进入调试模式,无需手动进入 gdb 后再输入 run 命令:

gdb --args

例如:

gdb --args ./a.out arg1 arg2

此命令会启动 gdb 并加载 a.out 可执行文件,并传递命令行参数 arg1 和 arg2。

  1. 在运行时附加到已运行的程序

如果你已经有一个正在运行的程序,并希望在其运行时附加调试,可以使用 gdb 附加到该进程:

gdb attach

•	<pid> 是你要调试的进程的进程 ID。
•	你可以通过命令 ps aux | grep <program-name> 查找正在运行的进程的 PID。
  1. 远程调试

如果你需要调试远程主机上的程序,可以使用 gdb 的远程调试功能。通常这涉及到在目标机器上运行 gdbserver,然后在本地机器上通过 gdb 连接。
1. 在目标机器上启动 gdbserver:

gdbserver :

2.	在本地机器上使用 gdb 连接到远程目标:

gdb
(gdb) target remote :

  1. 使用 core dump 文件调试

如果程序崩溃并生成了 core dump 文件,你可以通过 gdb 来加载这个文件进行分析。假设 core 文件和程序名是 a.out:

gdb a.out core

这将加载崩溃时的内存状态,并允许你查看崩溃原因。

  1. 在启动时加载特定的符号文件

如果你没有源代码但有调试符号文件(.debug 文件),可以通过以下命令启动 gdb 并加载符号文件:

gdb

例如:

gdb myprogram /path/to/myprogram.debug

  1. 在启动时执行脚本

你还可以在启动 gdb 时指定一个脚本,自动执行一系列调试命令。例如:

gdb -x script.gdb

其中,script.gdb 是一个包含调试命令的脚本文件。这样可以在启动时自动设置断点、变量、条件等。


gdb 的 -p 选项是用于 附加到一个正在运行的进程 进行调试的方式。使用 -p 参数,你可以将 gdb 连接到一个指定的进程 ID (PID),从而在该进程正在运行时对其进行调试。

gdb -p 命令

gdb -p 用于将 gdb 附加到一个已经运行的进程。通过这个命令,gdb 会连接到指定的进程,并允许你在不中断进程执行的情况下进行调试。

使用方法
1. 首先,找出你想要调试的进程 ID (PID),可以使用命令如 ps 或 top 来列出正在运行的进程及其 PID。例如:

ps aux | grep <your_program>

2.	然后使用 gdb -p 命令附加到该进程。例如,假设 PID 是 12345:

gdb -p 12345

这会启动 gdb 并将其附加到 PID 为 12345 的进程上。

附加过程中的常见行为:
• 进程暂停:当你附加到一个正在运行的进程时,进程会被暂停(即 gdb 会暂停进程的执行)。你需要手动使用 continue 命令继续执行进程。
• 调试操作:在附加到进程后,你可以像调试本地程序一样设置断点、查看变量、跟踪调用栈等。
• 信号处理:在一些系统中,附加进程时会发送信号给该进程(通常是 SIGSTOP),并且在开始调试之前需要恢复进程。

示例

假设你有一个名为 my_program 的程序正在运行,并且它的 PID 是 12345:
1. 启动 gdb 并附加到该进程:

gdb -p 12345

2.	一旦 gdb 连接到进程,进程会被暂停。你可以使用以下命令来调试:
•	continue (或 c):继续程序的执行。
•	backtrace (或 bt):查看调用栈。
•	info locals:查看局部变量。
3.	在调试完成后,退出 gdb 使用命令 quit,如果需要,可以继续让进程执行。

退出和恢复
• 当你通过 gdb 附加到进程并完成调试时,你可以使用 quit 命令退出 gdb。如果你希望在退出时让程序继续运行,可以使用:

(gdb) detach

这会让 gdb 从进程中分离,并允许该进程继续运行。

适用场景

gdb -p 特别适用于以下场景:
• 你希望调试一个已经在生产环境中运行的进程。
• 你想调试一个崩溃的进程或在死锁状态下的进程。
• 在远程调试时,目标程序已在目标主机上启动并运行。