JavaScript 확장의 네이티브 디버거 개체 - 디자인 및 테스트 고려 사항
이 항목에서는 JavaScript 확장에서 네이티브 디버거 개체를 사용하기 위한 디자인 및 테스트 고려 사항에 대해 설명합니다.
네이티브 디버거 개체는 디버거 환경의 다양한 구문과 동작을 나타냅니다. 개체를 JavaScript 확장으로 전달(또는 획득)하여 디버거의 상태를 조작할 수 있습니다.
디버거 개체 JavaScript 확장에 대한 자세한 내용은 JavaScript 확장의 네이티브 디버거 개체를 참조하세요.
JavaScript 작업에 대한 일반적인 내용은 JavaScript 디버거 스크립팅을 참조하세요.
디버거 데이터 모델 디자인 고려 사항
디자인 원칙
디버거 확장이 검색 가능하고 쿼리 가능하며 스크립팅 가능한 정보를 표시하도록 하려면 다음 원칙을 고려합니다.
- 정보는 필요한 위치에 가깝습니다. 예를 들어 레지스트리 키에 대한 정보는 레지스트리 키 핸들을 포함하는 지역 변수의 일부로 표시되어야 합니다.
- 정보는 구조화되어 있습니다. 예를 들어 레지스트리 키에 대한 정보는 키 유형, 키 ACL, 키 이름 및 값과 같은 별도의 필드에 표시됩니다. 즉, 텍스트를 구문 분석하지 않고 개별 필드에 액세스할 수 있습니다.
- 정보는 일관됩니다. 레지스트리 키 핸들에 대한 정보는 파일 핸들에 대한 정보와 가능한 한 유사한 방식으로 제공됩니다.
이러한 원칙을 지원하지 않는 이러한 접근 방식을 피합니다.
- 항목을 단일 평면 "주방 싱크대"로 구성하지 마세요. 구성된 계층 구조를 사용하면 사용자가 찾고 있는 항목에 대한 사전 지식 없이 찾고 있는 정보를 찾아 검색할 수 있으며 검색 가능성을 지원할 수 있습니다.
- 원시 텍스트의 화면을 출력하는 동안 단순히 모델로 이동하여 클래식 dbgeng 확장을 변환하지 마세요. 다른 확장으로는 구성할 수 없으며 LINQ 식을 사용하여 쿼리할 수 없습니다. 대신 데이터를 쿼리 가능한 별도의 필드로 분할합니다.
명명 지침
- 필드의 대문자화는 PascalCase여야 합니다. jQuery와 같은 다른 대/소문자에서 널리 알려진 이름에 대해 예외를 고려할 수 있습니다.
- 일반적으로 C++ 식별자에서 사용되지 않는 특수 문자를 사용하지 마세요. 예를 들어 "총 길이"(공백 포함) 또는 "[size]"(대괄호 포함)와 같은 이름을 사용하지 마세요. 이 규칙을 사용하면 이러한 문자가 식별자의 일부로 허용되지 않는 스크립팅 언어에서 더 쉽게 사용할 수 있으며 명령 창에서 더 쉽게 사용할 수 있습니다.
조직 및 계층 구조 지침
- 디버거 네임스페이스의 최상위 수준을 확장하지 마세요. 대신 디버거에서 기존 노드를 확장하여 정보가 가장 관련성이 큰 위치에 표시되도록 해야 합니다.
- 개념을 복제하지 마세요. 디버거에 이미 존재하는 개념에 대한 추가 정보를 나열하는 데이터 모델 확장을 만드는 경우 기존 정보를 새 정보로 바꾸려는 대신 확장합니다. 즉, 모듈에 대한 세부 정보를 표시하는 확장은 새 모듈 목록을 만드는 대신 기존 Module 개체를 확장해야 합니다.
- 무료 부동 유틸리티 명령은 Debugger.Utility 네임스페이스의 일부여야 합니다. 또한 적절한 하위 이름을 지정해야 합니다(예: Debugger.Utility.Collections.FromListEntry).
이전 버전과의 호환성 및 호환성이 손상되는 변경
게시된 스크립트는 해당 스크립트에 의존하는 다른 스크립트와의 호환성을 중단해서는 안 됩니다. 예를 들어 함수가 모델에 게시되는 경우 가능하면 동일한 위치와 동일한 매개 변수로 유지되어야 합니다.
외부 리소스 사용 안 하세요.
- 확장은 외부 프로세스를 생성해서는 안 됩니다. 외부 프로세스는 디버거의 동작을 방해할 수 있으며 다양한 원격 디버거 시나리오(예: dbgsrv 원격, ntsd 원격 및 "ntsd -d remotes")에서 잘못 작동합니다.
- 확장은 사용자 인터페이스를 표시해서는 안 됩니다. 사용자 인터페이스 요소를 표시하면 원격 디버깅 시나리오에서 잘못 동작하며 콘솔 디버깅 시나리오가 중단될 수 있습니다.
- 확장은 문서화되지 않은 메서드를 통해 디버거 엔진 또는 디버거 UI를 조작해서는 안 됩니다. 이로 인해 호환성 문제가 발생하고 UI가 다른 디버거 클라이언트에서 잘못 동작합니다.
- 확장은 문서화된 디버거 API를 통해서만 대상 정보에 액세스해야 합니다. win32 API를 통해 대상에 대한 정보에 액세스하려고 하면 많은 원격 시나리오와 보안 경계를 넘어 일부 로컬 디버깅 시나리오에서도 실패합니다.
Dbgeng 특정 기능을 사용하지 않음
확장으로 사용하려는 스크립트는 가능하면 dbgeng 관련 기능(예: "클래식" 디버거 확장 실행)에 의존해서는 안 됩니다. 스크립트는 데이터 모델을 호스트하는 모든 디버거를 기반으로 사용할 수 있어야 합니다.
디버거 확장 테스트
확장은 다양한 시나리오에서 작동할 것으로 예상됩니다. 일부 확장은 시나리오(예: 커널 디버깅 시나리오)와 관련이 있을 수 있지만 대부분의 확장은 모든 시나리오에서 작동하거나 지원되는 시나리오를 나타내는 메타데이터가 있어야 합니다.
커널 모드
- 라이브 커널 디버깅
- 커널 덤프 디버깅
사용자 모드
- 라이브 사용자 모드 디버깅
- 사용자 모드 덤프 디버깅
또한 이러한 디버거 사용 시나리오를 고려합니다.
- 다중 프로세스 디버깅
- 다중 세션 디버깅(예: 단일 세션 내의 덤프 + 라이브 사용자)
원격 디버거 사용
원격 디버거 사용 시나리오를 사용하여 적절한 작업을 테스트합니다.
- dbgsrv 원격
- ntsd 원격
- ntsd -d 원격
자세한 내용은 CDB 및 NTSD를 사용하여 디버깅 및프로세스 서버 활성화를 참조하세요.
회귀 테스트
새 버전의 디버거가 릴리스될 때 확장의 기능을 확인할 수 있는 테스트 자동화의 사용을 조사합니다.