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

여기에서는 일부 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.

알겠습니다. 0x6ff60or에서 해당 위치를 찾아보세요.objdump -d libc...nm -g libc...

관련 정보