별칭 사용
별칭은 자동으로 다른 문자열로 대체되는 문자열입니다. 디버거 명령에서 사용할 수 있으며 특정 일반적인 구의 형식을 다시 지정하지 않도록 할 수 있습니다.
별칭은 별칭 이름과해당하는 별칭으로 구성됩니다. 별칭 이름을 디버거 명령의 일부로 사용하면 이름이 해당하는 별칭으로 자동으로 바뀝니다. 이 대체는 명령을 구문 분석하거나 실행하기 전에 즉시 발생합니다.
디버거는 세 가지 종류의 별칭을 지원합니다.
사용자 이름 별칭을 설정하고 이름을 지정할 수 있습니다.
고정 이름 별칭을 설정할 수 있지만 이름은 $u 0, $u 1, ..., $u 9입니다.
디버거는 자동 별칭을 설정하고 이름을 지정합니다.
User-Named 별칭 정의
사용자 이름 별칭을 정의할 때 별칭 이름과 해당하는 별칭을 선택할 수 있습니다.
별칭 이름은 공백을 포함하지 않는 모든 문자열일 수 있습니다.
해당하는 별칭은 임의의 문자열일 수 있습니다. 키보드에 입력하면 해당하는 별칭에 선행 공백 또는 캐리지 리턴이 포함될 수 없습니다. 또는 메모리의 문자열, 숫자 식 값, 파일 내용, 환경 변수 값 또는 하나 이상의 디버거 명령 출력과 동일하게 설정할 수 있습니다.
별칭 이름과 해당하는 별칭은 모두 대/소문자를 구분합니다.
사용자 이름 별칭을 정의하거나 재정의하려면 를 (별칭 설정) 또는 aS(별칭 설정) 명령을 사용합니다.
별칭을 제거하려면 광고(별칭 삭제) 명령을 사용합니다.
현재 사용자 이름 별칭을 모두 나열하려면 al(별칭 나열) 명령을 사용합니다.
Fixed-Name 별칭 정의
10개의 고정 이름 별칭이 있습니다. 별칭 이름은 $u 0, $u 1, ..., $u 9입니다. 해당 별칭은 ENTER 키 입력을 포함하지 않는 모든 문자열일 수 있습니다.
r(Registers) 명령을 사용하여 고정 이름 별칭에 해당하는 별칭을 정의합니다. 고정 이름 별칭을 정의할 때 문자 "u" 앞에 마침표(.)를 삽입해야 합니다. 등호(=) 뒤의 텍스트는 별칭과 동일합니다. 해당하는 별칭에는 공백 또는 세미콜론이 포함될 수 있지만 선행 및 후행 공백은 무시됩니다. 결과에 따옴표를 표시하지 않으려면 해당하는 별칭을 따옴표로 묶지 않아야 합니다.
참고 고정 이름 별칭에 r(레지스터) 명령을 사용하여 혼동하지 마세요. 이러한 별칭은 r 명령을 사용하여 해당 별칭을 설정하는 경우에도 레지스터 또는 의사 레지스터가 아닙니다. 이러한 별칭 앞에 at(@) 기호를 추가할 필요가 없으며 r 명령을 사용하여 이러한 별칭 중 하나의 값을 표시 할 수 없습니다.
기본적으로 고정 이름 별칭을 정의하지 않으면 빈 문자열입니다.
자동 별칭
디버거는 다음 자동 별칭을 설정합니다.
별칭 이름 | 해당하는 별칭 |
---|---|
$ntnsym |
컴퓨터의 네이티브 아키텍처에서 NT 기호에 가장 적합한 모듈입니다. 이 별칭은 ntdll 또는 nt와 같을 수 있습니다. |
$ntwsym |
WOW64를 사용하는 32비트 디버깅 중에 NT 기호에 가장 적합한 모듈입니다. 이 별칭은 ntdll32 또는 다른 32비트 버전의 Ntdll.dll 수 있습니다. |
$ntsym |
현재 컴퓨터 모드와 일치하는 NT 기호에 가장 적합한 모듈입니다. 기본 모드에서 디버깅하는 경우 이 별칭은 $ntnsym 동일합니다. 기본 모드가 아닌 모드에서 디버깅하는 경우 디버거는 이 모드와 일치하는 모듈을 찾으려고 시도합니다. 예를 들어 WOW64를 사용하는 32비트 디버깅 중에 이 별칭은 $ntwsym 동일합니다. |
$CurrentDumpFile |
디버거가 로드한 마지막 덤프 파일의 이름입니다. |
$CurrentDumpPath |
디버거가 로드한 마지막 덤프 파일의 디렉터리 경로입니다. |
$CurrentDumpArchiveFile |
디버거가 로드한 마지막 덤프 보관 파일(CAB 파일)의 이름입니다. |
$CurrentDumpArchivePath |
디버거가 로드한 마지막 덤프 보관 파일(CAB 파일)의 디렉터리 경로입니다. |
자동 별칭은 자동 의사 레지스터와 유사하지만 별칭 관련 토큰(예: ${ })과 함께 자동 별칭을 사용할 수 있지만 이러한 토큰에는 의사 레지스터를 사용할 수 없습니다.
디버거 명령 창에서 별칭 사용
별칭을 정의한 후에는 모든 명령 항목에서 사용할 수 있습니다. 별칭 이름은 해당하는 별칭으로 자동으로 바뀝니다. 따라서 별칭을 식 또는 매크로로 사용할 수 있습니다.
별칭 이름은 따옴표로 묶어도 올바르게 확장됩니다. 해당하는 별칭에는 여러 따옴표나 세미콜론이 포함될 수 있으므로 해당하는 별칭은 여러 명령을 나타낼 수 있습니다.
사용자 이름 별칭은 해당 이름이 공백으로 다른 문자와 구분된 경우에만 인식됩니다. 별칭 이름의 첫 번째 문자는 줄을 시작하거나 공백, 세미콜론 또는 따옴표를 따라야 합니다. 별칭 이름의 마지막 문자는 줄을 끝내거나 공백, 세미콜론 또는 따옴표 뒤에 붙아야 합니다.
참고 "as", "aS", "ad" 또는 "al"로 시작하는 디버거 명령 창 에 입력한 텍스트는 별칭 바꾸기를 받지 않습니다. 이 제한은 별칭 명령이 작동하지 않게 렌더링되는 것을 방지합니다. 그러나 이 제한은 광고 또는알 을 따르는 명령이 별칭을 대체하지 않음을 의미합니다. 이러한 문자열 중 하나로 시작하는 줄에서 별칭을 바꾸려면 별칭 앞에 세미콜론을 추가합니다.
그러나 ${ } 토큰을 사용하여 다른 텍스트 옆에 있는 경우에도 사용자 이름 별칭을 확장할 수 있습니다. 이 토큰을 특정 스위치와 함께 사용하여 별칭이 확장되지 않도록 하거나 특정 별칭 관련 값을 표시할 수도 있습니다. 이러한 상황에 대한 자세한 내용은 ${ }(별칭 인터프리터)를 참조하세요.
고정 이름 별칭은 줄의 텍스트 내에 포함되는 방식에 관계없이 선 내의 모든 지점에서 올바르게 확장됩니다.
WinDbg(.open, .write_cmd_hist(쓰기 명령 기록), .lsrcpath 및 .lsrcfix)에서만 사용할 수 있는 명령과 별칭이 있는 몇 가지 추가 명령(.hh, .cls, .wtitle, .remote, 커널 모드 .restart 및 사용자 모드 .restart)을 사용할 수 없습니다.
스크립트 파일에서 별칭 사용
스크립트 파일에서 별칭을 사용하는 경우 별칭이 올바른 시간에 확장되도록 특별히 주의해야 합니다. 다음 스크립트를 고려합니다.
.foreach (value {dd 610000 L4})
{
as /x ${/v:myAlias} value + 1
.echo value myAlias
}
ad myAlias
루프를 처음 통해 aS(별칭 설정) 명령은 myAlias에 값을 할당합니다. myAlias에 할당된 값은 1+ 610000(dd 명령의 첫 번째 출력)입니다. 그러나 .echo(Echo Comment) 명령이 실행되면 myAlias가 아직 확장되지 않았으므로 610001 보는 대신 "myAlias" 텍스트가 표시됩니다.
0:001> $$>< c:\Script02.txt
00610000 myAlias
00905a4d 0x610001
00000003 0x905a4e
00000004 0x4
0000ffff 0x5
문제는 새 코드 블록이 입력될 때까지 myAlias가 확장되지 않는다는 것입니다. 루프의 다음 항목은 새 블록이므로 myAlias는 610001 확장됩니다. 그러나 너무 늦었습니다 : 우리는 루프를 통해 처음으로 610001 보았을 것입니다. 다음 스크립트와 같이 .echo(Echo Comment) 명령을 새 블록에 묶어 이 문제를 해결할 수 있습니다.
.foreach (value {dd 610000 L4})
{
as /x ${/v:myAlias} value + 1
.block{.echo value myAlias}
}
ad myAlias
변경된 스크립트를 사용하면 다음과 같은 올바른 출력이 표시됩니다.
0:001> $$>< c:\Script01.txt
00610000 0x610001
00905a4d 0x905a4e
00000003 0x4
00000004 0x5
0000ffff 0x10000
자세한 내용은 .block 및 ${ }(별칭 인터프리터)를 참조하세요.
별칭에서 .foreach 토큰 사용
별칭 정의에서 .foreach 토큰을 사용하는 경우 토큰이 확장되도록 특별히 주의해야 합니다. 다음 명령 시퀀스를 고려합니다.
r $t0 = 5
ad myAlias
.foreach /pS 2 /ps 2 (Token {?@$t0}) {as myAlias Token}
al
첫 번째 명령은 $t 0 의사 레지스터의 값을 5로 설정합니다. 두 번째 명령은 이전에 myAlias에 할당되었을 수 있는 모든 값을 삭제합니다. 세 번째 명령은 ?@$t 0 명령의 세 번째 토큰을 가져와서 해당 토큰의 값을 myAlias에 할당하려고 시도합니다. 네 번째 명령은 모든 별칭과 해당 값을 나열합니다. myAlias의 값은 5가 될 것으로 예상하지만 대신 값은 "Token"이라는 단어입니다.
Alias Value
------- -------
myAlias Token
문제는 as 명령이 .foreach 루프 본문의 줄 시작 부분에 있다는 것입니다. 줄이 as 명령으로 시작되면 해당 줄의 별칭 및 토큰은 확장되지 않습니다. 세미콜론 또는 빈 공간을 as 명령 앞에 배치하면 이미 값이 있는 별칭이나 토큰이 확장됩니다. 이 예제에서 myAlias는 아직 값이 없으므로 확장되지 않습니다. 토큰은 값이 5이므로 확장됩니다. 다음은 명령 앞에 세미콜론이 추가된 동일한 명령 시퀀스 입니다 .
r $t0 = 5
ad myAlias
.foreach /pS 2 /ps 2 (Token {?@$t0}) {;as myAlias Token}
al
이제 예상 출력을 가져옵니다.
Alias Value
------- -------
myAlias 5
재귀 별칭
별칭 정의에 고정 이름 별칭을 사용할 수 있습니다. 고정 이름 별칭 정의에서 사용자 이름 별칭을 사용할 수도 있습니다. 그러나 다른 사용자 이름 별칭 정의에서 사용자 이름 별칭을 사용하려면 as 또는 aS 명령 앞에 세미콜론을 추가해야 합니다. 그렇지 않으면 해당 줄에서 별칭 대체가 발생하지 않습니다.
이 형식의 재귀 정의를 사용하는 경우 각 별칭은 사용되는 즉시 변환됩니다. 예를 들어 다음 예제에서는 7이 아닌 3을 표시합니다.
0:000> r $.u2=2
0:000> r $.u1=1+$u2
0:000> r $.u2=6
0:000> ? $u1
Evaluate expression: 3 = 00000003
마찬가지로 다음 예제에서는 7이 아닌 3을 표시합니다.
0:000> as fred 2
0:000> r $.u1= 1 + fred
0:000> as fred 6
0:000> ? $u1
Evaluate expression: 3 = 00000003
다음 예제도 허용되며 9를 표시합니다.
0:000> r $.u0=2
0:000> r $.u0=7+$u0
0:000> ? $u0
Evaluate expression: 9 = 00000009
별칭 예제
다음 예제와 같이 길거나 복잡한 기호 이름을 입력할 필요가 없도록 별칭을 사용할 수 있습니다.
0:000> as Short usersrv!NameTooLongToWantToType
0:000> dw Short +8
다음 예제는 앞의 예제와 비슷하지만 고정 이름 별칭을 사용합니다.
0:000> r $.u0=usersrv!NameTooLongToWantToType
0:000> dw $u0+8
자주 사용하는 명령의 경우 별칭을 매크로로 사용할 수 있습니다. 다음 예제에서는 eax 및 ebx 레지스터를 두 번 증가합니다.
0:000> as GoUp r eax=eax+1; r ebx=ebx+1
0:000> GoUp
0:000> GoUp
다음 예제에서는 별칭을 사용하여 명령 입력을 간소화합니다.
0:000> as Cmd "dd esp 14; g"
0:000> bp MyApi Cmd
다음 예제는 앞의 예제와 비슷하지만 고정 이름 별칭을 사용합니다.
0:000> r $.u5="dd esp 14; g"
0:000> bp MyApi $u5
앞의 두 예제는 모두 다음 명령과 동일합니다.
0:000> bp MyApi "dd esp 14; g"
Tools.ini 파일
CDB(및 NTSD)에서 tools.ini 파일에서 고정 이름 별칭을 미리 정의할 수 있습니다. 고정 이름 별칭을 미리 정의하려면 다음 예제와 같이 [NTSD] 항목에 원하는 $u 필드를 추가합니다.
[NTSD]
$u1:_ntdll!_RtlRaiseException
$u2:"dd esp 14;g"
$u9:$u1 + 42
Tools.ini 파일에서 사용자 이름 별칭을 설정할 수 없습니다.
Fixed-Name 별칭 및 User-Named 별칭
사용자 이름 별칭은 고정 명명된 별칭보다 사용하기 쉽습니다. 해당 정의 구문은 더 간단하며 al(별칭 나열) 명령을 사용하여 나열할 수 있습니다.
다른 텍스트 옆에 사용되는 경우 고정 명명된 별칭이 바뀝니다. 다른 텍스트 옆에 있을 때 사용자 이름 별칭을 바꾸려면 ${ } (별칭 인터프리터) 토큰에 묶습니다.
고정 이름 별칭 바꾸기는 사용자 이름 별칭 바꾸기 전에 발생합니다.