Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Veel Windows API's (pushmeldingen, achtergrondtaken, doel delen, opstarttaken, Windows AI-API's) vereisen dat uw app package-identiteit heeft. Tijdens de ontwikkeling wilt u niet elke keer dat u test een volledig MSIX-installatieprogramma bouwen: winapp biedt twee opdrachten om uw app-identiteit snel te geven.
Gebruikt u Visual Studio met een verpakkingsproject? Als u al Visual Studio gebruikt voor uw verpakte project, hebt u waarschijnlijk geen winapp nodig voor foutopsporing. Visual Studio verwerkt al pakketregistratie, identiteit, AUMID-activering, foutopsporingsprogrammabijlage en foutopsporing van de activeringscode, allemaal van F5. Het biedt ook Debug → Andere foutopsporingsdoelen → Geïnstalleerd app-pakket debuggen voor geavanceerde scenario's. De onderstaande werkstromen zijn het handigst voor VS Code-gebruikers, terminalwerkstromen en frameworks die VS niet systeemeigen verpakt (Rust, Flutter, Tauri, Electron, plain C++).
Twee benaderingen: winapp run vs create-debug-identity
winapp run |
create-debug-identity |
|
|---|---|---|
| Wat wordt geregistreerd | Volledig onafhankelijk lay-outpakket (volledige map) | Sparse-pakket (één exe) |
| Hoe de app wordt gestart | Gestart door winapp (AUMID-activering of uitvoeringsalias) | U start het .exe-bestand zelf (opdrachtregel, IDE, etc.) |
| MSIX-installatie simuleert | Ja, het dichtst bij productiegedrag | Nee — spaarzaam identiteit alleen |
| Bestanden blijven aanwezig | Gekopieerd naar een AppX-indelingsmap | Ja - exe blijft op het oorspronkelijke pad |
| Identiteitsomvang | Volledige mapinhoud (exe, DLL's, assets) | Eén uitvoerbaar bestand |
| Debugger-vriendelijk | Koppelen aan PID na het starten of --no-launch gebruiken en dan starten via alias. |
Rechtstreeks starten vanuit de debugger van je IDE — het uitvoerbare bestand heeft een identiteit, ongeacht de omstandigheden |
| Ondersteuning voor console-apps |
--with-alias houdt stdin/stdout in terminal |
Exe rechtstreeks uitvoeren in terminal |
| Vooral geschikt voor | De meeste frameworks (.NET, C++, Rust, Flutter, Tauri) | Electron, of wanneer u een volledig IDE-foutopsporingsprogramma nodig hebt (F5) |
Wanneer te gebruiken welke
Standaardwaarde: winapp run
Gebruik winapp run dit voor de meeste ontwikkelwerkstromen. Het simuleert een echte MSIX-installatie: uw app krijgt dezelfde identiteit, mogelijkheden en bestandskoppelingen die deze in productie zou hebben.
# Build your app, then:
winapp run .\build\output
Gebruik create-debug-identity wanneer:
-
Uw exe staat los van uw build-uitvoer , bijvoorbeeld Electron-apps waarin
electron.exezich bevindtnode_modules/ - U moet fouten opsporen in opstartcode en kan geen foutopsporingsprogramma snel genoeg koppelen nadat AUMID is gestart
-
Met een aantal foutopsporingsprogramma's waar u auMID niet kunt starten en identiteit nodig hebt voor het gestarte proces,
create-debug-identityregistreert u de exe zodat deze identiteit heeft, ongeacht hoe het wordt gestart - Je test specifiek het gedrag van sparse-pakketten (AllowExternalContent, TrustedLaunch)
# Register identity for an exe, then launch it however you want:
winapp create-debug-identity .\bin\Debug\myapp.exe
.\bin\Debug\myapp.exe # or F5 in your IDE
Scenario's voor foutopsporing
Scenario A: Gewoon uitvoeren met identiteit
De eenvoudigste werkstroom: bouwen, uitvoeren met identiteit, klaar.
winapp run .\build\Debug
Winapp registreert de map als een los indelingspakket en start de app. Api's die identiteit vereisen, werken onmiddellijk. Dit omvat het merendeel van de ontwikkelings- en testscenario's.
Voor console-apps die stdin/stdout nodig hebben in de huidige terminal, voegt u het volgende toe --with-alias:
winapp run .\build\Debug --with-alias
Scenario B: Een foutopsporingsprogramma koppelen aan een actieve app
Start met winapp run, noteer de PID en voeg vervolgens het foutopsporingsprogramma van uw IDE toe.
winapp run .\build\Debug
# Output: Process ID: 12345
Vervolgens in uw IDE:
- VS Code: Uitvoeren en Debuggen → selecteer de configuratie "Attach" (zie IDE-instelling hieronder)
-
WinDbg:
windbg -p 12345
Beperking: U mist alle code die wordt uitgevoerd voordat u deze bijvoegt. Gebruik Scenario D (
create-debug-identity) voor opstartopsporing.
Scenario C: Identiteit registreren en vervolgens starten via AUMID of alias vanuit uw IDE
Gebruik --no-launch om het pakket te registreren en de app te starten via de AUMID (gerapporteerd door run) of uitvoeringsalias van uw IDE.
Stap 1: Registreer het pakket zonder het te starten:
winapp run .\build\Debug --no-launch
Stap 2: Configureer uw IDE om te starten via de AUMID of de uitvoeringsalias (niet de exe rechtstreeks).
- Starten met AUMID: gebruik de opdracht
start shell:AppsFolder\<AUMID>.winapp runvoert de AUMID uit wanneer de app is geregistreerd. - Starten met de alias: de alias moet worden gedefinieerd in uw manifest (
Package.appxmanifestvoorkeursoptie,appxmanifest.xmlook ondersteund).
Belangrijk: Het starten van de exe in de buildmap geeft deze geen identiteit. De app moet worden gestart via activatie van de AUMID of de uitvoeringsalias ervan. Dit is hoe losse indelingspakketten werken: identiteit is gekoppeld aan het activeringspad, niet aan het exe-bestand.
Scenario D: Starten vanuit uw IDE met identiteit (foutopsporing bij opstarten)
Dit is de beste methode voor het opsporen van fouten in opstartcode met volledig IDE-beheer . Het foutopsporingsprogramma van uw IDE bepaalt het proces vanaf de eerste instructie en de exe heeft identiteit, ongeacht hoe deze wordt gestart.
winapp create-debug-identity .\build\Debug\myapp.exe
Start nu de exe op welke manier je maar wilt: vanuit de terminal, met F5 in VS Code, of vanuit een script. De exe heeft een identiteit omdat Windows een sparse-pakket rechtstreeks ernaar wijst.
Hoe het verschilt van
winapp run: Metcreate-debug-identity, identiteit is gekoppeld aan de exe zelf (viaAdd-AppxPackage -ExternalLocation). Metwinapp runis de identiteit gekoppeld aan het losse lay-outpakket, waardoor de app moet worden gestart via AUMID of een alias. Dit maaktcreate-debug-identityde betere keuze wanneer u uw IDE nodig hebt om de exe rechtstreeks te starten en fouten op te sporen.
Dit is ook de beste benadering voor Electron-apps waarbij het exe-pad verschilt van uw bronmap.
Scenario E: Debug-uitvoer en crashdiagnostiek vastleggen
Leg OutputDebugString inline berichten en uitzonderingen voor de eerste kans vast. Frameworkruis (WinUI, COM, DirectX interne traceringen) worden gefilterd vanuit de console, zodat alleen de foutopsporingsberichten van uw app worden weergegeven. Alles wordt nog steeds naar het logboekbestand geschreven voor volledig onderzoek.
Als de app vastloopt, wordt een minidump vastgelegd en automatisch geanalyseerd:
winapp run .\build\Debug --debug-output
Bij crash bevat de uitvoer het uitzonderingstype, bericht en stacktracering met bronbestand en regelnummers (omgezet vanuit PDBs in de build-uitvoermap). Beheerde (.NET) crashes worden direct geanalyseerd zonder externe hulpprogramma's. Native (C++/WinRT) crashes tonen modulenamen en offsets; gebruik --symbols om PDB-symbolen te downloaden voor volledige functienamen:
winapp run .\build\Debug --debug-output --symbols
Belangrijk: Hiermee wordt winapp als foutopsporingsprogramma gekoppeld. Windows staat slechts één foutopsporingsprogramma per proces toe, waardoor u Visual Studio, VS Code of WinDbg niet ook kunt koppelen.
IDE instellen
VS Code
De WinApp VS Code-extensie biedt een aangepast winapp foutopsporingstype waarmee uw app wordt gestart met pakketidentiteit en het foutopsporingsprogramma wordt gekoppeld, allemaal vanuit één F5-druk .
Foutopsporing met identiteit met één druk op F5
Voeg een winapp startconfiguratie toe aan .vscode/launch.json:
{
"version": "0.2.0",
"configurations": [
{
"type": "winapp",
"request": "launch",
"name": "WinApp: Launch and Attach"
}
]
}
Wanneer u op F5 drukt:
- Met de uitbreiding wordt in uw werkruimte gezocht naar uitvoermappen die
.exebestanden bevatten. - U selecteert de buildmap die u wilt uitvoeren (of stelt u
inputFolderin om de prompt over te slaan). - Uw app wordt via
winapp rungestart om het pakketidentiteit te verlenen. - Een kindersessie voor foutopsporing wordt gekoppeld aan het lopende proces met de door u opgegeven foutopsporingsprogramma.
Zodra het foutopsporingsprogramma is gekoppeld, krijgt u de volledige foutopsporingservaring in VS Code: stel onderbreekpunten in door te klikken op de kantlijn, stap regel voor regel (F10) door de code, stap in functies (F11), inspecteer variabelen in het deelvenster Variabelen, en evalueer expressies in de Foutopsporingsconsole. De app wordt uitgevoerd met pakketidentiteit overal, dus identiteitsafhankelijke API's gedragen zich precies zoals ze in productie zouden zijn.
Belangrijk: Het
winappfoutopsporingstype bouwt uw project niet automatisch. Nadat u codewijzigingen hebt aangebracht, bouwt u het opnieuw op voordat u op F5 drukt.
Builds automatiseren met preLaunchTask
Om te voorkomen dat u vergeet het project opnieuw te bouwen, voegt u een preLaunchTask toe die uw project bouwt vóór elke foutopsporingssessie:
- Definieer een build-taak in
.vscode/tasks.json(bijvoorbeeld voor .NET):{ "version": "2.0.0", "tasks": [ { "label": "build", "command": "dotnet", "type": "process", "args": ["build", "${workspaceFolder}"], "problemMatcher": "$msCompile" } ] } - Verwijs ernaar in uw
launch.json:{ "type": "winapp", "request": "launch", "name": "WinApp: Launch and Attach", "preLaunchTask": "build" }
Configuratie-eigenschappen
| Property | Type | Verstek | Description |
|---|---|---|---|
inputFolder |
string | Pad naar de build-uitvoermap met binaire bestanden van uw app (bijvoorbeeld ${workspaceFolder}/bin/Debug/net8.0-windows10.0.22621). Als deze optie niet is ingesteld, wordt u gevraagd een map te selecteren. |
|
manifest |
string | Pad naar een AppX-manifestbestand (bijvoorbeeld AppxManifest.xml, Package.appxmanifestof appxmanifest.xml). Als dit niet is ingesteld, detecteert de CLI automatisch de invoermap of de huidige map. |
|
debuggerType |
string | coreclr |
Onderliggende foutopsporingsprogramma dat moet worden gebruikt (coreclr, cppvsdbgof node). |
workingDirectory |
string | werkruimte-folder | Werkmap voor de toepassing. |
args |
string | Opdrachtregelargumenten die moeten worden doorgegeven aan de toepassing. | |
outputAppxDirectory |
string | Uitvoermap voor het pakket met losse indeling. Standaard is ingesteld op een AppX map binnen de invoermap. |
|
port |
Nummer | 9229 |
(node alleen) De poort die wordt gebruikt voor de Node.js --inspect listener en de koppelingsverbinding. Overschrijven wanneer de standaardpoort al in gebruik is. |
Ondersteunde foutopsporingsprogramma's
debuggerType |
Language | Vereiste extensie |
|---|---|---|
coreclr (standaard) |
C# / .NET | C# Ontwikkelingskit |
cppvsdbg |
C/C++ | C/C++ |
node |
Node.js / Electron | Ingebouwd |
Voorbeeld voor een C++-project:
{
"type": "winapp",
"request": "launch",
"name": "WinApp: Launch C++ App",
"debuggerType": "cppvsdbg"
}
Opstart-debugging met Debug Identiteit aanmaken
Als u fouten wilt opsporen in opstartcode uit de eerste instructie, kan de F5-bijlagebenadering vroege code missen. Gebruik in plaats daarvan de opdracht WinApp: Foutopsporingsidentiteit maken vanuit het opdrachtpalet (Ctrl+Shift+P) om een sparse-pakket voor uw uitvoerbare bestand te registreren en vervolgens te starten met uw standaarddebugger:
{
"name": "Launch (with identity)",
"type": "coreclr",
"request": "launch",
"program": "${workspaceFolder}/bin/Debug/net8.0-windows10.0.22621/myapp.exe"
}
Omdat create-debug-identity de identiteit wordt geregistreerd op de exe zelf, heeft de app een identiteit, ongeacht hoe deze wordt gestart, inclusief vanuit een standaard-VS Code-startconfiguratie.
Koppelen aan een lopend proces
Als je liever start vanuit de terminal met winapp run en dan koppelt, gebruik je een standaardkoppelingsconfiguratie:
{
"name": "Attach to Process",
"type": "coreclr",
"request": "attach",
"processId": "${command:pickProcess}"
}
Voor C++/Rust gebruikt u "type": "cppvsdbg" (MSVC) of "type": "lldb" (LLDB):
{
"name": "Attach (C++)",
"type": "cppvsdbg",
"request": "attach",
"processId": "${command:pickProcess}"
}
Opschonen
Wanneer u klaar bent met testen, voert u WinApp: Unregister Package vanuit de Command Palette uit om sideloaded ontwikkelingspakketten te verwijderen zonder VS Code te verlaten.
Windows developer