解释Linux中未处理的信号异常

解释Linux中未处理的信号异常

我正在尝试调试一个在启动过程中抛出未处理的信号 11 和信号 7 的原型 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 的代码中找到它的引用。

答案1

如果我正确地阅读了内核的源代码,则这一行:

readlink[85]: unhandled signal 7 code 0x1 at 0x00000020000b8f60 in libc-2.26.so[2000049000+13e000]

告诉您您需要了解的内容。 libc 以十六进制加载0x20000490000x13e000长度为字节。信号发生的地址是0x00000020000b8f60。为了找出相对于 libc 的错误发生位置,请计算0x00000020000b8f60- 0x2000049000

我明白了,所以在或0x6ff60中查找该位置。objdump -d libc...nm -g libc...

相关内容