
driver개발 중 bosd가 발생하여 분석하는 내용에 대해서 작성해본다.
VM에서 bosd가 발생했다. 별다른 설정한적 없었지만 C:\windows를 확인하니 MiniDump 폴더에 미니 덤프가 생성된 것을 확인할 수 있다.

레지스트리에서 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\CrashControl 경로에서 덤프 저장 경로 및 덤프 파일 종류를 설정할 수 있다. 
CrashDumpEnabled가 3으로 설정된 것은 MiniDump를 생성한다는 의미이다.
https://learn.microsoft.com/ko-kr/troubleshoot/windows-server/performance/memory-dump-file-options 공식 사이트에서 자세한 내용을 확인할 수 있다. 
첫 번째로 해야하는 것은 !analyze -v 명령어를 통해서 분석을 하는 것이다.

공부를 하면서 안것인데 빨간 박스인 WDF_VIOLATION (10d)가 오류가 난 원인인 것이다. Bug Check Code라고도 하는데 MSDN을 통해 보면 각 코드에 대해서 Argument가 정의 되어있다.
https://learn.microsoft.com/ko-kr/windows-hardware/drivers/debugger/bug-check-0x10d---wdf-violation


Arg1이 0x3이므로 Arg2가 WDFREQUEST HANDLE인 것을 확인할 수 있다. 즉 이번 fault가 발생한 원인은 미해결 참조 때문이고 Arg3를 보면 남아있는 참조 수가 1이라고 나와있는 것을 볼 수 있다.
이 힌트를 보고 대략적으로 왜 문제가 발생했는지 1차적으로 알 수 있다.
k 명령어를 입력하면 호출스택을 확인할 수 있다.

pdb를 symbol로 등록해놓은 상태라서 정확히 개발 중인 pico_driver의 어떤 함수에서 발생한지 확인할 수 있다. PicoInferenceReadComplete함수에서 발생한 것을 한눈에 확인할 수 있다.
IOCTL을 처리하는 소스에 브레이크를 잡은 뒤, 다시 상황을 재현하기 위해서 재시작하여 windbg로 분석한다.

dv 명령어로 현재 로컬 변수들을 확인할 수 있다.

mfc에서 image 64*64 bytes + cmd 구조로 총 4097 byte를 보냈는데 정확한 것을 확인할 수 있다.
PINFERENCE_CONTEXT infContext = (PINFERENCE_CONTEXT)ExAllocatePoolWithTag(NonPagedPool, sizeof(INFERENCE_CONTEXT), 'ifnc');
if (!infContext) {
DbgPrint("[pico_driver] ERROR: Failed to allocate inference context\n");
status = STATUS_INSUFFICIENT_RESOURCES;
WdfRequestComplete(Request, status);
return;
}
Context를 만들어서 힙 할당을 통해서 Request를 새로 만들어주는 로직을 사용했다. 그러나 디버깅을 통해 확인할 결과 Request는 Complete Rountine에 등록한 콜백함수의 매개변수로 동일한 Request가 들어온다는 것을 확인하여 재사용하도록 했다.

위 다이어그램의 흐름처럼 정상적으로 동작하는 것을 확인하였다.
커널 crash가 발생하여 bosd가 발생하든 appication을 개발 중 process가 crash가 발생하든 dump를 분석하여 어느 곳에서 문제가 발생했는지 분석할 수 있다는 자신감이 있는 것 같다. 물론 모든 명령어를 알지는 못하지만 ai를 활용하여 검색하면서 디버깅한다면 해결할 수 있을 것이다.