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