Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Funktionsalias är ett unikt kort namn med vilket en användare av felsökningsprogrammet kan komma åt funktioner som definierats i ett felsökningstillägg (oavsett om de är skrivna i C++ eller någon skriptmiljö som JavaScript). Det här korta namnet associeras med ett datamodellfunktionsobjekt (ett objekt som implementerar IModelMethod). Den funktionen tar ett godtyckligt antal argument och returnerar ett enda värde. Effekten av att anropa ett funktionsalias och vad som görs med det värdet beror på hur funktionsaliaset anropas och vilket värdfelsökare det anropas i.
Det här avsnittet förutsätter att läsaren är bekant med felsökningsobjektmodellen och JavaScript. Information om hur du använder felsökningsobjekt med JavaScript finns i interna felsökningsobjekt i JavaScript-tillägg.
Några av exemplen som visas här använder dx-kommandot. Mer information om hur du arbetar med dx-kommandot finns i dx (Display Debugger Object Model Expression). Dessutom används LINQ som beskrivs i Using LINQ With the debugger objects.
Använda funktionsalias som tilläggskommandon
Alla funktionsalias som skapats i WinDbg kan anropas som om de var felsökningstillägget ! "bang"-kommandon. Om funktionen inte tar några argument anropas funktionen genom att bara anropa !aliasName och resultatvärdet visas. Som ett exempel (skapat med JavaScript-utökningsbarhet)
Den här funktionen innehåller till exempel två konstanta värden, pi och e.
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")];
}
Resultatet av att anropa funktionsaliaset visas här.
0:000> !constants
@$constants() : [object Object]
math_constants : [object Object]
description : Archimedes' pi and Euler's number e
DML-länkar till komplexa objekt genereras automatiskt. Om du klickar på math_constants som visas ovan resulterar följande utdata.
0:000> dx -r1 @$constants().math_constants
@$constants().math_constants : [object Object]
pi : 3.141593
e : 2.718282
Om funktionen har argument kan de anges efter själva funktionsaliaskommandot. Observera att vad som än kommer efter kommandot för funktionsalias betraktas som ett uttryck och utvärderas som sådant. Textsträngen skickas inte direkt till funktionen. För ett enda argumentuttryck kan det komma efter själva kommandot för funktionsalias. För flera argument bör de parenteseras som om det vore ett funktionsanrop som illustreras i nästa exempel.
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")];
}
Dessa två funktioner kan anropas som visas här.
0:000> !neg 42
@$neg(42) : -42
0:000> !add (5, 7)
@$add(5, 7) : 0xc
Använda funktionsalias med utvärderaren för dx-uttryck
Förutom felsökningstillägget ! "bang"-kommandosyntax för att anropa en aliasfunktion är alla namn som är associerade med funktionsalias direkt tillgängliga i utvärderaren för dx-uttryck när prefixet av @$ som visas här.
0:000> dx @$neg(42)
@$neg(42) : -42
0:000> dx @$add(99, 77)
@$add(99, 77) : 0xb0
Designöverväganden för funktionsalias
Ett funktionsalias får aldrig vara det enda sättet på vilket funktioner i de allra flesta datamodelltillägg exponeras. Ett datamodelltillägg (oavsett om det är i C++ eller JavaScript) bör nästan alltid innehålla de data som det exponerar som är associerade med en typ eller något annat felsökningskoncept. Saker som är associerade med processer ska vara under Debugger.Models.Process eller ett undernamnområde för objektet. Ett funktionsalias kan vara ett praktiskt sätt att komma åt (eller transformera) data som kan kräva en betydligt längre fråga.
Som ett exempel på kernelläge tar följande fråga PnP-enhetsträdet och plattar ut det till en enkel platt lista över enheter:
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)
[...]
Den här JavaScript-koden visar hur detta kan implementeras som ett funktionsalias.
function __flatDevices()
{
return host.currentSession.Devices.DeviceTree.Flatten(n => n.Children);
}
function initializeScript()
{
return [new host.functionAlias(__flatDevices, "devices")];
}
Funktionsaliaset kan sedan anropas som ett felsökningstilläggskommando.
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)
...
En av fördelarna med att använda ett funktionsalias är att det kan förfinas ytterligare med hjälp av dx-syntaxen. I det här exemplet läggs en where-sats till för att leta efter enhetsnoder som innehåller "Hårddisk".
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-kommandon som följande kan användas med funktionella alias – . Alla. Någon. Räkna. Första. Platta till. GroupBy, . Sist. OrderBy, . OrderByDescending, . Välj och . Var. Dessa metoder följer (så nära som möjligt) C# LINQ-metodformuläret. Mer information finns i Using LINQ With the debugger objects.
rutnätsvisning
Precis som med andra dx-kommandon kan du högerklicka på ett kommando när det har körts och klicka på "Visa som rutnät" eller lägga till "-g" i kommandot för att få en rutnätsvy över resultaten. Du kan sedan klicka på valfri kolumn för att sortera, till exempel på InstancePath.
0: kd> dx -g @$devices().OrderBy(obj => obj.@"InstancePath")
Exempel på processtrådar
Felsökningsobjekt projiceras till ett namnområde som är rotat på "Felsökningsprogram". Processer, moduler, trådar, staplar, stackramar och lokala variabler är alla tillgängliga för användning i en LINQ-fråga.
I det här exemplet visar JavaScript hur du visar antalet trådar för de aktuella sessionsprocesserna:
function __Processes()
{
return host.currentSession.Processes.Select(p => ({Name: p.Name, ThreadCount: p.Threads.Count()}));
}
function initializeScript()
{
return [new host.functionAlias(__Processes, "Processes")];
}
Detta visar exempelutdata med ! Bearbetar funktionsalias.
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]
...
I det här exemplet visas de 5 främsta processerna med det största antalet trådar.
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]
[...]
Se även
dx (Visning av objektmodelluttryck för felsökningsprogram)
Använda LINQ med felsökningsobjekten
interna felsökningsobjekt i NatVis
interna felsökningsobjekt i JavaScript-tillägg