다음을 통해 공유


.NET Framework 명령줄 디버거(MDbg.exe)

도구 공급업체와 응용 프로그램 개발자는 .NET Framework 명령줄 디버거를 사용하여 .NET Framework 공용 언어 런타임을 대상으로 하는 프로그램에서 버그를 찾고 수정할 수 있습니다. 이 도구는 런타임 디버그 API를 사용하여 디버깅 서비스를 제공합니다. MDbg.exe의 소스 코드는 .NET Framework SDK의 샘플 응용 프로그램으로 제공됩니다. 개발자는 이 코드를 통해 디버깅 서비스의 사용 방법을 배울 수 있습니다. 현재는 MDbg.exe를 사용하여 관리 코드만 디버깅할 수 있으며, 비관리 코드의 디버깅은 지원되지 않습니다.

MDbg [ProgramName[Program arguments]] [optional arguments ]
command [command arguments]

명령

명령 설명

ap[rocess] [number]

다른 디버깅된 프로세스로 전환하거나 사용 가능한 프로세스를 인쇄합니다. 번호는 실제 PID가 아니라 인덱싱된(0부터 시작) 목록입니다.

a[ttach] [pid]

프로세스에 연결하거나 사용 가능한 프로세스를 인쇄합니다.

b[reak] [ClassName.Method | FileName:LineNo]

지정한 메서드에 중단점을 설정합니다. 모듈은 순차적으로 검색됩니다. break FileName:LineNo는 소스 위치에 중단점을 설정합니다. break ~numberx 명령을 사용하여 최근에 표시된 기호에 중단점을 설정합니다. break module!ClassName.Method+IlOffset은 정규화된 위치에 중단점을 설정합니다.

ca[tch] [exceptionType]

디버거가 처리되지 않은 예외뿐 아니라 모든 예외에서 중단되도록 합니다.

conf[ig] [option value]

구성 가능한 모든 옵션 및 옵션 값 없이 옵션을 호출하는 방법을 표시합니다. 옵션이 지정되어 있으면 value를 현재 옵션으로 설정합니다.

현재 사용 가능한 옵션은 다음과 같습니다.

extpath: load 명령을 사용할 때 확장을 검색하는 경로를 설정합니다.

extpath+: 확장을 로드할 수 있는 기존 경로에 경로를 추가합니다.

del[ete]

중단점을 삭제합니다.

de[tach]

디버깅된 프로세스에서 분리합니다.

d[own] [frames]

활성 스택 프레임을 아래로 이동합니다.

echo

콘솔에 메시지를 표시합니다.

ex[it] [exitcode]

선택적으로 프로세스 종료 코드를 지정하여 MDbg.exe 셸을 종료합니다.

fo[reach] [OtherCommand]

모든 스레드에서 명령을 수행합니다. OtherCommand는 한 스레드에서 작동하는 유효한 명령이며, foreach OtherCommand는 모든 스레드에서 같은 명령을 수행합니다.

f[unceval] [-ad Num] functionName [args ... ]

실행할 함수가 functionName인 현재 활성 스레드에서 함수 실행을 수행합니다. 함수 이름은 네임스페이스를 포함하는 정규화된 이름이어야 합니다.

-ad 옵션은 함수 확인에 사용할 응용 프로그램 도메인을 지정합니다. -ad 옵션을 지정하지 않으면 확인에 사용되는 응용 프로그램 도메인이 기본적으로 함수 실행에 사용된 스레드가 있는 응용 프로그램으로 지정됩니다.

실행 중인 함수가 정적 함수가 아닌 경우 전달된 첫 번째 매개 변수는 this 포인터여야 합니다. 모든 응용 프로그램 도메인에서 함수 실행에 대한 인수가 검색됩니다.

응용 프로그램 도메인에서 값을 요청하려면 변수 앞에 모듈 및 응용 프로그램 도메인 이름을 붙여야 합니다. 예를 들어, funceval -ad 0 System.Object.ToString hello.exe#0!MyClass.g_rootRef를 입력합니다.

이 명령은 응용 프로그램 도메인 0에서 System.Object.ToString 함수를 실행합니다. ToString 메서드는 인스턴스 함수이므로 첫 번째 매개 변수는 this 포인터여야 합니다.

g[o]

중단점을 만나거나, 프로그램이 종료되거나, 처리되지 않은 예외와 같은 이벤트에 의해 프로그램이 중지될 때까지 프로그램이 계속 실행되도록 합니다.

h[elp] [command]

또는

? [command]

모든 명령에 대한 설명이나 지정한 명령에 대한 자세한 설명을 표시합니다.

ig[nore] [event]

디버거가 처리되지 않은 예외에서만 중지되도록 합니다.

int[ercept] FrameNumber

디버거를 지정한 프레임 번호로 롤백합니다.

디버거에서 예외가 발생한 경우 디버거를 지정한 프레임 번호로 롤백하려면 이 명령을 사용합니다. set 명령을 사용하여 프로그램 상태를 변경하고 go 명령을 사용하여 계속할 수 있습니다.

k[ill]

활성 프로세스를 중지합니다.

l[ist] [modules|appdomains|assemblies]

로드된 모듈, 응용 프로그램 도메인 또는 어셈블리를 표시합니다.

lo[ad] assemblyName

지정한 어셈블리를 로드한 다음 Microsoft.Tools.Mdbg.Extension.Extension 형식에서 정적 메서드 LoadExtension을 실행하려고 시도하는 방식으로 확장을 로드합니다.

mo[de] [option on/off]

다양한 디버거 옵션을 설정합니다. option 매개 변수는 두 문자로 이루어진 쌍이어야 합니다.

newo[bj] typeName [arguments...]

typeName 형식의 새 개체를 만듭니다.

n[ext]

코드를 실행하여 다음 줄에 여러 함수 호출이 포함된 경우에도 다음 줄로 이동합니다.

o[ut]

현재 함수의 끝으로 이동합니다.

pa[th] [pathName]

이진 파일의 위치를 사용할 수 없는 경우 지정한 경로에서 소스 파일을 검색합니다.

p[rint] [var] | [-d]

범위 안에 있는 모든 변수를 인쇄하거나(print), 지정한 변수를 인쇄하거나(print var), 디버거 변수를 인쇄합니다(print -d).

pro[cessenum]

활성 프로세스를 표시합니다.

q[uit] [exitcode]

선택적으로 프로세스 종료 코드를 지정하여 MDbg.exe 셸을 종료합니다.

re[sume] [*|[~]threadNumber]

현재 스레드나 threadNumber 매개 변수에 의해 지정된 스레드를 다시 시작합니다.

threadNumber 매개 변수가 *로 지정되거나 스레드 번호가 ~로 시작하는 경우 threadNumber에 의해 지정된 스레드를 제외한 모든 스레드에 명령이 적용됩니다.

중단되지 않은 스레드를 다시 시작하는 것은 아무 효과가 없습니다.

r[un] [-d(ebug) | -o(ptimize) | -enc] [[path_to_exe] [args_to_exe]]

현재 프로세스를 중단하고 새 프로세스를 시작합니다. 실행 가능한 인수를 전달하지 않으면 이전에 run 명령으로 실행된 프로그램이 실행되고, 실행 가능한 인수를 제공하면 선택적으로 제공된 인수를 사용하여 지정한 프로그램이 실행됩니다.

클래스 로드 이벤트, 모듈 로드 이벤트 및 스레드 시작 이벤트를 무시하는 경우(기본값) 프로그램은 주 스레드의 첫 번째 실행 가능한 명령에서 중단됩니다.

세 가지 플래그 중 하나를 사용하여 디버거에서 코드를 JIT(Just-In-Time) 컴파일하도록 지정할 수 있습니다.

사용할 수 있는 플래그는 다음과 같습니다.

-d(ebug)는 MDbg.exe의 기본값이며 최적화를 사용하지 않습니다.

-o(ptimize)는 디버거 외부에서 사용할 기본값입니다. 이 플래그는 디버거 외부에서 실행하는 것처럼 코드를 실행할 뿐 아니라 디버깅을 더 어렵게 만듭니다.

-enc를 사용하면 편집하며 계속하기 기능을 사용할 수 있지만 성능이 저하됩니다.

Set variable=value

범위 안에 있는 변수의 값을 변경합니다.

고유한 디버거 변수를 만들고 응용 프로그램 내에서 이 변수에 참조 값을 할당할 수 있습니다. 이 값은 원래 값이 범위 밖에 있더라도 원래 값에 대한 핸들 역할을 합니다. 모든 디버거 변수는 $var처럼 $로 시작해야 합니다. set $var= 명령을 사용하여 이 핸들을 Nothing으로 설정하면 이 핸들이 지워집니다.

Setip [-il] number

파일의 현재 IP(명령 포인터)를 지정한 위치로 설정합니다. -il 옵션을 지정하면 번호는 메서드의 Intermediate Language 오프셋을 나타내고, 그렇지 않으면 소스 줄 번호를 나타냅니다.

sh[ow] [lines]

표시할 줄 수를 지정합니다.

s[tep]

현재 줄에 있는 다음 함수를 실행하거나 실행할 함수가 없으면 다음 줄로 이동합니다.

su[spend] [*|[~]threadNumber]

현재 스레드나 threadNumber 매개 변수에 의해 지정된 스레드를 일시 중단합니다.

threadNumber*로 지정되면 모든 스레드에 명령이 적용됩니다. 스레드 번호가 ~로 시작하면 threadNumber에 의해 지정된 스레드를 제외한 모든 스레드에 명령이 적용됩니다. go 또는 step 명령으로 프로세스를 실행하면 일시 중단된 스레드가 실행에서 제외됩니다. 프로세스에 일시 중단되지 않은 스레드가 없는 상태에서 go 명령을 실행하면 프로세스가 계속되지 않습니다. 이 경우 CTRL-C 명령을 실행하여 프로세스를 중단합니다.

sy[mbol] commandName [commandValue]

다음 명령 중 하나를 지정합니다.

symbol path ["value"] - 현재 기호 경로를 표시하거나 설정합니다.

symbol addpath "value" - 현재 기호 경로에 추가합니다.

symbol reload ["module"] - 모든 기호 또는 지정한 모듈의 기호를 다시 로드합니다.

symbol list [module] - 모든 모듈 또는 지정한 모듈의 현재 로드된 기호를 표시합니다.

t[hread] [newThread][-nick name]

name을 현재 활성 스레드에 애칭으로 할당합니다. 스레드 이름 대신 애칭을 사용할 수 있습니다. 애칭은 숫자일 수 없습니다. 현재 스레드에 이미 할당된 애칭이 있으면 이전 애칭이 새 애칭으로 대체됩니다. 새 애칭이 ""이면 현재 스레드의 애칭이 삭제되고 스레드에 새 애칭이 할당되지 않습니다.

thread newThread - 활성 스레드를 newThread로 설정합니다. newThread는 스레드의 애칭 또는 스레드 번호일 수 있습니다.

thread - 현재 프로세스의 모든 관리되는 스레드를 표시합니다.

일반적으로 스레드는 스레드 번호로 식별되지만 스레드에 할당된 애칭이 있는 경우 애칭이 대신 표시됩니다.

u[p]

활성 스택 프레임을 위로 이동합니다.

uwgc[handle] [var] | [address]

핸들에 의해 추적되는 변수를 인쇄합니다. 핸들을 이름이나 주소로 지정할 수 있습니다.

when

현재 활성 when 문을 표시합니다.

when delete all | num [num [num …]] - 번호로 지정된 when 문을 삭제하거나 all을 지정한 경우 모든 when 문을 삭제합니다.

when stopReason [specific_condition] do cmd [cmd [cmd …] ] - stopReason 매개 변수는 다음이 될 수 있습니다.

StepComplete, ProcessExited, ThreadCreated, BreakpointHit, ModuleLoaded, ClassLoaded, AssemblyLoaded, AssemblyUnloaded, ControlCTrapped, ExceptionThrown, UnhandledExceptionThrown, AsyncStop, AttachComplete, UserBreak, EvalComplete, EvalException, RemapOpportunityReached, NativeStop.

specific_condition은 다음이 될 수 있습니다.

number - ThreadCreatedBreakpointHit의 경우 같은 값을 가진 스레드 ID/중단점 번호에 의해 중단될 때만 동작을 트리거합니다.

[!]name - ModuleLoaded, ClassLoaded, AssemblyLoaded, AssemblyUnloaded, ExceptionThrownUnhandledExceptionThrown의 경우 이름이 stopReason 이름과 일치할 때만 동작을 트리거합니다.

specific_conditionstopReason의 다른 값을 위해 비어 있어야 합니다.

w[here] [-v] [-c depth] [threadID]

스택 프레임에 대한 디버그 정보를 표시합니다.

-v 옵션은 표시된 각 스택 프레임에 대한 자세한 정보를 제공합니다.

depth의 수를 지정하면 표시되는 프레임 수가 제한됩니다. 모든 프레임을 표시하려면 all 명령을 사용합니다. 기본값은 100입니다.

threadID 매개 변수를 지정하면 스택과 연결할 스레드를 제어할 수 있습니다. 기본값은 현재 스레드만입니다. 모든 스레드를 가져오려면 all 명령을 사용합니다.

x [-c numSymbols] [module[!pattern]]

모듈의 pattern과 일치하는 함수를 표시합니다.

numSymbols를 지정하면 출력이 지정한 수로 제한됩니다. !regex를 지정하지 않으면 모든 함수가 표시됩니다. module을 제공하지 않으면 로드된 모든 모듈이 표시됩니다. 기호(~#)를 사용하면 break 명령을 통해 중단점을 설정할 수 있습니다.

참고

MDbg.exe 명령에서는 대/소문자가 구분됩니다.

설명

응용 프로그램을 컴파일할 때 컴파일러별 플래그를 사용하여 디버깅합니다. 이렇게 하면 컴파일러에서 디버깅 기호를 생성하도록 할 수 있습니다. 이러한 플래그에 대한 자세한 내용은 해당 컴파일러의 설명서를 참조하십시오. 최적화된 응용 프로그램을 디버깅할 수 있지만 일부 디버깅 정보가 표시되지 않습니다. 예를 들어, 다수의 지역 변수가 표시되지 않으며 소스 줄이 정확하지 않게 됩니다.

응용 프로그램을 컴파일한 다음에는 다음 예제에서와 같이 명령 프롬프트에 MDbg를 입력하여 디버깅 세션을 시작할 수 있습니다.

D:\Program Files\FrameworkSDK\Bin>MDbg
MDbg (Managed debugger) v2.0.50215.44 (beta2.050215-4400) started.
Copyright (C) Microsoft Corporation. All rights reserved.

For information about commands type "help";
to exit program type "quit".
mdbg>

mdbg 프롬프트는 현재 디버거를 실행 중임을 나타냅니다.

디버거를 실행한 다음에는 명령 및 해당 인수를 사용하여 필요한 기능을 호출할 수 있습니다.

예제

참고 항목

참조

.NET Framework 도구
SDK 명령 프롬프트