mmap() 失败:无法分配内存 - 我如何找出谁在抱怨?

mmap() 失败:无法分配内存 - 我如何找出谁在抱怨?

mmap() failed 突然出现在我的 .xsession-errors 中。但没有任何迹象表明哪个应用程序失败了。事情发生后我该如何调查?我通常只有在偶尔切换到“tail -f .logs/*”工作区时才会发现失败。

答案1

您可以使用系统点击对于这种事情。

  • 首先,设置您的系统。您需要 SystemTap、与正在运行的内核相对应的标头以及调试符号。在 Debian 上,让它正常工作是这样的:

    sudo apt-get install systemtap
    sudo apt-get install linux-headers-$(uname -r)
    sudo apt-get install linux-image-$(uname -r)-dbg
    

    让它工作可能有点棘手,因为内核头和符号需要与您正在运行的内核完全匹配。希望 Gentoo 上的操作简单明了。

  • 然后,将此文件另存为mmap.stp

    #! /usr/bin/env stap
    # -*- systemtap -*-
    
    global last_args
    
    probe syscall.mmap2 {
            last_args[tid()] = argstr;
    }
    
    probe syscall.mmap2.return {
            errno = errno_p(returnval())
            if (errno != 0) {
                    printf("%s[%d] mmap2(%s) failed: %d (%s)\n",
                           execname(), pid(), last_args[tid()],
                           errno, errno_str(errno));
            }
    }
    
    probe begin {
            printf("begin\n");
    }
    
    probe end {
            printf("end\n");
    }
    
  • 运行它

    sudo stap mmap.stp
    

在编译和打印之后begin,它将监视每个mmap()系统调用并保存其参数。如果发生错误,您将获得包括程序名称、进程 ID、参数和错误代码的输出。例如,运行这个无意义的程序:

int main() {
        mmap(1,-1,123,0,1,0);
}

给出 SystemTap 输出:

test[9601] mmap2(0x1, 4294967295, PROT_READ|PROT_WRITE|PROT_SEM|0x70, 0x0, 1, 0) failed: 22 (EINVAL)

相关内容