アプリケーションセグメントが発生すると、通常は次のメッセージが表示されますdmesg
。
pstree[25678]: segfault at 0 ip 00007f58be0b3ae4 sp 00007ffe65b700a0 error 4 in libc-2.24.so[7f58be04d000+195000]
dmesg
しかし、もはやこのCプログラムでsegfaultをトリガしないので、どこかでカーネル設定を変更したようです。
#include <signal.h>
int main()
{
raise(SIGSEGV);
}
私のログレベルが次に設定されていることを知っています。KERN_DEBUG
:
$ cat /proc/sys/kernel/printk
7 4 1 7
次のような出力が表示されることがわかりますdmesg
。
sudo sh -c "printf '<%s> Log level %s (KERN_DEBUG)\n' '7' '7' > /dev/kmsg"
私はdebug.exception-trace
それを1に設定することを知っています:
$ sysctl debug.exception-trace
debug.exception-trace = 1
$ cat /proc/sys/debug/exception-trace
1
ただし、まだsegfault通知を受け取りません。これdmesg
マニュアルページ色分けエラーメッセージについて説明しますが、オンまたはオフにはなりません。
ベストアンサー1
分割エラーはSIGSEGV信号と同じではありません。信号は信号だけです。実際の分割エラーが発生すると、カーネルはそれを記録してからSIGSEGV信号をアプリケーションに送信します。
これに対するロジックとカーネルが実際の分割エラーのみを記録するのは、カーネル(およびCPU)がプログラムが所有してアクセスできるアドレス空間の規則を強制するためです。したがって、これらのルールが違反した場合は、そのアクションを記録します。
正しくテストするには、初期化されていないポインタにアクセスするなど、分割エラーを生成する作業をコードで実際に実行する必要があります。