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 exp在gdb可以检查是否值的变化,但有太多在这里,有一些方法来跟踪他们,我的意思是他们可能是近6000个.
谢谢你们.
反向调试在这里有一个很好的用例,假设你有一些方法来检测腐败一旦发生(一个seg错误就行了).
一旦在调试会话中检测到损坏,就会在损坏的变量上放置一个监视点,然后向后运行程序直到写入变量.
这是一个循序渐进的指南:
start.
record以开始记录程序执行
start之前打过电话的原因- 当没有进程运行时你无法记录.continue 设置程序再次运行.
watch放在任何损坏的变量上.reverse-continue 向后运行程序,直到写入损坏的变量. 有一个有用的教程在这里,其中还讨论了如何控制记录缓冲区,使之成为你的问题的大小,以备不时之需.