커널 모드에서 충돌하면 디버거 자체 에서조차 데이터 구조 이 (가) 인 메모리에있는 모든 데이터가 손상 될 수 있습니다. 그 방탄을 만드는 것은 어렵습니다.
정상적인 디버깅에서는 디버거와 디버깅중인 두 개의 완전히 격리 된 프로세스가 있습니다. 그들은 평등하게 창조 된 "동료"입니다. 디버깅중인 프로세스는 디버거가 무엇을 하든지 관계없이 디버거를 만질 수 없습니다. 반면에 디버거는 모든 일반 사용자 프로세스에 항상 적용 가능한 고정적이고 예측 가능한 방식으로 디버깅되는 프로세스와 상호 작용할 수 있습니다.
예 : 로컬 디버깅의 경우 키보드 인터페이스를 디버그 하시겠습니까? 아니면 시리얼 포트를 통해 RS232 코드를 디버깅 하시겠습니까? 네트워크를 통해 NIC 드라이버 또는 네트워크 스택? 그 중 하나에 중단 점을 설정하면 디버거를 제어하는 장치에 액세스 할 수 없기 때문에 복구 할 수 없습니다. 최악의 경우, 어떻게 커널 디버거를 디버그하겠습니까? GDB를 사용하면 적어도 이론적으로 GDB 인스턴스를 GDB의 다른 인스턴스에 연결할 수 있습니다. 커널 공간에서는 사물을 중재 할 수있는 위의 층이 없기 때문에 불가능합니다.
좋아, 나는 그것을 이해한다고 생각한다. 내가 잘못했다면 나를 바로 잡으십시오 : 그것은 커널 모드에서 실행중인 모든 프로세스가 동일한 주소 공간을 공유한다는 것을 의미합니까? 그리고 그것이 사실이라면 그 이유가 있습니까? – qdii
예 커널 주소 공간이 모든 프로세스에서 공유됩니다. linux 커널 용 일반 커널 코드 (특정 장치 용 드라이버가 아님)가 있으면 QEMU를 사용할 수 있습니다. QEMU에서 실행되는 소프트웨어에 gdb를 첨부 할 수 있으므로 gdb를 사용하는 사용자 코드와 같은 커널 코드를 단계별로 실행할 수 있습니다. 그러나 코드가 사용 가능한 에뮬레이션이없는 장치 드라이버와 같은 장치에만 해당되는 경우 소프트웨어가 실행되지 않습니다. – Saurabh
@ user420536 질문은 실제로 Linux 또는 아키텍처를 지정하지 않습니다. 매우 다른 경우가 있습니다. – Flexo