모듈 및 함수 소유자 지정
!analyze 및 !owner 확장명은 triage.ini 이름이 지정된 파일을 사용하여 디버거에서 발생하는 기호의 소유자를 확인합니다.
이러한 확장을 사용하면 함수 또는 모듈 소유자의 ID가 "후속 작업"이라는 단어 뒤에 표시됩니다.
triage.ini 파일은 Windows용 디버깅 도구 설치의 \triage 하위 디렉터리에 있는 텍스트 파일입니다. 샘플 triage.ini 파일은 Windows용 디버깅 도구 패키지의 일부로 포함됩니다.
경고 현재 버전과 동일한 디렉터리에 Windows용 디버깅 도구의 업데이트된 버전을 설치하는 경우 triage.ini 포함하여 해당 디렉터리의 모든 파일을 덮어씁니다. 샘플 triage.ini 파일을 수정하거나 바꾼 후 복사본을 다른 디렉터리에 저장합니다. 디버거를 다시 설치한 후 저장된 triage.ini 기본 버전에 복사할 수 있습니다.
triage.ini 파일의 형식
triage.ini 파일은 디버거로 분할된 함수의 소유자를 확인하는 데 도움이 되지만 이 파일의 "소유자" 문자열은 디버깅에 도움이 될 수 있는 모든 항목일 수 있습니다. 문자열은 코드를 작성하거나 유지 관리하는 사용자의 이름이 될 수 있습니다. 또는 문자열은 모듈 또는 함수에서 오류가 발생할 때 수행할 수 있는 작업과 관련한 간단한 지침일 수 있습니다.
이 파일의 각 줄에는 다음 구문이 있습니다.
Module[!Function]=Owner
모듈 또는 함수 이름의 끝에만 별표(*)를 추가할 수 있습니다. 다른 곳에 표시되면 리터럴 문자로 해석됩니다.
소유자 문자열에는 공백을 추가할 수 없습니다. 소유자 문자열에 공백이 있는 경우 무시됩니다.
구문 옵션에 대한 자세한 내용은 특수 triage.ini 구문을 참조하세요.
다음 예제에서는 샘플 triage.ini 파일을 보여 줍니다.
module1=Person1
module2!functionA=Person2
module2!functionB=Person3
module2!funct*=Person4
module2!*=Person5
module3!singleFunction=Person6
mod*!functionC=Person7
Triage.ini 및 !owner
모듈 또는 함수 이름을 !owner 확장에 전달하면 디버거에 "Followup"이라는 단어와 모듈 또는 함수 소유자의 이름이 표시됩니다.
다음 예제에서는 이전 샘플 triage.ini 파일을 사용합니다.
0:000> !owner module2!functionB
Followup: Person3
파일에 따르면 "Person3"은 module2!functionB를 소유하고 "Person4"는 module2!funct\를 소유합니다. 이 두 문자열은 모두 !owner에 전달된 인수와 일치하므로 더 완전한 일치 항목이 사용됩니다.
Triage.ini 및 !analyze
!analyze 확장을 사용하는 경우 디버거는 스택의 맨 위 오류 프레임을 살펴보고 이 프레임에서 모듈 및 함수의 소유자를 확인하려고 시도합니다. 디버거가 소유자를 확인할 수 있는 경우 소유자 정보가 표시됩니다.
디버거가 소유자를 확인할 수 없는 경우 디버거가 소유자를 결정하거나 스택이 완전히 검사될 때까지 디버거가 다음 스택 프레임으로 전달됩니다.
디버거에서 소유자를 확인할 수 있는 경우 소유자 이름은 "후속 작업"이라는 단어 뒤에 표시됩니다. 디버거가 정보를 찾지 않고 전체 스택을 검색하는 경우 이름이 표시되지 않습니다.
다음 예제에서는 이 항목의 앞부분에 제공된 샘플 triage.ini 파일을 사용합니다.
스택의 첫 번째 프레임이 MyModule!someFunction이라고 가정합니다. 디버거는 triage.ini 파일에서 MyModule 을 찾을 수 없습니다. 다음으로 스택의 두 번째 프레임으로 계속 진행합니다.
두 번째 프레임이 module3!anotherFunction이라고 가정합니다. 디버거에는 module3에 대한 항목이 표시되지만 이 모듈에는 다른Function 과 일치하지 않습니다. 다음으로 디버거는 세 번째 프레임으로 계속 진행됩니다.
세 번째 프레임이 module2!functionC라고 가정합니다. 디버거는 먼저 정확한 일치 항목을 찾지만 이러한 일치 항목은 존재하지 않습니다. 그런 다음 디버거는 함수 이름을 트리밍하고 triage.ini module2!funct\*를 검색합니다. 이 일치 항목은 디버거가 소유자가 "Person4"라고 결정하기 때문에 검색을 종료합니다.
그런 다음 디버거는 다음 예제와 유사한 출력을 표시합니다.
0:000> !analyze
*******************************************************************************
* *
* Exception Analysis *
* *
*******************************************************************************
Use !analyze -v to get detailed debugging information.
Probably caused by : module2 ( module2!functionC+15a )
Followup: Person4
---------
더 완전한 일치가 더 짧은 일치보다 우선합니다. 그러나 모듈 이름 일치는 항상 함수 이름 일치에 선호됩니다. module2!펑트\*가 이 triage.ini 파일에 없는 경우 디버거는 모듈2!\*를 일치 항목으로 선택했을 것입니다. 그리고 module2!funct\* 및 module2!\*가 모두 제거된 경우 mod*!functionC가 선택되었을 것입니다.
특수 triage.ini 구문
느낌표와 함수 이름을 생략하거나 모듈 이름 다음에 !\*를 추가하면 해당 모듈의 모든 함수가 표시됩니다. 이 모듈 내의 함수를 별도로 지정하는 경우 보다 정확한 사양이 우선합니다.
모듈 이름 또는 함수 이름으로 "default"를 사용하는 경우 와일드카드 문자와 동일합니다. 예를 들어 nt!\*는 nt!default와 동일하고 기본값 은 *!\*와 동일합니다.
일치하는 항목이 있지만 무시 라는 단어가 등호(=)의 오른쪽에 나타나면 디버거는 스택의 다음 프레임으로 계속 진행됩니다.
소유자 이름 앞에 last_ 또는 maybe_ 추가할 수 있습니다. 이 접두사는 !analyze를 실행할 때 소유자의 우선 순위를 줄입니다. 디버거는 스택에서 더 높은 maybe_ 일치를 통해 스택에서 더 낮은 확실한 일치 항목을 선택합니다. 또한 디버거는 스택에서 더 높은 last_ 일치를 통해 스택에서 더 낮은 maybe_ 일치를 선택합니다.
샘플 triage.ini
샘플 triage.ini 템플릿은 Windows용 디버깅 도구 패키지에 포함되어 있습니다. 이 파일에 원하는 모듈 및 함수의 소유자를 추가할 수 있습니다. 전역 기본값이 없으려면 이 파일의 시작 부분에 있는 default=MachineOwner 줄을 삭제합니다.