我有一个C ++ gcc泄漏程序,包含326个部分,如下所示
33300000-33500000 rwxp 33300000 00:00 0
Size: 2048 kB
Rss: 620 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 244 kB
Private_Dirty: 376 kB
我想知道什么样的分配会导致2MB可写代码段添加到程序中。 通常我会看到这些部分用作线程的堆栈内存,但它们的大小为10 MB。
答案 0 :(得分:4)
r = read
w = write
x = execute
s = shared
p = private (copy on write)
答案 1 :(得分:3)
通常我会看到这些用作线程的堆栈内存的部分
是的,您极有可能泄漏线程。您可以通过查看/proc/<pid>/task
并检查是否有超过预期的326个线程来确认这一点。或者,GDB info thread
也将列出所有线程。
注意:您的堆栈是可执行的这一事实意味着您的二进制文件或其中一个必需的共享库中没有GNU_STACK
段,这通常是一个坏主意。
但它们的大小为10 MB。
堆栈段的大小取决于当前ulimit -s
设置,以及应用程序本身可能执行的任何setrlimit(..., RLIMIT_STAck, ...)
或pthread_attr_setstacksize()
调用。
答案 2 :(得分:2)
经过更多研究后,我发现该过程是使用malloc分配大内存块 但是当malloc看到所需的分配大小对于堆来说太大(参见MMAP_THRESHOLD)时,它通过调用mmap来分配内存。 在一天结束时,它是一个常规内存泄漏,除了分配特别大并导致直接mmap调用。