다음을 통해 공유


디버거 데이터 모델 함수 별칭

함수 별칭은 디버거 사용자가 디버거 확장에 정의된 기능에 액세스할 수 있는 고유한 짧은 이름입니다(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]
    [...]   

참고하십시오

dx(디버거 개체 모델 식 표시)

디버거 개체와 함께 LINQ 사용

NatVis 네이티브 디버거 개체

JavaScript 확장 네이티브 디버거 개체