You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 22.04下如何获取程序内存数据结构实现Checkpoint?

在Ubuntu 22.04中实现程序Checkpoint(内存状态保存与恢复)

Checkpoint的核心是捕获程序特定时刻的状态快照,故障后可从该点恢复执行。针对你的需求,在Ubuntu 22.04下可以通过以下几种方式实现:

一、系统级工具实现完整进程快照

1. 使用CRIU工具

CRIU(Checkpoint/Restore In Userspace)是Linux生态中成熟的进程快照工具,能完整捕获进程的内存、文件句柄、线程状态等信息,后续可恢复执行。

  • 安装CRIU:
    sudo apt update && sudo apt install criu
    
  • 操作步骤:
    • 运行目标程序,通过ps aux | grep <程序名>获取进程PID;
    • 在需要创建Checkpoint的时刻,执行快照命令(将状态保存到指定目录):
      sudo criu dump -t <PID> --images-dir ./checkpoint_snap
      
    • 恢复进程时,执行:
      sudo criu restore -d --images-dir ./checkpoint_snap
      
    • 注意:Python程序使用CRIU时,要避免依赖无法被快照的资源(如临时文件、活跃网络连接),否则恢复可能失败。

2. 用GDB手动导出指定内存状态

如果只需要保存特定变量的内存数据,可通过GDB调试工具实现:

  • 安装GDB:
    sudo apt install gdb
    
  • 操作步骤:
    • 运行程序,通过gdb -p <PID>附加到目标进程;
    • 暂停进程(可通过代码插入延迟或GDB设置断点),查看变量内存地址:
      p &num0
      
    • 将变量内存数据保存到文件:
      dump memory ./num0_checkpoint.bin 0x<num0_addr> 0x<num0_addr+4>
      
    • 恢复时,重新启动程序并附加GDB,将内存数据写回:
      restore ./num0_checkpoint.bin 0x<num0_addr>
      
    • 注意:这种方法仅适合小范围变量的快照,不适合复杂程序。

二、代码层面手动实现Checkpoint(Python专属)

对于Python这类解释型语言,直接在代码中序列化核心状态变量是最灵活的方式,无需依赖系统工具:

  • 修改后的示例代码:
    import pickle
    
    def save_checkpoint(num0, num1, c, save_path="./fib_checkpoint.pkl"):
        with open(save_path, "wb") as f:
            pickle.dump((num0, num1, c), f)
    
    def load_checkpoint(save_path="./fib_checkpoint.pkl"):
        with open(save_path, "rb") as f:
            return pickle.load(f)
    
    # 程序启动逻辑:优先加载Checkpoint,无则初始化
    try:
        num0, num1, c = load_checkpoint()
        print(f"从Checkpoint恢复,当前状态:num0={num0}, num1={num1}, c={c}")
    except FileNotFoundError:
        num0, num1 = 0, 1
        c = 0
        print(num0)
        print(num1)
    
    while c < 20:
        num = num0 + num1
        print(num)
        
        # 执行Checkpoint保存
        save_checkpoint(num0, num1, c)
        
        num0, num1 = num1, num
        c += 1
    
  • 说明:通过pickle模块将程序核心状态(num0、num1、c)序列化到文件,恢复时直接加载这些变量,即可从断点继续执行。这种方法可控性强,完全由代码定义Checkpoint时机和内容。

三、选型建议

  • 完整进程快照选CRIU:适合复杂程序,能还原整个进程状态,但对环境依赖要求高;
  • 轻量状态管理选代码序列化:适合脚本类程序,实现简单,无需额外工具;
  • 调试场景选GDB:仅适合小范围变量的临时快照,不适合生产环境。

内容的提问来源于stack exchange,提问作者Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:55:18