我一直在尝试调试内存泄漏很长一段时间。我的主要问题是无法使用像Valgrind之类的正确工具,所以我选择了简单的GDB + strace。
我的程序是一个循环。在每次迭代中,它创建一些对象,然后调用它们的析构函数。正如它所解释的here,在循环的第一次迭代中第一次分配之后,程序不应该要求更多的内存,因为它总是分配相同的对象,因此应该总是重用相同的空间。然而,我的程序每15次迭代调用brk()
,传递给brk
的参数每次增加4.096(比如,第一次:{{1}},第二次:brk(0xb7887000) = 0xb7887000
,第3次时间:brk(0xb7888000) = 0xb7888000
,依此类推。)
然后我尝试将GDB连接到我的程序,让程序运行几次迭代,并使用brk(0xb7889000) = 0xb7889000
在brk上设置断点。
它说它在一个地址上设置了一个断点,但即使我让我的程序运行超过15次迭代,断点也永远不会被“调用”(?)。
为什么会这样?我怎么能理解发生了什么?