함수 별칭은 디버거 사용자가 디버거 확장에 정의된 기능에 액세스할 수 있는 고유한 짧은 이름입니다(C++로 작성되었든 JavaScript와 같은 일부 스크립팅 환경이든). 이 짧은 이름은 데이터 모델 함수 개체(IModelMethod를 구현하는 개체)와 연결됩니다. 이 함수는 임의의 개수의 인수를 사용하고 단일 값을 반환합니다. 함수 별칭을 호출하는 효과와 해당 값으로 수행되는 작업은 함수 별칭이 호출되는 방법과 함수 별칭이 호출되는 호스트 디버거에 따라 달라집니다.
이 항목에서는 판독기에서 디버거 개체 모델 및 JavaScript에 익숙하다고 가정합니다. JavaScript에서 디버거 개체를 사용하는 방법에 대한 자세한 내용은 JavaScript 확장 네이티브 디버거 개체참조하세요.
여기에 표시된 예제 중 일부는 dx 명령을 사용합니다. dx 명령 작업에 대한 자세한 내용은 dx(디버거 개체 모델 식 표시)참조하세요. 또한 LINQ는 디버거 개체와 함께 LINQ를 사용하는설명되어 있습니다.
함수 별칭을 확장 명령으로 사용
WinDbg에서 만든 모든 함수 별칭은 디버그 확장 것처럼 호출할 수 있습니다. "뱅" 명령을. 함수가 인수를 사용하지 않는 경우 !aliasName을 호출하면 함수가 호출되고 결과 값이 표시됩니다. 예제로(JavaScript 확장성을 사용하여 생성됨)
예를 들어 이 함수는 pi 두 개의 상수 값을 제공합니다.
function __constants()
{
return { math_constants : { pi : 3.1415926535 , e : 2.7182818284}, description : "Archimedes' pi and Euler's number e" };
}
function initializeScript()
{
return [new host.functionAlias(__constants, "constants")];
}
함수 별칭을 호출한 결과가 여기에 표시됩니다.
0:000> !constants
@$constants() : [object Object]
math_constants : [object Object]
description : Archimedes' pi and Euler's number e
복합 개체에 대한 DML 링크가 자동으로 생성됩니다. 위에 표시된 math_constants 클릭하면 다음 출력이 생성됩니다.
0:000> dx -r1 @$constants().math_constants
@$constants().math_constants : [object Object]
pi : 3.141593
e : 2.718282
함수에 인수가 있는 경우 함수 별칭 명령 자체 후에 제공할 수 있습니다. 함수 별칭 명령 이후에 오는 모든 항목은 식으로 간주되며 다음과 같이 평가됩니다. 텍스트 문자열이 함수에 직접 전달되지 않습니다. 단일 인수 식의 경우 함수 별칭 명령 자체 후에 올 수 있습니다. 여러 인수의 경우 다음 예제와 같이 함수 호출인 것처럼 괄호로 괄호화해야 합니다.
function __oneArgument(x)
{
return -x;
}
function __twoArguments(x, y)
{
return x + y;
}
function initializeScript()
{
return [new host.functionAlias(__oneArgument, "neg"),
new host.functionAlias(__twoArguments, "add")];
}
이 두 함수는 여기에 표시된 대로 호출할 수 있습니다.
0:000> !neg 42
@$neg(42) : -42
0:000> !add (5, 7)
@$add(5, 7) : 0xc
dx 식 계산기에서 사용하는 함수 별칭
디버그 확장 ! 별칭이 지정된 함수를 호출하기 위한 "bang" 명령 구문을 함수 별칭과 연결된 모든 이름은 여기에 표시된 대로 @$ 접두사로 접두사로 지정된 경우 dx 식 계산기에서 직접 사용할 수 있습니다.
0:000> dx @$neg(42)
@$neg(42) : -42
0:000> dx @$add(99, 77)
@$add(99, 77) : 0xb0
함수 별칭 디자인 고려 사항
함수 별칭은 대부분의 데이터 모델 확장에서 기능이 노출되는 유일한 방법이 되어서는 안 됩니다. 데이터 모델 확장(C++ 또는 JavaScript)은 형식 또는 다른 디버거 개념과 연결된 데이터를 거의 항상 포함해야 합니다. 프로세스와 연결된 항목은 Debugger.Models.Process 또는 해당 개체의 하위 네임스페이스 아래에 있어야 합니다. 함수 별칭은 훨씬 더 긴 쿼리가 필요할 수 있는 데이터를 가져오거나 변환하는 편리한 방법이 될 수 있습니다.
커널 모드 예제로 다음 쿼리는 PnP 디바이스 트리를 가져와서 간단한 디바이스 플랫 목록으로 평면화합니다.
0: kd> dx @$cursession.Devices.DeviceTree.Flatten(n => n.Children),5
@$cursession.Devices.DeviceTree.Flatten(n => n.Children),5
[0x0] : HTREE\ROOT\0
[0x1] : ROOT\volmgr\0000 (volmgr)
[0x2] : ROOT\BasicDisplay\0000 (BasicDisplay)
[0x3] : ROOT\CompositeBus\0000 (CompositeBus)
[0x4] : ROOT\vdrvroot\0000 (vdrvroot)
[...]
이 JavaScript 코드는 이를 함수 별칭으로 구현하는 방법을 보여 줍니다.
function __flatDevices()
{
return host.currentSession.Devices.DeviceTree.Flatten(n => n.Children);
}
function initializeScript()
{
return [new host.functionAlias(__flatDevices, "devices")];
}
그런 다음 함수 별칭을 디버그 확장 명령으로 호출할 수 있습니다.
0: kd> !devices
@$devices()
[0x0] : HTREE\ROOT\0
[0x1] : ROOT\volmgr\0000 (volmgr)
[0x2] : ROOT\BasicDisplay\0000 (BasicDisplay)
[0x3] : ROOT\CompositeBus\0000 (CompositeBus)
[0x4] : ROOT\vdrvroot\0000 (vdrvroot)
[0x5] : ROOT\spaceport\0000 (spaceport)
...
함수 별칭을 사용할 때의 이점 중 하나는 dx 구문을 사용하여 더 구체화할 수 있다는 것입니다. 이 예제에서는 "Harddisk"가 포함된 디바이스 노드를 찾기 위해 where 절이 추가됩니다.
0: kd> dx @$devices().Where(n => n.InstancePath.Contains("Harddisk"))
@$devices().Where(n => n.InstancePath.Contains("Harddisk"))
[0x0] : STORAGE\VolumeSnapshot\HarddiskVolumeSnapshot1
[0x1] : STORAGE\VolumeSnapshot\HarddiskVolumeSnapshot2
[0x2] : STORAGE\VolumeSnapshot\HarddiskVolumeSnapshot3
[0x3] : STORAGE\VolumeSnapshot\HarddiskVolumeSnapshot4
[0x4] : STORAGE\VolumeSnapshot\HarddiskVolumeSnapshot5
[0x5] : STORAGE\VolumeSnapshot\HarddiskVolumeSnapshot6
다음과 같은 LINQ 명령은 기능 별칭과 함께 사용할 수 있습니다. 모두. 어떤. 세다. 첫. 평평. GroupBy, . 지난. OrderBy, . OrderByDescending, . 를 선택하고 어디. 이러한 메서드는 C# LINQ 메서드 형식을 최대한 가깝게 따릅니다. 자세한 내용은 디버거 개체와 함께 LINQ를 사용하는참조하세요.
눈금 표시
다른 dx 명령과 마찬가지로 명령을 실행한 후 마우스 오른쪽 단추로 클릭하고 "눈금으로 표시"를 클릭하거나 명령에 "-g"를 추가하여 결과의 그리드 보기를 가져올 수 있습니다. 그런 다음, InstancePath와 같이 정렬할 열을 클릭할 수 있습니다.
0: kd> dx -g @$devices().OrderBy(obj => obj.@"InstancePath")
프로세스 스레드 예제
디버거 개체는 "디버거"에 루트된 네임스페이스로 프로젝터됩니다. 프로세스, 모듈, 스레드, 스택, 스택 프레임 및 지역 변수는 모두 LINQ 쿼리에서 사용할 수 있습니다.
이 예제 JavaScript는 현재 세션 프로세스에 대한 스레드 수를 표시하는 방법을 보여 줍니다.
function __Processes()
{
return host.currentSession.Processes.Select(p => ({Name: p.Name, ThreadCount: p.Threads.Count()}));
}
function initializeScript()
{
return [new host.functionAlias(__Processes, "Processes")];
}
이 예제에서는 ! 프로세스 함수 별칭입니다.
0: kd> !Processes
@$Processes()
[0x0] : [object Object]
[0x4] : [object Object]
[0x1b4] : [object Object]
[0x248] : [object Object]
[0x2c4] : [object Object]
[0x340] : [object Object]
[0x350] : [object Object]
[0x3d4] : [object Object]
[0x3e8] : [object Object]
[0x4c] : [object Object]
[0x214] : [object Object]
[0x41c] : [object Object]
[0x494] : [object Object]
...
이 예제에서는 스레드 수가 가장 큰 상위 5개 프로세스가 표시됩니다.
0: kd> dx -r1 @$Processes().OrderByDescending(p =>p.ThreadCount),5
@$Processes().OrderByDescending(p =>p.ThreadCount),5
[0x4] : [object Object]
[0x180] : [object Object]
[0x978] : [object Object]
[0xda4] : [object Object]
[0x3e8] : [object Object]
[...]
참고하십시오
NatVis 네이티브 디버거 개체
JavaScript 확장 네이티브 디버거 개체