我正在尝试调试一个在启动过程中抛出未处理的信号 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 以十六进制加载0x2000049000
,0x13e000
长度为字节。信号发生的地址是0x00000020000b8f60
。为了找出相对于 libc 的错误发生位置,请计算0x00000020000b8f60
- 0x2000049000
。
我明白了,所以在或0x6ff60
中查找该位置。objdump -d libc...
nm -g libc...