-
-
사용자 공간 애플리케이션의 디버깅- 직접적인 예외 를 던지고 강제 종료되는 경우가 많다.
디버깅을 위해 콘솔 출력을 부담없이 사용할 수 있다.- 시스템에 치명적일 확률이
커널 버그보다 상대적으로 적다.
-
커널디버깅 과사용자 공간 애플리케이션의 디버깅 비교커널의 버그는 명확하지 않다.- 발생 확률이 낮은 경쟁 상황
- 상황과 환경에 따라 달라지는 성능
- 특정 조건에서만 발생하는 버그
커널에 콘솔 출력은 제한적이다.- 커널 함수 중에는 일 초에 여러 번 호출 되는 경우도 있기에 출력 오버플로우 를 고려해야 한다. 이를 해결하기 위해 출력 빈도와 출력 횟수 제한을 고려해야 할 것이다.
- 시스템 부팅 전에는 콘솔 출력을 할 수 없다. 이를 해결하기 위해
early_printk()를 사용하거나 하드웨어를 사용해 외부로 통신하는 방법을 사용할 수 있다.
커널의 버그는 시스템에 치명적일 확률이 크다.커널이 높은 수준의 버그를 내면 시스템 전체가 망가지는 리스크를 안고 있다.
-
-
- 둘 다 콘솔 출력 함수다.
printf()- 사용자 공간 함수
로그수준을 가지지 않는다.
printk()- 커널 공간 함수
%f,%e등 실수형에 대해 성능상의 이유로 캐스팅을 지원하지 않는다.로그수준을 가지며, 이를 이용하여 출력을 여부를 결정한다.
-
디버거는 사용자에 의해breakpoint로 지정된 명령어의 첫번째 바이트(OP code) 값을CC(int 3)로 변경한다.디버깅의 대상인 프로세스가 사용자가 지정한breakpoint에 도달하면CPU는int 3예외를 던진다.- 운영체제는
int 3예외를 받고 현재 프로세스가디버깅되고 있음을 알아챈다. - 그 후 운영체제는
디버거에게breakpoint에 도달했음을 알린다. breakpoint에 도착하여 프로세스가 중단되고 난 후,디버거는CC로 변경되었던 첫번째 바이트 값을 원래대로 돌려놓는다.디버거는Trap Flag를 설정하고, 프로세스를 재개한다.TF는CPU가single-step mode로 동작할 수 있게 해준다.- 1-7을 반복한다.
-
oops는 스스로 문제를 해결하거나 종료하는 방법으로 버그를 처리할 수 없는 전체 시스템 관리자인커널이 콘솔 출력, 역추적 정보 제공 등으로 버그를 알리는 방법이다.oops는 미해석 상태 일 때는 메모리 주소가 그 주소에 해당하는 함수로 변환되어 출력되지 않는다.ksymoops는 미해석 상태 인oops를 해석 상태 로 변환해준다. 다음 명령어를 실행하면 된다.ksymoops saved_oops.txt