WinDbg를 사용하여 UWP 앱 디버깅

WinDbg를 사용하여 UWP(유니버설 Windows 플랫폼) 앱을 디버그할 수 있습니다. 이 방법은 일반적으로 Visual Studio 디버거에서 빌드된 를 사용하여 디버깅 작업을 완료할 수 없는 고급 시나리오에 사용됩니다. Visual Studio의 디버깅에 대한 자세한 내용은 Visual Studio에서 디버깅을 참조하세요.

UWP 앱에 연결

UWP 프로세스에 연결하는 것은 사용자 모드 프로세스에 연결하는 것과 동일합니다. 예를 들어 WinDbg에서는 파일 메뉴에서 프로세스에 연결을 선택하거나 F6 키를 눌러 실행 중인 프로세스 에 연결할 수 있습니다. 자세한 내용은 WinDbg를 사용하여 User-Mode 프로세스 디버깅을 참조하세요.

UWP 앱은 디버깅되지 않을 때와 동일한 방식으로 일시 중단되지 않습니다. UWP 앱을 명시적으로 일시 중단/다시 시작하려면 .suspendpackage 및 .resumepackage 명령(아래 세부 정보)을 사용할 수 있습니다. UWP 앱에서 사용하는 PLM(프로세스 수명 주기 관리)에 대한 일반적인 내용은 앱 수명 주기시작, 다시 시작 및 백그라운드 작업을 참조하세요.

UWP 앱 시작 및 디버깅

-plmPackage 및 -plmApp 명령줄 매개 변수는 디버거에서 앱을 시작하도록 디버거에 지시합니다.

windbg.exe -plmPackage <PLMPackageName> -plmApp <ApplicationId> [<parameters>]

여러 앱을 단일 패키지 내에 포함할 수 있으므로 PLMPackage 및 ApplicationId> 매개 변수가 모두 <필요합니다.<> 매개 변수의 요약입니다.

매개 변수 설명
<PLMPackageName> 애플리케이션 패키지의 이름입니다. .querypackages 명령을 사용하여 모든 UWP 애플리케이션을 나열합니다. 패키지 위치에 대한 경로를 제공하지 말고 패키지 이름만 제공합니다.
<ApplicationId>

ApplicationId는 애플리케이션 매니페스트 파일에 있으며 이 항목에 설명된 대로 .querypackage 또는 .querypackages 명령을 사용하여 볼 수 있습니다.

애플리케이션 매니페스트 파일에 대한 자세한 내용은 앱 패키지 매니페스트를 참조하세요.

[<parameters>]

앱에 전달된 선택적 매개 변수입니다. 모든 앱이 매개 변수를 사용하거나 필요로 하는 것은 아닙니다.

HelloWorld 샘플

UWP 디버깅을 설명하기 위해 이 항목에서는 "Hello, world" 앱 만들기(XAML)에 설명된 HelloWorld 예제를 사용합니다.

실행 가능한 테스트 앱을 만들려면 랩의 3단계까지 완료하기만 하면 됩니다.

전체 패키지 이름 및 AppId 찾기

.querypackages 명령을 사용하여 전체 패키지 이름과 AppId를 찾습니다. .querypackages를 입력한 다음 사용자 CRTL+F를 입력하여 HelloWorld와 같은 애플리케이션 이름에 대한 출력을 검색합니다. 항목이 Ctrl+F를 사용하여 있는 경우 패키지 전체 이름(예: e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8AppId of AppId)이 표시됩니다.

예제:

0:000>  .querypackages 
...
Package Full Name: e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Package Display Name: HelloWorld
Version: 1.0.0.0
Processor Architecture: x86
Publisher: CN=user1
Publisher Display Name: user1
Install Folder: c:\users\user1\documents\visual studio 2015\Projects\HelloWorld\HelloWorld\bin\x86\Release\AppX
Package State: Unknown
AppId: App
...

매니페스트의 에서 기본 패키지 이름 보기

문제 해결을 위해 Visual Studio에서 기본 패키지 이름을 볼 수 있습니다.

Visual Studio에서 기본 패키지 이름을 찾으려면 프로젝트 탐색기에서 ApplicationManifest.xml 파일을 클릭합니다. 기본 패키지 이름은 패키징 탭 아래에 "패키지 이름"으로 표시됩니다. 기본적으로 패키지 이름은 GUID(예: e24caf14-8483-4743-b80c-ca46c28c75df)입니다.

메모장을 사용하여 기본 패키지 이름을 찾으려면 ApplicationManifest.xml 파일을 열고 ID 이름 태그를 찾습니다.

  <Identity
    Name="e24caf14-8483-4743-b80c-ca46c28c75df"
    Publisher="CN= User1"
    Version="1.0.0.0" />

매니페스트에서 애플리케이션 ID 찾기

설치된 UWP 앱의 매니페스트 파일에서 애플리케이션 ID를 찾으려면 애플리케이션 ID 항목을 찾습니다.

예를 들어 hello world 앱의 경우 애플리케이션 ID는 입니다.

<Application Id="App"
      Executable="$targetnametoken$.exe"
      EntryPoint="HelloWorld.App">

WinDbg 명령줄 예제

전체 패키지 이름 및 AppId를 사용하여 디버거에서 HelloWorld 앱을 로드하는 예제 명령줄입니다.

windbg.exe -plmPackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 -plmApp App

디버거에서 백그라운드 작업 시작

TaskId를 사용하여 명령줄의 디버거에서 백그라운드 작업을 명시적으로 시작할 수 있습니다. 이렇게 하려면 -plmPackage 및 -plmBgTaskId 명령줄 매개 변수를 사용합니다.

windbg.exe -plmPackage <PLMPackageName> -plmBgTaskId <BackgroundTaskId>
매개 변수 설명
<PLMPackageName>

애플리케이션 패키지의 이름입니다. .querypackages 명령을 사용하여 모든 UWP 애플리케이션을 나열합니다. 패키지 위치에 대한 경로를 제공하지 말고 패키지 이름만 제공합니다.

<BackgroundTaskId>

BackgroundTaskId는 아래에 설명된 대로 .querypackages 명령을 사용하여 배치할 수 있습니다.

애플리케이션 매니페스트 파일에 대한 자세한 내용은 앱 패키지 매니페스트를 참조하세요.

디버거에서 SDKSamples.BackgroundTask 코드를 로드하는 예제입니다.

windbg.exe -plmPackage Microsoft.SDKSamples.BackgroundTask.CPP_1.0.0.0_x64__8wekyb3d8bbwe -plmBgTaskId {ee4438ee-22db-4cdd-85e4-8ad8a1063523}

백그라운드 작업 샘플 코드를 실험하여 UWP 디버깅에 익숙해질 수 있습니다. 백그라운드 작업 샘플에서 다운로드할 수 있습니다.

.querypackages 명령을 사용하여 BackgroundTaskId를 찾습니다. Ctrl-F를 사용하여 앱을 찾은 다음 백그라운드 작업 ID 필드를 찾습니다. 연결된 백그라운드 작업 이름 및 작업 ID를 표시하려면 백그라운드 작업을 실행해야 합니다.

0:000> .querypackages
...
Package Full Name: Microsoft.SDKSamples.BackgroundTask.CPP_1.0.0.0_x86__8wekyb3d8bbwe
Package Display Name: BackgroundTask C++ sample
Version: 1.0.0.0
Processor Architecture: x86
Publisher: CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
Publisher Display Name: Microsoft Corporation
Install Folder: C:\Users\user1\Documents\Visual Studio 2015\Projects\Background_task_sample\C++\Debug\BackgroundTask.Windows\AppX
Package State: Running
AppId: BackgroundTask.App
Background Task Name: SampleBackgroundTask
Background Task Id: {ee4438ee-22db-4cdd-85e4-8ad8a1063523}
...

전체 패키지 이름을 알고 있는 경우 .querypackage를 사용하여 백그라운드 작업 ID 필드를 표시할 수 있습니다.

PLMDebug의 enumerateBgTasks 옵션을 사용하여 BackgroundTaskId를 찾을 수도 있습니다. PMLDebug 사용성에 대한 자세한 내용은 PLMDebug를 참조하세요.

C:\Program Files\Debugging Tools for Windows (x64)>PLMDebug /enumerateBgTasks Microsoft.SDKSamples.BackgroundTask.CPP_1.0.0.0_x64__8wekyb3d8bbwe
Package full name is Microsoft.SDKSamples.BackgroundTask.CPP_1.0.0.0_x64__8wekyb3d8bbwe.
Background Tasks:
SampleBackgroundTask : {C05806B1-9647-4765-9A0F-97182CEA5AAD}

SUCCEEDED

프로세스 서버를 사용하여 원격으로 UWP 프로세스 디버깅(DbgSrv)

모든 -plm* 명령은 dbgsrv에서 올바르게 작동합니다. dbgsrv를 사용하여 디버그하려면 dbgsrv에 대한 연결 문자열 -premote 스위치를 사용합니다.

windbg.exe -premote npipe:pipe=fdsa,server=localhost -plmPackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 -plmApp App

-premote 옵션에 대한 자세한 내용은 프로세스 서버(사용자 모드)프로세스 서버 예제를 참조하세요.

UWP 앱 명령 요약

이 섹션에서는 UWP 앱 디버거 명령에 대한 요약을 제공합니다.

패키지 정보 수집

.querypackage

.querypackage는 UWP 애플리케이션의 상태를 표시합니다. 예를 들어 앱이 실행 중인 경우 활성 상태일 수 있습니다.

.querypackage <PLMPackageName>

예제:

0:000> .querypackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Package Full Name: e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Package Display Name: HelloWorld
Version: 1.0.0.0
Processor Architecture: x86
Publisher: CN=user1
Publisher Display Name: user1
Install Folder: c:\users\user1\documents\visual studio 2015\Projects\HelloWorld\HelloWorld\bin\x86\Release\AppX
Package State: Running
AppId: App
Executable: HelloWorld.exe

.querypackages

.querypackages 명령은 설치된 모든 UWP 애플리케이션과 해당 현재 상태를 나열합니다.

.querypackages

예제:

0:000> .querypackages
...
Package Full Name: Microsoft.MicrosoftSolitaireCollection_3.9.5250.0_x64__8wekyb3d8bbwe
Package Display Name: Microsoft Solitaire Collection
Version: 3.9.5250.0
Processor Architecture: x64
Publisher: CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
Publisher Display Name: Microsoft Studios
Install Folder: C:\Program Files\WindowsApps\Microsoft.MicrosoftSolitaireCollection_3.9.5250.0_x64__8wekyb3d8bbwe
Package State: Unknown
AppId: App

Package Full Name: e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Package Display Name: HelloWorld
Version: 1.0.0.0
Processor Architecture: x86
Publisher: CN=user1
Publisher Display Name: user1
Install Folder: c:\users\user1\documents\visual studio 2015\Projects\HelloWorld\HelloWorld\bin\x86\Release\AppX
Package State: Running
AppId: App
Executable: HelloWorld.exe

Package Full Name: Microsoft.SDKSamples.BackgroundTask.CPP_1.0.0.0_x86__8wekyb3d8bbwe
Package Display Name: BackgroundTask C++ sample
Version: 1.0.0.0
Processor Architecture: x86
Publisher: CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
Publisher Display Name: Microsoft Corporation
Install Folder: C:\Users\user1\Documents\Visual Studio 2015\Projects\Background_task_sample\C++\Debug\BackgroundTask.Windows\AppX
Package State: Unknown
AppId: BackgroundTask.App

...

디버깅용 앱 시작

.createpackageapp

.createpackageapp 명령은 디버깅을 사용하도록 설정하고 UWP 애플리케이션을 시작합니다.

.createpackageapp <PLMPackageName> <ApplicationId> [<parameters>] 

이 표에는 .createpackageapp에 대한 매개 변수가 나열됩니다.

매개 변수 설명
<PLMPackageName> 애플리케이션 패키지의 이름입니다. .querypackages 명령을 사용하여 모든 UWP 애플리케이션을 나열합니다. 패키지 위치에 대한 경로를 제공하지 말고 패키지 이름만 제공합니다.
<ApplicationId>

ApplicationId는 이 항목의 앞부분에서 설명한 대로 .querypackage 또는 .querypackages를 사용하여 배치할 수 있습니다.

애플리케이션 매니페스트 파일에 대한 자세한 내용은 앱 패키지 매니페스트를 참조하세요.

[<parameters>] 애플리케이션에 전달되는 선택적 매개 변수입니다. 모든 애플리케이션에서 이러한 선택적 매개 변수를 요구하거나 사용하는 것은 아닙니다.

예제:

.createpackageapp e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 App

디버그 명령 사용 및 사용 안 함

.enablepackagedebug

.enablepackagedebug 명령을 사용하면 UWP 애플리케이션에 대한 디버깅을 사용할 수 있습니다. 일시 중단, 다시 시작 또는 종료 함수를 호출하기 전에 .enablepackagedebug를 사용해야 합니다.

.createpackageapp 명령을 사용하면 앱의 디버깅도 가능합니다.

.enablepackagedebug <PLMPackageName>

예제:

.enablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

.disablepackagedebug

.disablepackagedebug 명령은 UWP 애플리케이션에 대한 디버깅을 사용하지 않도록 설정합니다.

.disablepackagedebug <PLMPackageName>

예제:

.disablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

앱 시작 및 중지

일시 중단, 다시 시작 및 종료는 패키지에서 현재 실행 중인 모든 앱에 영향을 둡니다.

.suspendpackage

.suspendpackage 명령은 UWP 애플리케이션을 일시 중단합니다.

.suspendpackage <PLMPackageName> 

예제:

0:024> .suspendpackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

.resumepackage

.resumepackage 명령은 UWP 애플리케이션을 다시 시작합니다.

.resumepackage <PLMPackageName> 

예제:

.resumepackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

.terminatepackageapp

.terminatepackageapp 명령은 패키지의 모든 UWP 애플리케이션을 종료합니다.

.terminatepackageapp <PLMPackageName> 

예제:

.terminatepackageapp e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

백그라운드 작업

.activatepackagebgtask

.activatepackagebgtask 명령은 디버깅을 사용하도록 설정하고 UWP 백그라운드 작업을 시작합니다.

 .activatepackagebgtask <PLMPackageName> <bgTaskId>

예제:

.activatepackagebgtask Microsoft.SDKSamples.BackgroundTask.CPP_1.0.0.0_x64__8wekyb3d8bbwe {C05806B1-9647-4765-9A0F-97182CEA5AAD}

사용 예제

앱이 시작될 때 디버거 연결

e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8이라는 패키지에 있는 HelloWorld라는 앱이 있다고 가정합니다. 전체 이름을 표시하고 설치된 모든 패키지를 실행하여 패키지가 설치되었는지 확인합니다. 명령 프롬프트 창에서 다음 명령을 입력합니다. Ctrl+F를 사용하여 HelloWorld의 앱 이름에 대한 명령 출력을 검색할 수 있습니다.

.querypackages 
...

Package Full Name: e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8
Package Display Name: HelloWorld
Version: 1.0.0.0
Processor Architecture: x86
Publisher: CN=user1
Publisher Display Name: user1
Install Folder: c:\users\user1\documents\visual studio 2015\Projects\HelloWorld\HelloWorld\bin\x86\Release\AppX
Package State: Unknown
AppId: App

...

.createpackageapp을 사용하여 앱을 시작하고 연결합니다. .createpackageapp 명령을 사용하면 앱의 디버깅도 가능합니다.

.createpackageapp e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8 App

디버깅을 완료하면 .disablepackagedebug 명령을 사용하여 패키지에 대한 디버그 참조 수를 줄입니다.

.disablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

이미 실행 중인 앱에 디버거 연결

이미 실행 중인 MyApp에 WinDbg를 연결하려는 경우를 가정해 보겠습니다. WinDbg의 파일 메뉴에서 프로세스에 연결을 선택합니다. MyApp에 대한 프로세스 ID를 적어 둡니다. 프로세스 ID가 4816이라고 가정해 보겠습니다. MyApp을 포함하는 패키지에 대한 디버그 참조 수를 증분합니다.

.enablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

WinDbg의 프로세스에 연결 대화 상자에서 프로세스 4816을 선택하고 확인을 클릭합니다. WinDbg는 MyApp에 연결됩니다.

디버깅을 완료하면 .disablepackagedebug 명령을 사용하여 패키지에 대한 디버그 참조 수를 줄입니다.

.disablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

수동으로 앱 일시 중단 및 다시 시작

다음 단계에 따라 앱을 수동으로 일시 중단하고 다시 시작합니다. 먼저 앱이 포함된 패키지에 대한 디버그 참조 수를 증분합니다.

.enablepackagedebug  e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

패키지를 일시 중단합니다. 앱의 일시 중단 처리기가 호출되므로 디버깅에 유용할 수 있습니다.

.suspendpackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

디버깅을 마쳤으면 패키지를 다시 시작합니다.

.resumepackage e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

마지막으로 패키지에 대한 디버그 참조 수를 줄입니다.

.disablepackagedebug e24caf14-8483-4743-b80c-ca46c28c75df_1.0.0.0_x86__97ghe447vaan8

참고 항목