Kernel
解讀Linux中未處理的信號異常
我正在嘗試調試在啟動過程中拋出未處理的信號 11s 和信號 7s 的原型 CPU。
這是核心列印出來的內容。我在核心中添加了額外的列印語句,以準確調試哪些使用者空間程序出現了錯誤。
[ 0.880000] Execing: /usr/bin/readlink [ 0.884000] readlink[85]: unhandled signal 7 code 0x1 at 0x00000020000b8f60 in libc-2.26.so[2000049000+13e000] [ 0.884000] CPU: 0 PID: 85 Comm: readlink Not tainted 4.15.0-rc6-31580-g9c3074b5c2cd-dirty #20 [ 0.884000] sepc: 00000020000b8f60 ra : 00000020000b8d2c sp : 0000003ffffd9a60 [ 0.884000] gp : 00000000001028a8 tp : 0000002000192710 t0 : 0000000000000458 [ 0.884000] t1 : 00000020000aae98 t2 : ffffffffffffffff s0 : 000000200018d468 [ 0.884000] s1 : 000000200018e7d0 a0 : 000000200018e810 a1 : 000000200018c768 [ 0.884000] a2 : fffffffffbad2884 a3 : 0000000000008000 a4 : 000000200018ef38 [ 0.884000] a5 : 0000000000000001 a6 : 0000000000000000 a7 : 0000000000000040 [ 0.884000] s2 : 0000000000000001 s3 : 0000002000192010 s4 : 000000200018c4b0 [ 0.884000] s5 : 0000000000000001 s6 : 000000200018dd58 s7 : 0000000000000000 [ 0.884000] s8 : 00000000000e3388 s9 : 0000000000000040 s10: 000000000009c000 [ 0.884000] s11: 0000000000000048 t3 : 0000000000061e98 t4 : 0000000000000002 [ 0.884000] t5 : 000000200004bb64 t6 : 0000000000000000 [ 0.884000] sstatus: 8000000200006020 sbadaddr: 0000000006200893 scause: 0000000000000006 [ 0.888000] Execing: /bin/rm
在這裡,我在 readlink 中看到一個未處理的信號 7,它正在執行一些 libc 函式。我的問題是,我如何確定 libc 中的哪條指令導致了這種情況?機器狀態列印輸出不包含指令,僅包含 sepc。由於 libc 是動態連結的,我不確定如何在 libc 的程式碼中找到它的引用。
如果我正確讀取核心的原始碼,則此行:
readlink[85]: unhandled signal 7 code 0x1 at 0x00000020000b8f60 in libc-2.26.so[2000049000+13e000]
告訴你你需要知道的。libc 以十六進制載入
0x2000049000
,並且是0x13e000
字節長。信號發生的地址是0x00000020000b8f60
。為了找出相對於 libc 發生錯誤的位置,請計算0x00000020000b8f60
-0x2000049000
。我明白了,所以在或
0x6ff60
中尋找那個位置。objdump -d libc...``nm -g libc...