01
粘包与拆包现象
什么是粘包?什么是拆包?为什么TCP会产生粘包?
基础TCP
02
GDB基础回顾
GDB核心命令速览、如何用GDB attach到正在运行的进程。
GDB速查
03
环境准备
搭建一个会触发粘包/拆包的TCP服务端与客户端Demo。
Demo环境
04
复现粘包问题
运行Demo,观察客户端收到的数据异常。
实验现象
05
GDB初探
用GDB attach服务端进程,查看当前线程堆栈。
调试线程
06
断点设置
在send/recv函数上设置断点,捕获数据发送与接收。
断点系统调用
07
观察缓冲区
用GDB打印socket内核缓冲区大小与当前数据量。
内核缓冲区
08
数据流追踪
单步调试,追踪一次send调用在内核中的路径。
内核追踪
09
Nagle算法
用GDB查看TCP_NODELAY选项状态,理解Nagle对粘包的影响。
Nagle算法
10
MSS与拆包
用GDB查看MSS值,分析数据超过MSS时如何被拆分。
MSS拆包
11
应用层协议
为什么需要应用层协议?协议设计对粘包/拆包的影响。
协议设计
12
定长协议
用GDB调试定长协议,验证数据边界是否清晰。
定长边界
13
长度前缀协议
调试长度前缀协议,用GDB检查长度字段是否正确。
TLV长度
14
分隔符协议
调试分隔符协议,用GDB观察数据中是否存在分隔符冲突。
分隔符冲突
15
内存分析
用GDB查看堆内存,分析数据是否被正确拼接或拆分。
堆内存分析
16
条件断点
在recv返回特定长度时触发断点,精准定位异常包。
条件精准
17
日志辅助
结合GDB与strace,双管齐下分析系统调用。
strace日志
18
多线程场景
用GDB调试多线程服务端,定位线程间数据竞争导致的粘包。
多线程竞争
19
锁与同步
用GDB检查互斥锁状态,分析锁竞争是否影响数据完整性。
互斥锁同步
20
性能瓶颈
用GDB的profile功能,找出粘包处理中的CPU热点。
性能热点
21
内存泄漏
用GDB检查堆内存分配,定位因粘包处理不当导致的内存泄漏。
泄漏堆
22
Core Dump分析
当粘包导致程序崩溃时,如何用GDB分析core文件。
Core崩溃
23
信号处理
用GDB捕获SIGPIPE等信号,分析连接断开时的数据残留。
信号SIGPIPE
24
网络库调试
以libevent为例,用GDB调试事件循环中的粘包逻辑。
libevent事件
25
自定义协议栈
用GDB调试自己实现的简单协议栈,验证拆包逻辑。
协议栈实现
26
压力测试
用GDB在高压下观察粘包频率,分析系统负载与粘包的关系。
压力负载
27
优化策略
基于GDB分析结果,提出代码层面的优化方案。
优化方案
28
代码重构
用GDB验证重构后的代码是否彻底解决了粘包问题。
重构验证
29
自动化测试
编写GDB脚本,实现粘包问题的自动化回归测试。
脚本回归
30
总结与展望
GDB在粘包问题定位中的最佳实践总结。
最佳实践总结