관리 메뉴

c0smicb0y

Child Process를 디버깅하는 방법 본문

프로그래밍/Windows

Child Process를 디버깅하는 방법

2015. 11. 21. 22:01

환경: Windows 10 Pro 64bit


1. 문제

Windows 10 64bit 환경에서 작성한 간단한 디버거로 calc.exe가 제대로 디버깅 되지 않는 사태가 발생하였다.


EXIT_PROCESS_DEBUG_EVENT 이후 아무런 이벤트가 발생하지 않는다.


멘토님이 UWP(Universal Windows Platform)이라서 calc.exe를 실행시키면 calc.exe에서 유니버셜 앱인 Calculator.exe를 실행시켜주는 것이라고 하셨다.


그래서 단지 자식프로세스를 디버깅하는 방법을 찾으면 디버깅이 가능할 것 같아서 구글링을 해보았다.


MSDN에서는 CreateProcess를 할때 주는 인자 중 하나인 Process Creation Flag에 다음과 같이 명시되어 있다.


https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms684863(v=vs.85).aspx


새로운 프로세스에 의해 만들어지는 새로운 프로세스와 모든 자식프로세스에 대해 Calling thread가 시작되고 디버깅한다.


즉, Process Creation Flag에 DEBUG_PROCESS를 인자로 주면 자식프로세스에 대해서도 디버깅이 될 것이다.


그래서 기존의 코드에서 프로세스를 생성하는 부분을 다음과 같이 해주었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    STARTUPINFO            si = {0};
    PROCESS_INFORMATION pi = {0};
    wchar_t* target = L"c:\\windows\\system32\\calc.exe";
 
 
    if (TRUE != CreateProcessW(
                    target, 
                    NULL, 
                    NULL, 
                    NULL, 
                    FALSE, 
                    CREATE_NEW_CONSOLE | DEBUG_PROCESS, //자식프로세스도 디버깅가능
                    NULL, 
                    NULL, 
                    &si, 
                    &pi))
    {
        log("CreateProcess() failed. gle = %u", GetLastError());
        return -1;
    }
cs


이제 Calculator.exe까지 디버깅이 잘 되어야 할 것이다.



하지만 결과는 똑같이 아무 디버그 이벤트도 발생하지 않았다.


혹시나 해서 따로 자식프로세스를 실행시키는 프로그램을 작성하여 디버거를 붙여보았는데, 자식프로세스까지 디버깅이 잘 되었다.


왜 calc.exe는 자식프로세스까지 디버깅이 되지 않는 것일까?


실행 루틴을 좀 더 자세히 살펴보기 위해 windbg를 이용하여 디버깅해보았다.



현재 pid는 0x908(==2312)이다. 그리고 아랫창에서 보이는 call ntdll!ZwContinue 이후 Calculator.exe가 실행된다.



하지만 Calculator.exe의 pid는 9692이고, windbg애서도 자식프로세스에 잡히지 않았다.


UWP가 실행하는 루틴이 일반적인 자식프로세스를 생성하는 루틴과 다른 것 같은 느낌이 들어서 UWP에 대해 더 알아보았다.


2. UWP(Universal Windows Platform)

MSDN에서는 UWP를 기반으로 만들어진 유니버셜 Windows 앱을 다음과 같이 설명하고 있다.


https://msdn.microsoft.com/ko-kr/library/windows/apps/dn726767.aspx

유니버설 Windows 앱은 Windows 8에서 Windows 런타임으로 처음 도입된 UWP(유니버설 Windows 플랫폼)를 기반으로 하는 Windows 환경입니다. 유니버설 Windows 앱의 핵심은 사용자가 자신의 모든 장치에서 모바일 환경을 원하고 작업에 가장 편리하거나 생산적인 장치를 사용하기를 원한다는 개념입니다.


그리고 유니버셜 Windows 앱의 특징으로 다음과 같이 설명하고 있다.


  • .AppX 패키지 형식을 사용하여 앱이 패키지되고 배포됩니다.

    모든 유니버설 Windows 앱은 AppX 패키지로 배포됩니다. 이는 신뢰할 수 있는 설치 메커니즘을 제공하며 앱을 원활하게 배포 및 업데이트할 수 있도록 해줍니다.

  • 장치 패밀리 간의 공통 API 표면이 있습니다.

    UWP(유니버설 Windows 플랫폼) 핵심 API가 모든 Windows 장치 패밀리에 대해 동일합니다. 앱에서 핵심 API만 사용하는 경우 이 앱은 모든 Windows 10 장치에서 실행됩니다.


iOS나 Android에서 말하는 유니버셜 앱과 비슷한 개념을 Windows에 도입하였다는 뉘앙스였다.


그리고 MSDN을 조금 더 찾아보다가 다음과 같은 글을 발견하였다.

https://msdn.microsoft.com/ko-kr/library/windows/apps/hh465029.aspx


유니버셜 앱이 다른 모바일 앱들이 차용하고 있는 샌드박스와 같은 개념을 적용시키고 있는 듯 하다.


다음 기사에서도 동일한 내용을 발견하였다.

http://www.tomsitpro.com/articles/windows-10-app-development-appx,1-2566.html


AppX 포맷의 가장 중요한 측면은 앱들이 호스트 머신으로부터 고립될 것이라는 것이다. 이것은 UWP 앱들이 커널이나 시스템 드라이버에 더 이상 접근할 수 없다는 것을 의미한다. 앱들은 이제 컨테이너화 되었다.


그래서 계산기를 실행시킨 뒤, 작업관리자에서 파일위치열기를 통해 직접 Calculator.exe를 실행시켜보았다.



같은 폴더에 있는 다른 윈도우 앱들도 모두 이런 메시지가 뜨면서 직접적으로 실행이 되지 않았다.


추측하건데 calc.exe를 실행하면 앱 컨테이너의 컨텍스트를 생성시키고 Calculator.exe를 실행시켜준 뒤, calc.exe는 종료되는 듯하다. 여기서 Calculator.exe를 실행시키는 과정에서 일반적인 Createprocess와 다른 루틴을 통해 프로세스를 실행시키므로 디버그 이벤트가 발생하지 않아서 디버깅이 되지 않는 듯하다. 기존의 디버깅 API에 정의되어 있는 이벤트에서 벗어나는 이벤트가 발생할 것이다.


3. 결론

열심히 삽질하고 UWP 구조에 대해 미비하게 깨달았다. 그리고 Process Creation Flag에 DEBUG_PROCESS를 넣으면 다른 프로그램들은 잘 디버깅 됩니다! calc.exe가 조금 특별한 실행파일이네요.

'프로그래밍 > Windows' 카테고리의 다른 글

VC 컴파일러 환경 변수 설정  (0) 2015.11.13
함수에서의 레지스터 사용  (0) 2015.11.04
Calling Convention (호출규약)  (0) 2015.11.04
ShellExecute vs CreateProcess  (0) 2015.10.02
Comments