Logs

在 dmesg 中切換分段錯誤消息的可見性

  • February 20, 2018

當應用程序出現段錯誤時,我通常會在以下位置看到這樣的消息dmesg

pstree[25678]: segfault at 0 ip 00007f58be0b3ae4 sp 00007ffe65b700a0 error 4 in libc-2.24.so[7f58be04d000+195000]

但是,我想我一定是在某個地方更改了我的核心設置,因為我不再在dmesg. 我正在用這個 C 程序觸發段錯誤:

#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

但我仍然沒有收到段錯誤通知。dmesg手冊頁討論了為段錯誤消息著色,而不是關於打開或關閉它們。

分段錯誤與 SIGSEGV 信號不同。信號只是一個信號。當您遇到實際的分段錯誤時,即核心將記錄它,然後向您的應用程序發送一個 SIGSEGV 信號。

這背後的邏輯,以及為什麼核心只記錄真正的分段錯誤,是核心(和 CPU)是執行有關程序擁有和允許訪問的地址空間的規則的東西。因此,當這些規則被打破時,它就是記錄操作的人。

要正確測試,您需要在程式碼中實際執行一些會產生分段錯誤的操作,例如訪問未初始化的指針。

引用自:https://unix.stackexchange.com/questions/425302