Logs
在 dmesg 中切換分段錯誤消息的可見性
當應用程序出現段錯誤時,我通常會在以下位置看到這樣的消息
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)是執行有關程序擁有和允許訪問的地址空間的規則的東西。因此,當這些規則被打破時,它就是記錄操作的人。
要正確測試,您需要在程式碼中實際執行一些會產生分段錯誤的操作,例如訪問未初始化的指針。