【问题标题】:What are the "rwxp" sections in /proc/pid/smaps (linux)/proc/pid/smaps (linux) 中的“rwxp”部分是什么
【发布时间】:2014-11-16 05:35:29
【问题描述】:

我有一个 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 大。

【问题讨论】:

    标签: linux memory memory-leaks gdb


    【解决方案1】:
    r = read
    w = write
    x = execute
    s = shared
    p = private (copy on write)
    

    【讨论】:

    • 我知道每个字母的含义,但我很感兴趣什么样的分配会添加这样的部分。是堆栈区吗?通常代码是只读的,这是常规堆吗?谢谢
    • 我会推荐看this这本书以供进一步参考。
    【解决方案2】:

    通常我看到这样的部分被用作线程的堆栈内存

    是的,您极有可能正在泄漏线程。您可以通过查看 /proc/<pid>/task 并检查您的线程数是否比您预期的多 326 个来确认这一点。或者,GDB info thread 也会列出所有线程。

    注意:您的堆栈是可执行的这一事实意味着您的二进制文件或其所需的共享库之一中没有 GNU_STACK 段,这通常是一个坏主意。

    但它们有 10 MB 大。

    堆栈段的大小取决于当前的ulimit -s 设置,以及应用程序本身可能执行的任何setrlimit(..., RLIMIT_STAck, ...)pthread_attr_setstacksize() 调用。

    【讨论】:

    • 感谢您的回答。经过更多的研究,在我的情况下,我们变成了一个不同的场景,但你的回答很可能会帮助其他人。
    【解决方案3】:

    经过更多研究,我发现该进程正在使用 malloc 分配大内存块。
    但是,当 malloc 发现所需的分配大小对于堆来说太大(请参阅 MMAP_THRESHOLD)时,它会通过调用 mmap 来分配内存。
    归根结底,这是一次常规的内存泄漏,除了分配特别大并导致直接 mmap 调用。

    【讨论】:

    猜你喜欢
    • 2012-04-12
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多