gpt4 book ai didi

c - gdb 观察大量内存以找出损坏,这里没有段错误

转载 作者:可可西里 更新时间:2023-11-01 11:44:20 31 4
gpt4 key购买 nike

更新:现在使用 valgrind --tools=memcheck --track-origins=yes --leak-check=full ./prog 它运行正确,但没有这个 valgrind ,还是出错,怎么回事?

我在 Linux 上做一个项目,它在内存中存储大量数据,我需要知道更改了哪个数据 block ,以便找出我程序中的问题。

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

代码是这样的

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 是否在其他地方发生了变化。

我知道 gdb 中的 awatch exp 可以检查值是否发生变化,但是这里太多了,有没有什么办法可以全部跟踪它们,我的意思是它们可能将近 6,000。

谢谢你们。

最佳答案

Reverse debugging这里有一个很好的用例,假设您有某种方法可以在损坏发生后检测到它(段错误就可以)。

一旦您在调试 session 中检测到损坏,您就可以在损坏的变量上放置一个观察点,然后向后运行程序,直到变量被写入。

这是一个分步指南:

  1. 像往常一样使用调试符号编译程序并将其加载到 gdb 中。
  2. 使用start 启动程序。
    • 这会在 main 的最开头放置一个断点,并运行程序直到遇到它。
  3. 现在,在检测到内存损坏的地方放置一个断点
    • 如果您正在检测具有段错误的损坏,则不需要执行此操作。
  4. 输入record开始记录程序执行
    • 这就是我们之前调用 start 的原因 - 当没有进程在运行时您无法记录。
  5. continue 设置程序再次运行。
    • 录制时,程序会运行得很慢
    • 它可能会告诉您记录缓冲区已满 - 如果发生这种情况,请告诉它回绕。
  6. 当您的断点或段错误检测到您的损坏时,程序将停止。现在 watch 看看损坏的变量是什么。
  7. reverse-continue 向后运行程序,直到写入损坏的变量。
  8. 当观察点到达时,您就发现了腐败。
    • 请注意,它并不总是该变量的第一个或唯一一个损坏。但您始终可以继续向后运行,直到用完反向执行历史记录 - 现在您有一些要修复的东西。

有一个有用的教程 here ,其中还讨论了如何控制记录缓冲区的大小,以防这成为您的问题。

关于c - gdb 观察大量内存以找出损坏,这里没有段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9771179/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com