第一阶段:现场还原(加载与定位)

首先,登录机器 33.9.120.103,进入 Core 文件所在目录。

1. 加载 Core 文件

bash


gdb /usr/local/bin/wings_worker /online/corefile/core-wings_worker-88-1767854342-ucpe-resource011012102176.na610

2. 查看崩溃信号与原因 进入 GDB 后,首先确认程序死于什么信号:

gdb


(gdb) info program
# 预期输出:Program terminated with signal 11, Segmentation fault (或 Signal 6)

3. 获取崩溃堆栈 直接查看当前线程(触发崩溃的线程)的调用路径:

gdb
(gdb) bt

第二阶段:深度分析(揪出 127TB 溢出)

4. 检查内存申请大小 切换到内存分配的帧(通常是 Frame 0),查看它到底想申请多少内存:

gdb

(gdb) f 0
(gdb) p $rdi
# $rdi 存储第一个参数。如果显示 140436855727216,说明申请了约 127TB,直接实锤溢出。

5. 确认“长度被误当成指针”的 Bug 切换到调用分配函数的上一层(通常是 Frame 1),查看寄存器:

gdb


(gdb) f 1
(gdb) info registers
# 检查 rdi (起始指针) 和 rsi (结束指针)
# 如果 rsi 是一个很小的整数(如 843),说明它把长度当成了内存地址。

第三阶段:数据取证(抓取异常 JSON)

我们需要拿到导致崩溃的那段原始数据。

6. 定位 JSON 字符串地址 切换到业务解析层(根据你之前的堆栈,是 Frame 22):

gdb


(gdb) f 22
(gdb) info args
# 找到 str 变量,记录其 _M_p 的内存地址(假设是 0x7fb9e7a32018)

7. 导出 JSON 数据到文件 由于 JSON 可能很长,直接打印会刷屏,建议导出到文件:

gdb


# 导出前 50000 字节到当前目录下的 crash_case.json
(gdb) dump binary memory crash_case.json 0x7fb9e7a32018 (0x7fb9e7a32018 + 50000)

8. 在线查看关键位置 查看崩溃发生的偏移量(pos=1350)附近的内容:

gdb


(gdb) printf "%.200s\n", (char*)(0x7fb9e7a32018 + 1300)

总结:你的排查结论