Kernel

解讀Linux中未處理的信號異常

  • August 3, 2018

我正在嘗試調試在啟動過程中拋出未處理的信號 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...

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