2011-11-09 2 views
1

Linux 크래시 덤프에서 USER 프로세스를 디버깅하려고했습니다. 크래시 덤프에 갈리눅스 커널 크래시 덤프에서 "USER 프로세스"백 트레이스를 확인하는 방법

일반적인 단계는 다음과 같습니다

  1. 덤프이있는 경로로 이동합니다.
  2. crash kernel_link dump.201104181135 명령을 사용하십시오.

여기서 kernel_link은 vmlinux 이미지 용으로 만든 소프트 링크입니다.

이제 CRASH 프롬프트가 표시됩니다. 다음 명령 foreach <PID Of the process> bt 예를 실행하는 경우 :

crash> **foreach 6920 bt** 

**PID: 6920 TASK: ffff88013caaa800 CPU: 1 COMMAND: **"**climmon**"**** 

#0 [ffff88012d2cd9c8] **schedule** at ffffffff8130b76a 
#1 [ffff88012d2cdab0] **schedule_timeout** at ffffffff8130bbe7 
#2 [ffff88012d2cdb50] **schedule_timeout_uninterruptible** at ffffffff8130bc2a 
#3 [ffff88012d2cdb60] **__alloc_pages_nodemask** at ffffffff810b9e45 
#4 [ffff88012d2cdc60] **alloc_pages_curren**t at ffffffff810e1c8c 
#5 [ffff88012d2cdc90] **__page_cache_alloc** at ffffffff810b395a 
#6 [ffff88012d2cdcb0] **__do_page_cache_readahead** at ffffffff810bb592 
#7 [ffff88012d2cdd30] **ra_submit** at ffffffff810bb6ba 
#8 [ffff88012d2cdd40] **filemap_fault** at ffffffff810b3e4e 
#9 [ffff88012d2cdda0] **__do_fault** at ffffffff810caa5f 
#10 [ffff88012d2cde50] **handle_mm_fault** at ffffffff810cce69 
#11 [ffff88012d2cdf00] **do_page_fault** at ffffffff8130f560 
#12 [ffff88012d2cdf50] **page_fault** at ffffffff8130d3f5 

    RIP: 00007fd02b7e9071 RSP: 0000000040e86ea0 RFLAGS: 00010202 
    RAX: 0000000000000000 RBX: 0000000000000000 RCX: 00007fd02b7e9071 
    RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000040e86ec0 
    RBP: 0000000040e87140 R8: 0000000000000800 R9: 0000000000000000 
    R10: 0000000000000000 R11: 0000000000000202 R12: 00007fff16ec43d0 
    R13: 00007fd02bcadf00 R14: 0000000040e87950 R15: 0000000000001000 
    ORIG_RAX: ffffffffffffffff CS: 0033 SS: 002b 

당신이 커널 스케줄링/처리 페이지 오류에 사용되는 기능이 있지만 여기에 사용자 프로세스 (예에서 실행 된 기능을 보여줍니다 위의 역 추적을 확인하세요. climmon). 그래서이 프로세스에서 실행 된 기능을 볼 수 없어이 프로세스를 디버그 할 수 없습니다. 아무도이 사건을 도와 줄 수 있습니까?

답변

1

커널 크래시 덤프에서 사용자 공간 프로세스를 디버깅 할 수 없습니다. 커널이 파손 되었다면 커널의 결함 일 것이고 일부 사용자 공간 프로세스는 아닙니다. 커널은 사용자 공간 프로세스가 실행 되더라도 항상 올바르게 작동해야합니다. 사용자 공간 프로세스를 디버그하려면 ltrace, strace 및 gdb를 살펴 보는 것이 좋습니다.

게르 틀리 from toptal.com

0

나는 그것이 당신이 원하는 것인지 모른다. 그러나 크래시 확장 호출 "gcore"를 시도 할 수 있습니다. 커널 크래시 파일에서 사용자 프로세스 코어를 덤프 할 수 있습니다.

또한 덤프 할 때 사용자 페이지를 포함해야합니다.

1

로드 gdb를 덤프 : GDB의 vmlinux

하중이 gdb를 매크로 : http://www.kernel.org/doc/Documentation/kdump/gdbmacros.txt

(GDB) 소스가 gdbmacros.txt가

"모든 스레드 스택을 덤프를 사용하여 'BTT가'에 대한 추적 CONFIG_FRAME_POINTER 컴파일 커널 "

(GDB)

사용 'bttnobp'에 BTT"덤프 ! CONFIG_FRAME_POINTER와 함께 컴파일 된 모든 스레드 스택 추적 :

(bdb) bttnobp