C++ 导出导入内存

C++ 导出导入内存,c++,gdb,heap-memory,C++,Gdb,Heap Memory,是否有导出内存快照然后稍后再次导入的选项 例如,我有一个崩溃的核心文件 第12帧上有一个有趣的stl字符串,我想将sting的数据保存到一个文件中 数据是二进制的,非常大 然后我想用gdb运行原始二进制文件,并在第12帧的函数上放置一个断点 并将保存的数据加载到字符串中 通过这种方式,我可以重现错误,并使用gdb逐步执行,直到崩溃发生 顺便说一句,我能够将数据打印到日志文件中,因为该字符串表示一个数组 我下到第11帧 将向量的内容打印到日志文件中 在原始代码中综合生成数组 编译并运行它 我发现了

是否有导出内存快照然后稍后再次导入的选项

例如,我有一个崩溃的核心文件

第12帧上有一个有趣的stl字符串,我想将sting的数据保存到一个文件中 数据是二进制的,非常大

然后我想用gdb运行原始二进制文件,并在第12帧的函数上放置一个断点 并将保存的数据加载到字符串中

通过这种方式,我可以重现错误,并使用gdb逐步执行,直到崩溃发生

顺便说一句,我能够将数据打印到日志文件中,因为该字符串表示一个数组

  • 我下到第11帧
  • 将向量的内容打印到日志文件中
  • 在原始代码中综合生成数组
  • 编译并运行它
  • 我发现了错误并修复了它
  • 但这是一种手动方式,我花了很长时间

    我不是在寻找替代解决方案,因为我已经解决了这个bug

    我想知道gdb是否有一个导出/导入内存选项,如果有,如何导出数据位于堆上的导入stl字符串?

    一个选项就是在gdb中:

    然后在十六进制编辑器中导航到内存中的同一区域,并比较两者。或者,您可以运行
    info proc mappings
    以获取内存范围列表,查找堆的起始和结束地址,然后使用:

    其中
    heapstart
    heapend
    是您找到的地址。

    一个选项是只在gdb中:

    然后在十六进制编辑器中导航到内存中的同一区域,并比较两者。或者,您可以运行
    info proc mappings
    以获取内存范围列表,查找堆的起始和结束地址,然后使用:

    其中
    heapstart
    heapend
    是您找到的地址

    我想知道gdb是否有导出/导入内存选项,如果有,如何导出数据位于堆上的stl字符串

    您可以使用
    dump memory filename.out addr1 addr2
    addr1
    addr2
    之间的内存内容保存到文件中。这就是你的“出口”。我刚刚验证了这对
    core
    target有效

    要将数据“导入”到实时进程中,只需调用
    read
    。假设
    $addr
    是一个足够大的堆缓冲区:

    (gdb) set fd = open("filename.out", 0)
    (gdb) call read($fd, $addr, $len)
    (gdb) call close($fd)
    
    由于最后一个命令需要3个命令,如果您希望定期执行此操作,请为其定义一个(用户定义的)命令

    我想知道gdb是否有导出/导入内存选项,如果有,如何导出数据位于堆上的stl字符串

    您可以使用
    dump memory filename.out addr1 addr2
    addr1
    addr2
    之间的内存内容保存到文件中。这就是你的“出口”。我刚刚验证了这对
    core
    target有效

    要将数据“导入”到实时进程中,只需调用
    read
    。假设
    $addr
    是一个足够大的堆缓冲区:

    (gdb) set fd = open("filename.out", 0)
    (gdb) call read($fd, $addr, $len)
    (gdb) call close($fd)
    
    由于最后一个命令需要3个命令,如果您希望定期执行此操作,请为其定义一个(用户定义的)命令

    (gdb) set fd = open("filename.out", 0)
    (gdb) call read($fd, $addr, $len)
    (gdb) call close($fd)