更新:
现在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;
我想知道e->blkmap_mem[blk_offset+save_offset+j]->data
是否在其他地方发生了变化。
我知道awatch exp
中的gdb
可以检查值是否发生了变化,但是这里有太多,有什么方法可以追踪它们,我的意思是它们可能接近6000个。
谢谢你们。
答案 0 :(得分:7)
Reverse debugging在这里有一个很好的用例,假设你有一些方法来检测腐败一旦发生(一个seg错误就行了)。
一旦在调试会话中检测到损坏,就会在损坏的变量上放置一个监视点,然后向后运行程序,直到写入变量为止。
以下是分步指南:
start
启动该程序。
record
以开始记录程序执行
start
的原因 - 您无法记录何时没有进程正在运行。continue
设置程序再次运行。
watch
放在已损坏的变量上。reverse-continue
向后运行程序,直到写入损坏的变量。 有一个有用的教程here,它还讨论了如何控制记录缓冲区的大小,以防万一成为您的问题。