22.3. 덤프의 사후(Post-Mortem) 분석

예상치 않게 커널이 코어로 덤프하고, 그 커널이 config -g을 이용하여 컴파일 된 것이 아니었을 때 무엇을 할 수 있을까요? 모든 정보를 잃어버리지 않습니다. 당황하지 마세요!

물론 충돌 내용이 덤프될 수 있도록 해야 합니다. 이를 위해서 명시해야 할 옵션들에 대해서는 윗 내용을 참고하기 바랍니다.

커널 설정 디렉토리로 가서 (/usr/src/sys/arch/conf) 설정 파일을 수정해야 합니다. 다음 줄의 주석을 풀기 바랍니다(없을 경우에는 추가하기 바랍니다).

    makeoptions    DEBUG=-g                #Build kernel with gdb(1) debug symbols

커널을 다시 빌드하십시오. Makefile의 time stamp가 바뀌었기 때문에, trap.o와 같은 일부 오브젝트 파일들이 다시 빌드될 것입니다. 약간의 행운이 따른다면, -g 옵션이 추가되어도 생성된 코드가 바뀌지 않을 수 있으며 이에 따라 같은 오류가 발생하면서도 디버깅 심볼이 추가된 새로운 커널을 얻을 수 있습니다. 최소한 이전 커널과 새로운 커널의 길이를 size(1) 명령으로 체크하는 과정이 필요합니다. 만약 불일치 하는 것이 있다면, 아마 여기서 포기해야 할 것입니다.

위에서 설명한 대로 덤프를 확인하시기 바랍니다. 디버깅용 심볼은 몇몇 군데에서 불완전할 수 있으며, 따라서 스택 추적 시 일부 함수들의 줄 번호 및 인수 리스트가 출력되지 않을 수 있습니다. 디버깅 심볼이 더 필요할 때에는 해당 오브젝트 파일을 지우고 충분한 정보를 얻어낼 때까지 gdb -k 세션을 반복해야 합니다.

이 모든 과정들이 제대로 동작한다는 보장을 할 수 없지만, 대부분의 경우에 만족스럽게 동작합니다.