paused状态通过cgroups freezer冻结进程,内存数据完整驻留ram但不可访问;恢复仅解除冻结标志,毫秒级续执行,不涉及磁盘i/o或状态重建,不能替代持久化。
容器处于 paused 状态时,其进程在宿主机上实际被 sigstop 暂停(通过 cgroup freezer 控制),但内存数据完整保留、未被释放或交换。此时无法直接用常规调试器(如 gdb) attach,也不能执行命令,但可以利用 linux 内核提供的内存转储机制获取进程的完整用户态内存镜像,用于后续离线分析。
确认容器进程 PID 并检查 freezer 状态
Paused 容器底层依赖 cgroup v1 的 freezer 子系统(Docker 默认使用)。需先定位对应进程的真实 PID,并确认其确实被冻结:
- 运行
docker inspect <container_id> | jq '.State.Pid'</container_id>获取主进程 PID(例如12345) - 检查该 PID 所属的 freezer cgroup:
cat /proc/12345/cgroup | grep freezer→ 得到路径如/sys/fs/cgroup/freezer/docker/abc123... - 确认状态:
cat /sys/fs/cgroup/freezer/docker/abc123/freezer.state应返回FROZEN
从 /proc/PID 下提取完整内存镜像(core dump)
Linux 允许对已停止进程生成 core 文件,即使它被 freezer 冻结。关键在于绕过默认的 RLIMIT_CORE=0 限制,并确保内核支持 core_pattern 配置:
- 临时允许 core dump:
echo "/tmp/core.%p" | sudo tee /proc/sys/kernel/core_pattern - 解除对目标 PID 的资源限制(可选但推荐):
sudo prctl -p 12345 --set-rlimit core:-1:-1(需libprctl工具) - 触发 dump:
sudo gcore -o /tmp/core_12345 12345✅ 成功时会输出类似[New LWP 12345]和Saved corefile /tmp/core_12345.12345 - 若
gcore失败(提示 "Operation not permitted"),可改用dd直接读取/proc/12345/mem(需ptrace权限):sudo dd if=/proc/12345/mem of=/tmp/mem_12345.bin bs=1M⚠️ 注意:此方式得到的是原始物理内存映像,无 ELF header 或段信息,需配合/proc/12345/maps解析布局
离线分析内存镜像的关键步骤
获得 core 或 raw memory 后,需结合容器内应用的原始二进制和调试符号进行分析:
- 从容器中复制原程序和依赖库:
docker cp <container_id>:/usr/bin/myapp ./myapp</container_id>,并确保有.debug或debuginfo包 - 用
gdb加载 core:gdb ./myapp /tmp/core_12345.12345,然后执行:(gdb) info proc mappings→ 查看内存布局(gdb) bt full→ 查看完整调用栈(若符号可用)(gdb) x/20xg 0x7f8...→ 查看指定地址内存 - 若只有 raw memory(
mem_12345.bin),需用readelf -l ./myapp和cat /proc/12345/maps对齐段偏移,再用xxd或radare2手动解析堆、栈、libc 数据区
替代方案:使用 eBPF 或 checkpoint 工具(适合生产环境)
对于不可中断的长期 paused 场景,更稳健的方式是避免直接 dump,转而采用轻量可观测手段:
- 用
bpftrace抓取关键内存分配事件:bpftrace -e 'uprobe:/lib/x86_64-linux-gnu/libc.so.6:malloc { printf("malloc %d at %x\n", arg0, ustack); }' - 借助
criu(Checkpoint/Restore in Userspace)对 paused 容器做快照:sudo criu dump -t 12345 --shell-job,生成包含内存页、寄存器、文件描述符的完整检查点目录,支持后续 restore 或分析 - Docker 24.0+ 支持
docker checkpoint(需启用 experimental),可对 paused 容器创建检查点,导出为 tar 包供离线研究











