선언:

C#

[DllImport("kernel32")]
public static extern Int32 DebugActiveProcess(Int32 ProcessId);


VB.NET

<DllImport("kernel32")> _
Public Shared Function DebugActiveProcess(ProcessId As Int32) As Int32
End Function




사용 예제:

C#

using System;
using System.Runtime.InteropServices;

namespace ApiReference {
    class ApiExample {
        [DllImport("kernel32")]
        public static extern Int32 DebugActiveProcess(Int32 ProcessId);
        
        public static void Main(string[] args) {
        EnterPID:
            Console.Write("디버그할 프로세스의 식별자(PID)를 입력하세요: ");
            Int32 pid;
            try {
                pid = Int32.Parse(Console.ReadLine());
            } catch (Exception) {
                Console.WriteLine("다시 입력하세요");
                goto EnterPID;
            }
            
            if ( DebugActiveProcess(pid) != 0 )
                Console.WriteLine("프로세스 디버그 성공!");
            else
                Console.WriteLine("프로세스 디버그 실패!");
                
            Console.ReadKey(true);
        }
    }
}


VB.NET

Imports System
Imports System.Runtime.InteropServices

Namespace ApiReference
    Class ApiExample
        <DllImport("kernel32")> _
        Public Shared Function DebugActiveProcess(ProcessId As Int32) As Int32
        End Function

        Public Shared Sub Main(args As String())
            EnterPID:
            Console.Write("디버그할 프로세스의 식별자(PID)를 입력하세요: ")
            Dim pid As Int32
            Try
                pid = Int32.Parse(Console.ReadLine())
            Catch generatedExceptionName As Exception
                Console.WriteLine("다시 입력하세요")
                GoTo EnterPID
            End Try

            If DebugActiveProcess(pid) <> 0 Then
                Console.WriteLine("프로세스 디버그 성공!")
            Else
                Console.WriteLine("프로세스 디버그 실패!")
            End If

            Console.ReadKey(True)
        End Sub
    End Class
End Namespace




예제 실행 결과:




매개 변수 설명:

디버그할 프로세스의 식별자(PID)를 입력합니다.




API 설명:

실행 중인 프로세스를 디버그합니다.




참고:

DebugActiveProcess (MSDN)




비고:

위처럼 프로세스 A가 프로세스 B를 디버깅 하였을 경우,

두 프로세스는 서로 연결된 상태가 됩니다.


또한, 프로세스 B의 디버깅을 중지하지 않으면

프로세스 B는 종료되지 않는 좀비 프로세스로 남게됩니다.


만약 디버깅을 중지하지 않은 상태로 프로세스 A를 종료하게 되면

프로세스 A 가 디버깅한 프로세스 B 도 같이 종료가 됩니다.


위의 그림에서 알 수 있듯,

프로세스 A 를 종료하는 명령을 내릴 경우, 프로세스 A 는

자신이 디버깅한 프로세스가 모두 종료될 때 까지 무한 반복을 하다가

디버깅한 프로세스가 모두 종료되면, 종료 명령을 실행합니다.

'API Reference' 카테고리의 다른 글

22. GetWindowTextLength  (0) 2014.10.04
21. GetWindowText  (0) 2014.10.04
19. LoadLibrary  (0) 2014.10.01
18. GetModuleHandle  (0) 2014.09.30
17. FormatMessage  (0) 2014.09.29

+ Recent posts