가끔 모든 프로세스의 스택 주소를 알고 싶을 때가 있어요.
이럴 때 쓰면 좋은 명령어가 있어 소개합니다. 이 기능이 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,
'[Debugging] Tips' 카테고리의 다른 글
[crash-utility]wakelock - rbtree debugging(디버깅) (0) | 2023.05.04 |
---|---|
crash-utility(crash tool) - ps command (0) | 2023.05.04 |
crash-utility(crashtool) - runq awk 명령어 (0) | 2023.05.04 |
[crash-utility] wakelock 디버깅(rbtree: wakelocks_tree) (0) | 2023.05.04 |
[Best][Kernel][Stability] 스택 오염(Stack Corruption) 디버깅 (0) | 2023.05.04 |