# -Wl,-z,noexecstack 是一个选项,用于告诉链接器不在程序的栈上执行代码。这个选项可以提高程序的安全性,因为它可以防止栈溢出攻击。
栈溢出攻击是一种常见的攻击方式,攻击者通过向程序的栈中注入恶意代码来控制程序的执行流程。使用 -Wl,-z,noexecstack 选项可以防止这种攻击方式,因为它会禁止在程序的栈上执行代码。
# -Wl,-z,relro 一个选项,用于启用 RELRO(RELocation Read-Only)保护机制。这个选项可以提高程序的安全性,因为它可以防止一些针对程序的攻击,例如 GOT(Global Offset Table)覆盖攻击。
RELRO 保护机制是一种内存保护机制,它可以将程序的重定位表(Relocation Table)设置为只读模式,从而防止攻击者修改程序的重定位表。这个机制可以防止一些针对程序的攻击,例如 GOT 覆盖攻击。
# -Wl,-z,now 是一个选项,用于启用 NOW(No lazy symbol binding)保护机制。这个选项可以提高程序的安全性,因为它可以防止一些针对程序的攻击,例如 PLT(Procedure Linkage Table)覆盖攻击。
NOW 保护机制是一种内存保护机制,它可以在程序启动时立即解析所有的符号,从而防止攻击者修改程序的 PLT 表。这个机制可以防止一些针对程序的攻击,例如 PLT 覆盖攻击。
使用 -Wl,-z,now 选项可以启用 NOW 保护机制。
一、启动与退出
| 命令 | 说明 |
gdb ./program |
启动 GDB 并加载程序 |
gdb -p <pid> |
附加到正在运行的进程 |
quit或 q |
退出 GDB |
📌 二、断点管理
| 命令 | 说明 |
break main或 b main |
在 main函数处设断点 |
break file.c:123 |
在 file.c第 123 行设断点 |
break func if x==5 |
条件断点 |
info breakpoints或 i b |
查看所有断点 |
delete 1 |
删除编号为 1 的断点 |
clear |
清除当前行的断点 |
disable 1 |
禁用断点 1 |
enable 1 |
启用断点 1 |
🚀 三、运行与单步执行
| 命令 | 说明 |
run或 r |
运行程序 |
start |
运行并在 main处暂停 |
continue或 c |
继续执行直到下一个断点 |
next或 n |
单步执行(不进入函数) |
step或 s |
单步执行(进入函数) |
finish |
执行完当前函数并返回 |
until或 u |
继续执行直到跳出循环或离开当前函数 |
🔍 四、查看变量与内存
| 命令 | 说明 |
print x或 p x |
打印变量 x的值 |
print array[0]@10 |
打印数组前 10 个元素 |
display x |
每次停下时自动显示 x |
undisplay 1 |
取消自动显示编号 1 |
info locals |
查看当前栈帧的所有局部变量 |
info args |
查看函数参数 |
x/s ptr |
以字符串形式查看内存 |
x/10dw addr |
查看从 addr开始的 10 个 32 位整数 |
📋 五、调用栈与帧
| 命令 | 说明 |
backtrace或 bt |
查看调用栈 |
frame 2或 f 2 |
切换到栈帧 2 |
info frame |
查看当前栈帧信息 |
up |
向上移动一帧 |
down |
向下移动一帧 |
🧵 六、多线程调试
| 命令 | 说明 |
info threads |
查看所有线程 |
thread 2 |
切换到线程 2 |
break file.c:123 thread 2 |
只在指定线程设断点 |
set scheduler-locking on |
锁定调度器,只运行当前线程 |
📂 七、源码与汇编
| 命令 | 说明 |
list或 l |
显示源码(默认 10 行) |
list 10 |
显示第 10 行附近的源码 |
list func |
显示函数 func的源码 |
disassemble或 disas |
反汇编当前函数 |
disassemble main |
反汇编 main函数 |
💾 八、修改变量与内存
| 命令 | 说明 |
set var x=10 |
修改变量 x的值为 10 |
set {int}0x12345678 = 100 |
修改内存地址的值 |
📤 九、日志与脚本
| 命令 | 说明 |
set logging on |
开启日志记录 |
set logging file gdb.log |
设置日志文件 |
source script.gdb |
执行 GDB 脚本 |
🎯 十、实用技巧
1. 条件断点
2. 观察点(Watchpoint)
3. 捕获点(Catchpoint)
4. 调试 core dump
🧩 十一、示例调试会话
📚 十二、帮助命令
| 命令 | 说明 |
help |
查看帮助 |
help break |
查看 break命令的帮助 |
apropos keyword |
搜索相关命令 |
gdb 快捷
layout:用于分割窗口,可以一边查看代码,一边测试。主要有以下几种用法:
layout src:显示源代码窗口
layout asm:显示汇编窗口
layout regs:显示源代码/汇编和寄存器窗口
layout split:显示源代码和汇编窗口
layout next:显示下一个layout
layout prev:显示上一个layout
Ctrl + L:刷新窗口
Ctrl + x,再按1:单窗口模式,显示一个窗口
Ctrl + x,再按2:双窗口模式,显示两个窗口
Ctrl + x,再按a:回到传统模式,即退出layout,回到执行layout之前的调试窗口。