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)