<分区>
假设我用 g++ 编译了一些程序(使用 '-g' 标志,如果有帮助的话)。我运行它,我的电脑只是锁定,因此迫使我重新启动。我的用户界面根本不起作用。 Valgrind 和 gdb 做同样的事情。
我可以将输出放在一个文件中,并在我启动计算机时读取它,但这会使调试过程更加耗时,因为我每次运行程序时都必须重新启动计算机。
在我的例子中,程序应该占用很小一部分(最多 1/400)的内存。几兆字节的大小。
<分区>
假设我用 g++ 编译了一些程序(使用 '-g' 标志,如果有帮助的话)。我运行它,我的电脑只是锁定,因此迫使我重新启动。我的用户界面根本不起作用。 Valgrind 和 gdb 做同样的事情。
我可以将输出放在一个文件中,并在我启动计算机时读取它,但这会使调试过程更加耗时,因为我每次运行程序时都必须重新启动计算机。
在我的例子中,程序应该占用很小一部分(最多 1/400)的内存。几兆字节的大小。
最佳答案
在 C++ 中,您可以定义一个全局分配器:
void *operator new(size_t sz);
void *operator new[](size_t sz);
void operator delete(void *p);
void operator delete[](void *p);
对于非抛出版本也是如此。
每次您使用 new
为实例或数组从堆中获取内存时,都会调用这些函数。
您可以做的是创建一个实现这些功能的模块,将总量限制为 100Mb,然后在超过此限制时使用调试器中断以查看谁在分配内存。
请注意,这些用户定义的分配函数只会为使用 new
分配的内存调用,而不会为使用 malloc
分配的内存调用。另请注意,您可以使用 malloc
/free
来实现您的版本(当然您不能使用 new
因为它只是一个递归调用) .
一个烦人的事实是,您必须自己记住分配 block 的大小,因为没有可移植的方法来询问 malloc
-ed block 的大小。
一种简单的方法是过度分配 8 个字节,并在分配的内存区域之前存储 block 大小。
关于c++ - 在 Linux 上调试时如何停止占用所有可用内存的程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27642505/
相关文章:
ios - 无法从 Xcode 10 中的自定义 "Attach to Process by PID or Name" "embedded framework"后命中断点
c++ - 在 Visual C++ 中调试图像渲染,任何有用的加载项?
facebook - 错误 Linting URL : An internal error occurred while linting the URL
c++ - R CMD 检查 CUDA *.cu 文件的警告
c++ - MSVS2015 Linux 调试启动 gdbserver 失败
linux - 围绕疯狂的设备接口(interface)进行路由
linux - 让 Tk 看起来像一个原生 Linux 应用程序