Interpretando a exceção de sinal não manipulado no Linux

1

Estou tentando depurar um protótipo de CPU que lança sinal não tratado 11s e sinaliza 7s no processo de inicialização.

Aqui está o que o kernel imprime. Eu adicionei instruções extras de impressão ao kernel para depurar exatamente quais processos do espaço do usuário estão exibindo o erro.

[    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

Aqui eu vejo um sinal não manipulado 7 no readlink, que está executando alguma função libc. Minha pergunta é: como eu determino qual instrução na libc está causando isso? A impressão do status da máquina não inclui a instrução, apenas o sepc. Como a libc é dinamicamente vinculada, não sei como encontrar sua referência no código da libc.

    
por Jerry Zhao 03.08.2018 / 19:02

1 resposta

2

Se eu estiver lendo a fonte do kernel corretamente, esta linha:

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

Informa o que você precisa saber. A libc é carregada em% hexadecimal0x2000049000 e é 0x13e000 bytes. O endereço em que o sinal aconteceu é 0x00000020000b8f60 . Para descobrir onde, em relação à libc, o erro acontece, calcule 0x00000020000b8f60 - 0x2000049000 .

Eu recebo 0x6ff60 , portanto, procure esse local em objdump -d libc... ou nm -g libc... .

    
por 03.08.2018 / 19:57