在Linux的/proc/pid/smaps文件中,"rwxp"部分是什么意思?

3

我有一个 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。
3个回答

7
r = read
w = write
x = execute
s = shared
p = private (copy on write)

我知道每个字母的意思,但我想知道什么样的分配会添加这样的部分。它是堆栈区域吗?通常代码是只读的,这是常规堆吗?谢谢。 - Avner Levy
我建议查看这本书以供参考。 - Arnab Nandy

3
通常我看到这样的部分被用作线程的堆栈内存。
是的,很可能您正在泄漏线程。您可以通过查看/proc/<pid>/task并检查是否比预期多326个线程来确认此情况。或者,GDB info thread也会列出所有线程。
注意:栈可执行的事实意味着您的二进制文件中没有GNU_STACK段或其中一个必需的共享库,这通常是不好的想法。
但它们大小达到了10 MB。
堆栈段的大小取决于当前的ulimit -s设置,以及应用程序本身可能执行的任何setrlimit(..., RLIMIT_STAck, ...)pthread_attr_setstacksize()调用。

感谢您的回答。经过更多的研究,我发现在我的情况下是一个不同的场景,但是您的答案可能会对其他人有所帮助。 - Avner Levy

2

经过更深入的研究,我发现该进程正在使用malloc分配大内存块。
但是当malloc发现所需分配大小太大超出了堆的限制(参见MMAP_THRESHOLD),它将通过调用mmap来分配内存。
最终,这只是一个常规的内存泄漏问题,只不过分配的特别大,导致直接调用mmap。


你明白为什么这些页面被标记为可执行吗?我不认为malloc会将其页面标记为可执行。 - Jérôme Pouiller
https://dev59.com/E1jUa4cB1Zd3GeqPOiRD 在@Jezz的帮助下增加了一些信息。 - Avner Levy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接