-g 옵션 없이 빌드한 커널이 예상치 않게 코어 덤프를 했을 때 무엇을 할 수 있을까요? 걱정하지 마시기 바랍니다. 모든 정보를 잃어버리진 않습니다.

물론, 손상된 커널의 덤프가 제대로 이루어지도록 설정할 필요가 있습니다. 이를 위해서, 윗부분의 내용에서 설정해야 할 옵션들을 참조하시기 바랍니다.

커널 컴파일 디렉토리로 가서 COPTFLAGS?=-O를 포함하는 라인을 수정하여 -g옵션을 추가해야 합니다(그러나 어떤 단계의 최적화 옵션도 수정하지 * 마시기* 바랍니다). 만약 잘못된 코드의 위치를 대충 짐작할 수 있을 경우(예: 위 예제에서의 pcvt 드라이버 코드), 해당 코드에 대한 오브젝트 파일을 삭제하고 커널을 다시 빌드하기 바랍니다. Makefile 내의 타임 스탬프가 바뀌기 때문에 trap.o와 같은 오브젝트 파일들이 다시 컴파일됩니다. 약간의 운이 따른다면, 추가된 -g 옵션은 생성된 코드에 대해 아무런 변화도 주지 않을 것이며, 따라서 몇가지 디버깅 심볼을 제외하고 문제를 일으킨 것과 같은 코드의 새로운 커널을 만들 수 있을 것입니다. 반드시 size(1) 명령을 사용하여 바뀌기 이전과 이후의 크기를 체크하여야 합니다. 만약 일치하지 않는다면, 여기서 포기하는 수 밖에 없읍니다.

위에서 설명한 대로 덤프를 확인하시기 바랍니다. 디버깅 심볼은 위 예제의 스택 추적에서 몇몇 함수들이 라인 번호 및 인수 리스트가 출력이 되지 않는 것에서 볼 수 있듯이 군데군데 불완전할 수 있습니다. 만약 디버깅 심볼이 더 필요하다면, 원하는 오브젝트 파일을 지우고 충분한 정보를 알아낼 수 있을 때까지 kgdb 세션을 반복해야 합니다.

위에서 설명한 내용은 모든 경우에 대해서 완전하게 동작한다고 보장할 수 없지만, 대부분의 경우에는 만족스럽게 동작합니다.


Note

http://www.kr.freebsd.org/handbook/handbook306.shtml

Posted by eoseontaek