Debugging Strace检测到对brk的调用,但GDB不';不要在断点上停止
我尝试调试内存泄漏已经有相当一段时间了。我的主要问题是不能使用像Valgrind之类的合适工具,所以我选择了普通的GDB+strace 我的程序是一个循环。在每次迭代中,它创建一些对象,然后调用它们的析构函数。如上所述,在循环的第一次迭代中进行第一次分配之后,程序不应该要求更多的内存,因为它总是分配相同的对象,因此应该总是重用相同的空间。然而,我的程序每15次迭代调用一次Debugging Strace检测到对brk的调用,但GDB不';不要在断点上停止,debugging,gdb,breakpoints,strace,brk,Debugging,Gdb,Breakpoints,Strace,Brk,我尝试调试内存泄漏已经有相当一段时间了。我的主要问题是不能使用像Valgrind之类的合适工具,所以我选择了普通的GDB+strace 我的程序是一个循环。在每次迭代中,它创建一些对象,然后调用它们的析构函数。如上所述,在循环的第一次迭代中进行第一次分配之后,程序不应该要求更多的内存,因为它总是分配相同的对象,因此应该总是重用相同的空间。然而,我的程序每15次迭代调用一次brk(),传递给brk的参数每次增加4.096(比如,第一次:brk(0xb7887000)=0xb7887000,第二次:
brk()
,传递给brk
的参数每次增加4.096(比如,第一次:brk(0xb7887000)=0xb7887000
,第二次:brk(0xb7888000)=0xb7888000
,第三次:brk(0xb7889000)=0xb7889000
,等等)
然后我尝试将GDB挂接到我的程序,让程序运行几次迭代,并使用(GDB)break brk
在brk上设置断点
它说它在一个地址上设置了一个断点,但即使我让我的程序运行了15次以上的迭代,断点也永远不会被“调用”(?)
为什么会这样?如何理解发生了什么?如果
break brk
实际上是linux系统调用,请尝试catch syscall brk
而不是break brk
。您是否尝试了实验性的strace-k
选项来显示系统调用的堆栈跟踪?您必须自己编译它,但是跟踪内存使用情况非常方便。如果break brk
实际上是linux系统调用,请尝试trace-k
选项以显示系统调用的堆栈跟踪,而不是break brk
?您必须自己编译它,但是跟踪内存使用情况非常方便。