起動中に未処理の信号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
ここでは、いくつかのlibc機能を実行しているreadlinkで未処理の信号7が表示されます。私の質問は、libcのどのコマンドがこの問題を引き起こしているのかをどうやって確認できますか?機械状態の印刷物には指示がなく、sepcsのみが含まれています。 libcは動的にリンクされているので、libcコードでそれへの参照を見つける方法がわかりません。
答え1
カーネルのソースコードを正しく読み取ると、次の行が表示されます。
readlink[85]: unhandled signal 7 code 0x1 at 0x00000020000b8f60 in libc-2.26.so[2000049000+13e000]
知っておくべきことをお知らせします。 libcは長さ0x2000049000
がバイトの16進数でロードされます0x13e000
。信号が発生するアドレスはです0x00000020000b8f60
。 libcに関してエラーが発生した場所を見つけるには、0x00000020000b8f60
-を計算します0x2000049000
。
わかりました。0x6ff60
orでその場所を見つけてください。objdump -d libc...
nm -g libc...