gdb看了大量的内存来查找损坏,这里没有seg故障

bxs*_*shi 3 c linux memory gdb

更新: 现在valgrind --tools=memcheck --track-origins=yes --leak-check=full ./prog运行正常,但没有这个valgrind,它仍然会出错,怎么会发生?

我在Linux上做了一个项目,它在内存中存储了大量数据,我需要知道哪个数据块被更改才能找到我程序中的问题.

更新:这是一个多线程程序,写入/读取由系统调用创建的不同线程完成.

代码是这样的

for(j=0;j<save_size;j++){
    e->blkmap_mem[blk_offset+save_offset + j] = get_mfs_hash_block();
    memcpy(e->blkmap_mem[blk_offset + save_offset +j]->data, (char *)buff + j * 4096, 4096);
    e->blkmap_mem[save_offset+j]->data = (char *)(buff + j* 4096);
    e->blkmap_mem[blk_offset+save_offset + j]->size = 4096;
    e->blkmap_addr[blk_offset+save_offset + j] = 1;
Run Code Online (Sandbox Code Playgroud)

我想知道是否e->blkmap_mem[blk_offset+save_offset+j]->data在其他地方改变了.

我知道awatch expgdb可以检查是否值的变化,但有太多在这里,有一些方法来跟踪他们,我的意思是他们可能是近6000个.

谢谢你们.

Tim*_*nes 7

反向调试在这里有一个很好的用例,假设你有一些方法来检测腐败一旦发生(一个seg错误就行了).

一旦在调试会话中检测到损坏,就会在损坏的变量上放置一个监视点,然后向后运行程序直到写入变量.

这是一个循序渐进的指南:

  1. 像往常一样用调试符号编译程序并将其加载到gdb中.
  2. 使用启动程序start.
    • 这将断点放在main的最开头,并运行程序直到它命中它.
  3. 现在,在检测到内存损坏的地方放置一个断点
    • 如果您通过seg故障检测到损坏,则无需执行此操作.
  4. 键入record以开始记录程序执行
    • 这就是我们start之前打过电话的原因- 当没有进程运行时你无法记录.
  5. continue 设置程序再次运行.
    • 录音时,程序运行速度非常慢
    • 它可能会告诉你记录缓冲区已满 - 如果发生这种情况,请告诉它包装.
  6. 当您的断点或seg故障检测到您的损坏时,程序将停止.现在把它watch放在任何损坏的变量上.
  7. reverse-continue 向后运行程序,直到写入损坏的变量.
  8. 当观察点击中时,您已经发现了腐败现象.
    • 请注意,它并不总是该变量的第一次或唯一损坏.但是你可以继续向后跑,直到你用完反向执行历史 - 现在你已经有了解决的问题.

有一个有用的教程在这里,其中还讨论了如何控制记录缓冲区,使之成为你的问题的大小,以备不时之需.