Guillermo Austin Kim

Sources

Posts

998 posts

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

Guillermo Austin Kim|2018년 1월 5일

가끔 모든 프로세스의 스택 주소를 알고 싶을 때가 있어요. 이럴 때 쓰면 좋은 명령어가 있어 소개합니다. 이 기능이 Trace32보다 확실히 좋은 것 같아요. 우선 init process의 TCB(Task descriptor) 주소를 파악해요.흠, 0xffffffc001580e40이네요.crash64> p &init_task$1 = (struct task_struct *) 0xffffffc001580e40 모든 프로세스들이 task_struct.tasks 링크드 리스트에 매달려 있잖아요?그럼 아래 명령어를 쳐서 task_addr란 파일로 리다이렉트 시켜요.list task_struct.tasks -h 0xffffffc001580e40 > task_addr

crash-utility(crash tool) - ps command

Guillermo Austin Kim|2018년 1월 5일

커널 패닉 디버깅할 때 crash-utility를 아주 많이 쓰죠. 수 많은 명령어 중 ps를 소개하려고 합니다. ps -p 프로세스 전체의 부모와 자식 프로세스 정보를 보여줘요.crash64> ps -pPID: 0 TASK: ffffffc001580e40 CPU: 0 COMMAND: "swapper/0" PID: 0 TASK: ffffffc001580e40 CPU: 0 COMMAND: "swapper/0" PID: 0 TASK: ffffffc0f865f300 CPU: 1 COMMAND: "swapper/1" PID: 0 TASK: ffffffc001580e40 CPU: 0 COMMAND: "swapper/0" PID: 0 TASK

console-ramoops - kmsg_dump/pstore_dump

Guillermo Austin Kim|2018년 1월 3일

커널이 리셋되기 전 마지막 동작을 어떻게 수행했는지 어떻게 알 수 있을까요?보통 커널 로그를 열어보면 알 수 있죠. 그런데 리부팅이나 커널 패닉 동작 시 커널 로그를 저장하는 Ramoops(램웁스)란 기능이 있어요.Ramoops 메시지를 보면서 서로 다른 드라이버 담당자들이 싸우는 걸 종종 볼 수 있는데요.서로 자기 문제가 아니라고 다투는 거죠. 리눅스 커널 시스템 전반을 디버깅하고 관리하는 개발자는 커널 드라이버에 디버깅 정보가 어떤 과정으로 저장되고 처리되는지 깊히 있게 알 필요가 있어요.특정 재현 경로에서 어떤 문제가 재현이 될 때 디버깅 정보를 시스템에 남겨서 문제의 원인을 찾아야 할 때가 있거든요.이럴 때 디버깅 정보를 저장할 수 있는 콘솔 드라이버를 새롭게 짜야 할 수도 있어요. 자 이제

input_event 처리 - ftrace log(디버깅)

Guillermo Austin Kim|2018년 1월 3일

input event를 주로 전달하는 디바이스는 터치 드라이버이거든요.그럼 터치 드라이버가 동작할 때 실제 input event가 처리되는 ftrace log를 점검해보도록 할께요. [1]: 225번 IRQ가 Trigger되네요. irq 이름은 touch군요.[2]: 225번 IRQ는 irq_thread로 등록된 것으로 보이네요. 바로 "irq/225-touch" 란 프로세스를 wakeup 시키네요. [3]: 여러번 "irq/225-touch" 란 프로세스가 preemption된 다음에 다시 wakeup되네요.[4]: "irq/225-touch" 프로세스가 evdev_pass_values 함수 호출로 인풋 이벤트를 전달해요.[5]: "InputReader"란 프로세스를 실행시켜서 해당 input event

mutex lock vs spinlock ( 재현 상황 )

Guillermo Austin Kim|2018년 1월 2일

특정 함수나 콜스택 동작에서 lock을 두 번 획득하려고 했을 때 mutex lock과 spinlock 재현 상황은 아주 달라요. busy-waiting이라는 말을 들어보셨나요? spinlock은 lock을 획득하기 전까지 사채업자 같이 계속 특정 루프를 돌면서 계속 기다려요.ticket spinlock의 멤버 중에 owner와 next값이 있잖아요. owner가 next와 같으면 spinlock을 획득할 수 있는 조건이거든요.그 조건을 만족할 때 까지 계속 기다리죠. 계속 기다린다는 건 뭘 뜻할까요? 혹시나 spinlock_irq 함수를 호출하면요?preemption이 동작하지 않고 IRQ도 trigger되지 않게 되거든요. 대부분의 경우 spinlock 동작에 문제가 생기면 Watchdog Rese