mmap() 失敗: メモリを割り当てられません。誰が文句を言うのか、どうすればわかりますか?

mmap() 失敗: メモリを割り当てられません。誰が文句を言うのか、どうすればわかりますか?

mmap() が突然 .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)

おすすめ記事