디버거가 필요하지 않은 기호를 검색하지 않도록 방지

최종 업데이트 날짜:

  • 2007년 5월 27일

드라이버를 디버깅하는 동안 흥미로운 중단점에 도달하면 디버거가 소유하지 않고 디버깅 작업에는 중요하지 않은 드라이버에 대한 기호를 로드하려고 시도하는 동안에만 매우 오랜 시간 동안 일시 중지됩니다. 왜 그럴까요?

기본적으로 기호는 필요에 따라 디버거에 의해 로드됩니다. 이를 지연 기호 로드 또는 지연 기호 로드라고 합니다. 디버거는 기호 표시를 호출하는 명령을 실행할 때마다 기호를 찾습니다. 이는 현재 컨텍스트에서 유효하지 않은 watch 변수(예: 현재 스택 프레임에 존재하지 않는 지역 변수)를 설정한 경우 컨텍스트가 변경될 때 유효하지 않기 때문에 중단점에서 발생할 수 있습니다. 단순히 기호 이름을 잘못 입력하거나 잘못된 디버거 명령을 실행하는 경우에도 발생할 수 있습니다. 디버거가 일치하는 기호를 찾기 시작합니다.

왜 그렇게 오래 걸리나요? 이는 기호 이름이 정규화되었는지 아니면 정규화되지 않은지에 따라 달라집니다. 정규화된 기호 이름 앞에는 기호가 포함된 모듈의 이름(예: myModule!myVar)이 있습니다. 정규화되지 않은 기호 이름은 모듈 이름(예: myOtherVar)을 지정하지 않습니다.

정규화된 이름의 경우 디버거는 지정된 모듈에서 기호를 찾고, 모듈이 아직 로드되지 않은 경우 모듈을 로드합니다(모듈이 존재하고 기호가 포함되어 있다고 가정). 이것은 상당히 빠르게 발생합니다.

정규화되지 않은 이름의 경우 디버거는 기호가 포함된 모듈을 "알 수"없으므로 모두 확인해야 합니다. 디버거는 먼저 로드된 모든 모듈에서 기호를 검사한 다음 로드된 모듈의 기호와 일치시킬 수 없는 경우 다운스트림 저장소부터 시작하여 기호 서버로 끝나는 모든 언로드된 모듈을 로드하여 검색을 계속합니다. 분명히, 이것은 많은 시간이 걸릴 수 있습니다.

정규화되지 않은 기호에 대한 자동 로드를 방지하는 방법

SYMOPT_NO_UNQUALIFIED_LOADS 옵션은 정규화되지 않은 기호를 검색할 때 디버거의 모듈 자동 로드를 사용하지 않도록 설정하거나 사용하도록 설정합니다. SYMOPT_NO_UNQUALIFIED_LOADS 설정되고 디버거가 정규화되지 않은 기호와 일치하려고 하면 이미 로드된 모듈만 검색하고 언로드된 모듈을 로드하여 검색을 계속하는 대신 기호와 일치할 수 없는 경우 검색을 중지합니다. 이 옵션은 정규화된 이름 검색에 영향을 주지 않습니다.

SYMOPT_NO_UNQUALIFIED_LOADS 기본적으로 꺼져 있습니다. 이 옵션을 활성화하려면 -snul 명령줄 옵션을 사용하거나 디버거가 실행되는 동안 .symopt+0x100 또는 .symopt-0x100 사용하여 옵션을 각각 켜거나 끕니다.

SYMOPT_NO_UNQUALIFIED_LOADS 효과를 보려면 다음 실험을 시도하세요.

  1. -n 명령줄 옵션을 사용하여 노이즈 기호 로드(SYMOPT_DEBUG)를 활성화하거나 디버거가 이미 실행 중인 경우 .symopt+0x80000000 또는 !sym noisy 디버거 확장 명령을 사용합니다. SYMOPT_DEBUG 디버거가 로드될 때 각 모듈의 이름 또는 디버거가 파일을 찾을 수 없는 경우 오류 메시지와 같은 기호 검색에 대한 정보를 표시하도록 디버거에 지시합니다.
  2. 존재하지 않는 기호를 평가하도록 디버거에 지시합니다(예: ?asdasdasd 입력). 디버거는 존재하지 않는 기호를 검색하는 동안 수많은 오류를 보고해야 합니다.
  3. .symopt+0x100 사용하여 SYMOPT_NO_UNQUALIFIED_LOADS 활성화합니다.
  4. 2단계를 반복합니다. 디버거는 존재하지 않는 기호에 대해 로드된 모듈만 검색해야 하며 작업을 훨씬 더 빨리 완료해야 합니다.
  5. SYMOPT_DEBUG 사용하지 않도록 설정하려면 .symopt-0x80000000 또는 !sym quiet 디버거 확장 명령을 사용합니다.

디버거가 기호를 로드하고 사용하는 방법을 제어하는 다양한 옵션을 사용할 수 있습니다. 기호 옵션의 전체 목록 및 사용 방법은 Windows용 디버깅 도구와 함께 제공되는 온라인 설명서의 "기호 옵션 설정"을 참조하세요. Windows용 디버깅 도구 패키지의 최신 릴리스는 웹에서 무료로 다운로드할 수 있거나 Windows DDK, 플랫폼 SDK 또는 고객 지원 진단 CD에서 패키지를 설치할 수 있습니다.

어떻게 해야 하나요?

  • 기호 검색 속도를 향상하려면 가능하면 중단점 및 디버거 명령에서 정규화된 이름을 사용합니다. 알려진 모듈의 기호를 보려면 모듈 이름으로 한정합니다. 기호가 어디에 있는지 모르는 경우 정규화되지 않은 이름을 사용합니다. 지역 변수 및 함수 인수의 경우 를 모듈 이름으로 사용합니다 $ (예: $! MyVar).
  • 느린 기호 로드의 원인을 진단하려면 -n 명령줄 옵션을 사용하거나 디버거가 이미 실행 중인 경우 .symopt+0x80000000 또는 !sym 노이즈 디버거 확장 명령을 사용하여 노이즈 기호 로드(SYMOPT_DEBUG)를 활성화합니다.
  • 디버거가 언로드된 모듈에서 기호를 검색하지 못하도록 하려면 -snul 명령줄 옵션을 사용하여 SYMOPT_NO_UNQUALIFIED_LOADS 활성화하거나 디버거가 이미 실행 중인 경우 .symopt+0x100 사용하여 활성화합니다.
  • 디버깅 세션에 필요한 모듈을 명시적으로 로드하려면 .reload 또는 ld와 같은 디버거 명령을 사용합니다.

추가 정보

WDK 다운로드

Windows용 디버깅 도구

Windows 디버깅을 사용하여 시작