source

Linux 커널 패닉을 읽고 이해하고 분석하고 디버깅하는 방법

factcode 2022. 8. 18. 23:24
반응형

Linux 커널 패닉을 읽고 이해하고 분석하고 디버깅하는 방법

다음 Linux 커널 덤프 스택 추적을 고려하십시오. 예를 들어 호출을 통해 커널 소스 코드에서 패닉을 트리거할 수 있습니다.panic("debugging a Linux kernel panic");:

[<001360ac>] (unwind_backtrace+0x0/0xf8) from [<00147b7c>] (warn_slowpath_common+0x50/0x60)
[<00147b7c>] (warn_slowpath_common+0x50/0x60) from [<00147c40>] (warn_slowpath_null+0x1c/0x24)
[<00147c40>] (warn_slowpath_null+0x1c/0x24) from [<0014de44>] (local_bh_enable_ip+0xa0/0xac)
[<0014de44>] (local_bh_enable_ip+0xa0/0xac) from [<0019594c>] (bdi_register+0xec/0x150)
  • unwind_backtrace+0x0/0xf8무엇인가.+0x0/0xf8대표할 수식어때요?
  • 의 C 코드를 표시하려면 어떻게 해야 합니까?unwind_backtrace+0x0/0xf8?
  • 공황의 내용을 어떻게 해석할 것인가?

이것은 일반적인 역추적일 뿐이며, 이러한 함수는 역순으로 호출됩니다(첫 번째 호출된 함수는 이전 함수에 의해 호출되고, 그 후에도 계속 호출됩니다).

unwind_backtrace+0x0/0xf8
warn_slowpath_common+0x50/0x60
warn_slowpath_null+0x1c/0x24
ocal_bh_enable_ip+0xa0/0xac
bdi_register+0xec/0x150

bdi_register+0xec/0x150는 기호 + 오프셋/길이입니다.커널의 개요와 커널의 상세 디버깅 방법에 대한 자세한 내용은 를 참조하십시오.또한 커널 디버깅에 관한 훌륭한 튜토리얼도 있습니다.

주의: 아래 Eugene에 의해 제안되었듯이 먼저 addr2line을 시도해 보십시오. 단, 디버깅 기호가 있는 이미지가 필요합니다.

addr2line -e vmlinux_with_debug_info 0019594c(+offset)

에 대한 두 가지 대안을 제시하겠습니다.addr2line적절한 타깃의 툴체인이 있다고 가정하면 다음 중 하나를 수행할 수 있습니다.

사용하다objdump:

  1. 의 위치를 확인합니다.vmlinux또는.kokernel root 디렉토리 아래에 있는 파일 및 오브젝트 파일을 분해합니다.

    objdump -dS vmlinux > /tmp/kernel.s
    
  2. 생성된 어셈블리 파일을 엽니다./tmp/kernel.s. 와 같은 텍스트에디터를 사용합니다.vim.에 가다unwind_backtrace+0x0/0xf8(즉, 주소 검색)unwind_backtrace+ 그offset마지막으로 소스코드에서 문제가 있는 부분을 찾았습니다.

사용하다gdb:

IMO, 훨씬 더 우아한 옵션은 하나뿐인 IMO를 사용하는 것입니다.gdb호스트 머신에 적절한 툴 체인이 있는 경우:

  1. 달려.gdb <path-to-vmlinux>.
  2. gdb 프롬프트에서 실행:list *(unwind_backtrace+0x10).

자세한 내용은 다음 리소스를 확인하십시오.

  1. 커널 디버깅 트릭
  2. GDB를 사용한 Linux 커널 디버깅

unwind_backtrace+0x0/0xf8음, 그건…+0x0/0xf8의 약자인가요?

첫 번째 번호(+0x0)는, 기능의 개시로부터의 오프셋입니다( ).unwind_backtrace(이 경우)를 참조해 주세요.두 번째 번호(0xf8)는 함수의 총 길이입니다.이 두 가지 정보를 고려하면 장애가 발생한 위치에 대해 이미 직감적으로 알고 있는 경우, 이것으로 충분히 의심을 확인할 수 있습니다(기능이 어느 정도 진행되었는지 대략 알 수 있습니다).

해당 명령의 정확한 소스 라인을 얻으려면(일반적으로 훈치보다 좋음)addr2line또는 다른 방법으로 대답할 수도 있습니다.

언급URL : https://stackoverflow.com/questions/13468286/how-to-read-understand-analyze-and-debug-a-linux-kernel-panic

반응형