c++ - 在 Linux 上调试时如何停止占用所有可用内存的程序?

标签 c++ linux debugging

<分区>

假设我用 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 应用程序

c++ - 三角形,C++ 构造,计算角度的问题

c++ - 从 Windows 上的文件中读取多个分隔的 protobuf 消息

c++ - 为什么 windbg 会在不同的路径中搜索转储文件和 exe 文件?