본문 바로가기

[Debugging] Tips

crash-utility(crashtool) - 리다이렉션 커맨드

가끔 모든 프로세스의 스택 주소를 알고 싶을 때가 있어요. 
이럴 때 쓰면 좋은 명령어가 있어 소개합니다. 이 기능이 Trace32보다 확실히 좋은 것 같아요.
 
우선 init process의 TCB(Task descriptor) 주소를 파악해요.
흠, 0xffffffc001580e40이네요.
crash64> p &init_task
$1 = (struct task_struct *) 0xffffffc001580e40 <init_task>
 
모든 프로세스들이 task_struct.tasks 링크드 리스트에 매달려 있잖아요?
그럼 아래 명령어를 쳐서 task_addr란 파일로 리다이렉트 시켜요.
list task_struct.tasks -h 0xffffffc001580e40 > task_addr
 
task_addr 파일을 확인해보면 task descriptor 주소로 가득차 있네요.
crash64> cat task_addr
ffffffc001580e40
ffffffc0f8658000
ffffffc0f8658b80
ffffffc0f8659700
ffffffc0f865b980
ffffffc0f865c500
 
아래 명령어로 모든 프로세스들의 스택 정보를 볼 수 있어요.
crash64> struct task_struct.stack < task_addr
  stack = 0xffffffc001574000 <init_thread_union>
  stack = 0xffffffc0f8644000
  stack = 0xffffffc0f8664000
  stack = 0xffffffc0f8678000
  stack = 0xffffffc0f868c000
  stack = 0xffffffc0f869c000
  stack = 0xffffffc0f86a0000
 
위 명령어로 스택 정보는 확인 가능한데, 어떤 프로세스인지 알 수가 없네요.
이럴 때 아래 명령어를 치면 좋아요.
crash64> task -R stack < task_addr
PID: 0      TASK: ffffffc001580e40  CPU: 0   COMMAND: "swapper/0"
  stack = 0xffffffc001574000 <init_thread_union>,
 
PID: 1      TASK: ffffffc0f8658000  CPU: 1   COMMAND: "init"
  stack = 0xffffffc0f8644000,
 
PID: 2      TASK: ffffffc0f8658b80  CPU: 2   COMMAND: "kthreadd"
  stack = 0xffffffc0f8664000,
 
PID: 3      TASK: ffffffc0f8659700  CPU: 0   COMMAND: "ksoftirqd/0"
  stack = 0xffffffc0f8678000,
 
PID: 6      TASK: ffffffc0f865b980  CPU: 1   COMMAND: "kworker/u8:0"
  stack = 0xffffffc0f868c000,
 
PID: 7      TASK: ffffffc0f865c500  CPU: 0   COMMAND: "rcu_preempt"
  stack = 0xffffffc0f869c000,
 
PID: 8      TASK: ffffffc0f865d080  CPU: 1   COMMAND: "rcu_sched"
  stack = 0xffffffc0f86a0000,
 
PID: 9      TASK: ffffffc0f865dc00  CPU: 0   COMMAND: "rcu_bh"
  stack = 0xffffffc0f86a4000,