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
:
의 위치를 확인합니다.
vmlinux
또는.ko
kernel root 디렉토리 아래에 있는 파일 및 오브젝트 파일을 분해합니다.objdump -dS vmlinux > /tmp/kernel.s
생성된 어셈블리 파일을 엽니다.
/tmp/kernel.s
. 와 같은 텍스트에디터를 사용합니다.vim
.에 가다unwind_backtrace+0x0/0xf8
(즉, 주소 검색)unwind_backtrace
+ 그offset
마지막으로 소스코드에서 문제가 있는 부분을 찾았습니다.
사용하다gdb
:
IMO, 훨씬 더 우아한 옵션은 하나뿐인 IMO를 사용하는 것입니다.gdb
호스트 머신에 적절한 툴 체인이 있는 경우:
- 달려.
gdb <path-to-vmlinux>
. - gdb 프롬프트에서 실행:
list *(unwind_backtrace+0x10)
.
자세한 내용은 다음 리소스를 확인하십시오.
인
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
'source' 카테고리의 다른 글
MSVS가 +0을 최적화하지 않는 이유는 무엇입니까? (0) | 2022.08.18 |
---|---|
vueJ 및 웹 팩과 함께 서드파티 jquery 라이브러리 사용 (0) | 2022.08.18 |
스토어 디스패치 기능이 있는 vue-test-utils 및 jest를 사용하여 컴포넌트에 Vue 메서드의 Vue 테스트 케이스를 작성하는 방법 (0) | 2022.08.18 |
VUEX Store에서 serverMiddleware API로 데이터를 전달하는 방법 (0) | 2022.08.18 |
vuexjs 인수 getter (0) | 2022.08.18 |