[ Section 9 ] 리눅스 커널 디버깅 기본 기능 - dump_stack(), sysrq 매직키

hyejinkwon·2024년 5월 3일

Linux Kernel

목록 보기
10/11
post-thumbnail

dump_stack() 함수

dump_stack() 함수

  • stack trace를 커널 로그로 출력
  • 예외 처리나 심각한 오류가 있는 조건에서 사용

dump_stack() 함수 사용 방법

  • #include <linux/kernel.h> 헤더를 추가한 후 함수 호출

주로 심각한 오류가 있는 조건에서 호출

shost_printk부분 error message 출력 됨

int scsi_queue_work(struct Scsi_Host *shost, struct work_struct *work)
{
	if (unlikely(!shost->work_q)) {
		shost_printk(KERN_ERR, shost,
			"ERROR: Scsi host '%s' attempted to queue scsi-work, "
			"when no workqueue created.\n", shost->hostt->name);
		dump_stack();

		return -EINVAL;
	}

	return queue_work(shost->work_q, work);
}

dump_stack() 함수 추가하기 : rpi_kernel_debug_stat_set()

커널 로그에서 본 stack trace

  • PID도 확인 가능

dump_stack()함수로 커널 로그에서 call stack 확인하기

dump_stack() 함수 패치 코드

/kernel/fork.c

+ static int debug_kernel_thread = 1;

long _do_fork(unsigned long clone_flags, unsigned long stack_start, unsigned long stack_size, 
			  int __user *parent_tidptr, int __user *child_tidptr, unsigned long tls)
{
	...

	p = copy_process(clone_flags, stack_start, stack_size,
			 child_tidptr, NULL, trace, tls);
+
+   if (debug_kernel_thread) {
+		printk("[+][%s] process n", current->comm);
+       dump_stack();
+   }       

/kernel/fork.c kernel version 5.4 이상

+ static int debug_kernel_thread = 1;

pid_t kernel_clone(struct kernel_clone_args *args)
{
	...

	p = copy_process(NULL, trace, NUMA_NO_NODE, args);
    
+
+   if (debug_kernel_thread) {
+		printk("[+][%s] process n", current->comm);
+       dump_stack();
+   }   

dump_stack() 함수 주의 사항

  • 내부에서 현재 실행 중인 프로세스 stack 주소를 읽어 stack에 push된 Frame Pointer Register를 읽는다.
  • ARM 아키텍처의 함수 호출 규약에 따라 Frame Pointer Register를 읽어서 함수 호출 내역을 추적하는 동작을 반복한다.

커널 디버깅 기능 : sysrq 매직 키

sysrq 매직 키

  • 커널 로그를 통해 리눅스 시스템에 대한 다양한 정보를 출력해준다.

  • The magic SysRq key is a key combination understood by the linux kernel, which allows the user to perform various low-level commands regardless of the system's state. It is often used to recover from freezes, or to reboot a computer without corrupting the filesystem.

CONFIG_MAGIC_SYSRQ

  • echo-<magic> > /proc/sysrq-trigger

magic keys

  • s : sync(dirty page를 disk로 flush)
  • u : read-only로 remount
  • t : 현재 task를 출력
  • c : kernel crash 유발
  • b : reboot

echo 명령어 예시

echo -h > /proc/sysrq-trigger
dmesg

0개의 댓글