gcc/gdb



# -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> 附加到正在运行的进程
quitq 退出 GDB

📌 二、断点管理

命令说明
break mainb main main函数处设断点
break file.c:123 file.c第 123 行设断点
break func if x==5 条件断点
info breakpointsi b 查看所有断点
delete 1 删除编号为 1 的断点
clear 清除当前行的断点
disable 1 禁用断点 1
enable 1 启用断点 1

🚀 三、运行与单步执行

命令说明
runr 运行程序
start 运行并在 main处暂停
continuec 继续执行直到下一个断点
nextn 单步执行(不进入函数)
steps 单步执行(进入函数)
finish 执行完当前函数并返回
untilu 继续执行直到跳出循环或离开当前函数

🔍 四、查看变量与内存

命令说明
print xp 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 位整数

📋 五、调用栈与帧

命令说明
backtracebt 查看调用栈
frame 2f 2 切换到栈帧 2
info frame 查看当前栈帧信息
up 向上移动一帧
down 向下移动一帧

🧵 六、多线程调试

命令说明
info threads 查看所有线程
thread 2 切换到线程 2
break file.c:123 thread 2 只在指定线程设断点
set scheduler-locking on 锁定调度器,只运行当前线程

📂 七、源码与汇编

命令说明
listl 显示源码(默认 10 行)
list 10 显示第 10 行附近的源码
list func 显示函数 func的源码
disassembledisas 反汇编当前函数
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. 条件断点

 
break foo if x > 100
 
 

2. 观察点(Watchpoint)

 
watch x # 当 x 被修改时中断 rwatch x # 当 x 被读取时中断 awatch x # 当 x 被读写时中断
 
 

3. 捕获点(Catchpoint)

 
catch throw # 捕获异常抛出 catch fork # 捕获 fork 调用 catch exec # 捕获 exec 调用
 
 

4. 调试 core dump

 
gdb ./program core
 
 

🧩 十一、示例调试会话

 
$ gdb ./my_program (gdb) break main (gdb) run arg1 arg2 (gdb) next (gdb) print variable (gdb) backtrace (gdb) continue (gdb) quit
 
 

📚 十二、帮助命令

命令说明
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之前的调试窗口。

posted @ 2024-01-25 20:04  G1733  阅读(56)  评论(0)    收藏  举报