bp, bu, bm(중단점 설정)
bp, bu 및 bm 명령은 하나 이상의 소프트웨어 중단점을 설정합니다. 위치, 조건 및 옵션을 결합하여 다양한 종류의 소프트웨어 중단점을 설정할 수 있습니다.
사용자 모드
[~Thread] bp[ID] [Options] [Address [Passes]] ["CommandString"]
[~Thread] bu[ID] [Options] [Address [Passes]] ["CommandString"]
[~Thread] bm [Options] SymbolPattern [Passes] ["CommandString"]
커널 모드
bp[ID] [Options] [Address [Passes]] ["CommandString"]
bu[ID] [Options] [Address [Passes]] ["CommandString"]
bm [Options] SymbolPattern [Passes] ["CommandString"]
매개 변수
스레드
중단점이 적용되는 스레드를 지정합니다. 구문에 대한 자세한 내용은 스레드 구문을 참조 하세요. 사용자 모드에서만 스레드를 지정할 수 있습니다. 스레드를 지정하지 않으면 중단점이 모든 스레드에 적용됩니다.
아이디
중단점을 식별하는 10진수를 지정합니다.
디버거는 중단점을 만들 때 ID를 할당하지만 br(Breakpoint Renumber) 명령을 사용하여 변경할 수 있습니다. ID를 사용하여 이후 디버거 명령에서 중단점을 참조할 수 있습니다. 중단점의 ID를 표시하려면 Bl(중단점 목록) 명령을 사용합니다.
명령에서 ID를 사용하는 경우 명령(bp 또는 bu)과 ID 번호 사이에 공백을 입력하지 마세요.
ID 매개 변수는 항상 선택 사항입니다. ID를 지정하지 않으면 디버거는 사용 가능한 첫 번째 중단점 번호를 사용합니다. 커널 모드에서는 32개의 중단점만 설정할 수 있습니다. 사용자 모드에서는 중단점 수를 설정할 수 있습니다. 두 경우 모두 ID 번호 값에 제한이 없습니다. ID를 대괄호([])로 묶으면 ID에 식이 포함될 수 있습니다. 구문에 대한 자세한 내용은 숫자 식 구문을 참조 하세요.
옵션 중단점 옵션을 지정합니다. 표시된 경우를 제외하고 다음 옵션의 수를 지정할 수 있습니다.
/1
"원샷" 중단점을 만듭니다. 이 중단점이 트리거되면 중단점 목록에서 삭제됩니다.
/p EProcess
(커널 모드에만 해당) 이 중단점과 연결된 프로세스를 지정합니다. EProcess는 PID가 아닌 EPROCESS 구조체의 실제 주소여야 합니다. 중단점은 이 프로세스의 컨텍스트에서 발생한 경우에만 트리거됩니다.
/t EThread
(커널 모드에만 해당) 이 중단점과 연결된 스레드를 지정합니다. EThread 는 스레드 ID가 아니라 ETHREAD 구조의 실제 주소여야 합니다. 중단점은 이 스레드의 컨텍스트에서 발생한 경우에만 트리거됩니다. /p EProcess 및 /t EThread를 사용하는 경우 순서에 따라 입력할 수 있습니다.
/c MaxCallStackDepth
호출 스택 깊이가 MaxCallStackDepth보다 작은 경우에만 중단점을 활성화합니다. 이 옵션은 /C와 함께 사용할 수 없습니다.
/C MinCallStackDepth
호출 스택 깊이가 MinCallStackDepth보다 큰 경우에만 중단점을 활성화합니다. 이 옵션은 /c와 함께 사용할 수 없습니다.
/a
(bm에만 해당) 데이터 공간이든 코드 공간에 있든 관계없이 지정된 모든 위치에 중단점을 설정합니다. 데이터의 중단점으로 인해 프로그램 오류가 발생할 수 있으므로 안전한 것으로 알려진 위치에서만 이 옵션을 사용합니다.
/d
(bm에만 해당) 중단점 위치를 주소로 변환합니다. 따라서 코드를 이동하는 경우 중단점은 SymbolPattern에 따라 설정되는 대신 동일한 주소에 유지됩니다. /d를 사용하여 모듈이 로드되거나 언로드될 때 중단점에 대한 변경 내용을 다시 평가하지 않도록 합니다.
/(
(bm에만 해당) SymbolString이 정의하는 기호 문자열에 매개 변수 목록 정보를 포함합니다.
이 기능을 사용하면 이름이 같지만 매개 변수 목록이 다른 오버로드된 함수에 중단점을 설정할 수 있습니다. 예를 들어 bm /( myFunc는 myFunc(int a) 및 myFunc(char a) 모두에서 중단점을 설정합니다. "/("가 없으면 중단점이 의도된 myFunc 함수를 나타내지 않으므로 myFunc에 설정된 중단점이 실패합니다.
/w dx 개체 식 dx 개체 식에서 반환된 부울 값을 기반으로 조건부 중단점을 설정합니다. 인수는 true(조건 일치 – 중단) 또는 false(조건과 일치하지 않음 - 중단 안 함)로 평가되는 데이터 모델(dx) 식입니다.
다음은 localVariable 값을 기반으로 조건부 중단점을 설정하는 예제입니다.
bp /w "localVariable == 4" mymodule!myfunction
이 예제에서는 JavaScript를 사용하여 중단점을 설정하는 방법을 보여줍니다.
bp /w "@$scriptContents.myFunc(localVariable)" @rip
디버거 개체 에 대한 자세한 내용은 dx(디버거 개체 모델 식 표시)를 참조하세요.
조건부 중단점에 대한 자세한 내용은 조건부 중단점 설정을 참조하세요.
주소
중단점이 설정된 명령의 첫 번째 바이트를 지정합니다. 주소를 생략하면 현재 명령 포인터가 사용됩니다. 구문에 대한 자세한 내용은 주소 및 주소 범위 구문을 참조 하세요.
전달
중단점이 활성화되는 실행 패스 수를 지정합니다. 디버거는 지정된 패스에 도달할 때까지 중단점 위치를 건너뜁니다. Passes 값은 16비트 또는 32비트 값일 수 있습니다.
기본적으로 중단점은 애플리케이션이 중단점 위치를 포함하는 코드를 처음 실행할 때 활성화됩니다. 이 기본 상황은 Passes의 값 1과 같습니다. 애플리케이션이 코드를 한 번 이상 실행한 후에만 중단점을 활성화하려면 2개 이상의 값을 입력합니다. 예를 들어 값 이 2 이면 코드가 두 번째로 실행될 때 중단점이 활성화됩니다.
이 매개 변수는 코드를 통과하는 각 패스에서 감소되는 카운터를 만듭니다. Passes 카운터의 초기 및 현재 값을 보려면 Bl(중단점 목록)을 사용합니다.
Passes 카운터는 애플리케이션이 g(Go) 명령에 대한 응답으로 중단점을 지나서 실행되는 경우에만 감소됩니다. 코드를 단계별로 실행하거나 카운터를 지나간 경우 카운터가 감소하지 않습니다. Passes 카운터가 1에 도달하면 중단점을 지우고 다시 설정해야만 다시 설정할 수 있습니다.
CommandString
중단점이 지정된 횟수를 발견할 때마다 실행되는 명령 목록을 지정합니다. CommandString 매개 변수를 따옴표로 묶어야 합니다. 세미콜론을 사용하여 여러 명령을 구분합니다.
CommandString의 디버거 명령에는 매개 변수가 포함될 수 있습니다. 표준 C 컨트롤 문자(예: \n 및 \")를 사용할 수 있습니다. 두 번째 수준 따옴표(\")에 포함된 세미콜론은 포함된 따옴표 문자열의 일부로 해석됩니다.
CommandString 명령은 애플리케이션이 g(Go) 명령에 대한 응답으로 실행되는 동안 중단점에 도달한 경우에만 실행됩니다. 코드를 단계별로 실행하거나 이 지점을 지나서 추적하는 경우 명령이 실행되지 않습니다.
중단점(예: g 또는 t)이 명령 목록의 실행을 종료한 후 프로그램 실행을 다시 시작하는 모든 명령입니다.
SymbolPattern
패턴을 지정합니다. 디버거는 이 패턴을 기존 기호와 일치시키고 모든 패턴 일치에 중단점을 설정하려고 합니다. SymbolPattern 에는 다양한 와일드카드 문자와 지정자가 포함될 수 있습니다. 이 구문에 대한 자세한 내용은 문자열 와일드카드 구문을 참조 하세요. 이러한 문자는 기호와 일치하므로 일치는 대/소문자를 구분하지 않으며 단일 선행 밑줄(_)은 선행 밑줄의 수량을 나타냅니다.
환경
항목 | 설명 |
---|---|
모드 | 사용자 모드, 커널 모드 |
대상 | 라이브 디버깅만 |
플랫폼 | all |
추가 정보
중단점 사용 방법, 다른 중단점 명령 및 중단점 제어 방법 및 커널 디버거에서 사용자 공간에 중단점을 설정하는 방법에 대한 자세한 내용 및 예제는 중단점 사용을 참조 하세요. 조건부 중단점에 대한 자세한 내용은 조건부 중단점 설정을 참조하세요.
설명
bp, bu 및 bm 명령은 새 중단점을 설정하지만 특징은 다릅니다.
bp(중단점 설정) 명령은 명령에 지정된 중단점 위치의 주소에 새 중단점을 설정합니다. 중단점이 설정될 때 디버거가 중단점 위치의 주소 식을 확인할 수 없는 경우 bp 중단점은 자동으로 bu 중단점으로 변환됩니다. bp 명령을 사용하여 모듈이 언로드된 경우 더 이상 활성화되지 않는 중단점을 만듭니다.
bu(해결되지 않은 중단점 설정) 명령은 지연되거나 해결되지 않은 중단점을 설정합니다. bu 중단점은 주소가 아닌 명령에 지정된 중단점 위치에 대한 기호 참조에 설정되며 참조가 있는 모듈이 확인될 때마다 활성화됩니다. 이러한 중단점에 대한 자세한 내용은 해결되지 않은 중단점(bu 중단점)을 참조하세요.
bm(기호 중단점 설정) 명령은 지정된 패턴과 일치하는 기호에 새 중단점을 설정합니다. 이 명령은 둘 이상의 중단점을 만들 수 있습니다. 기본적으로 패턴이 일치하면 bm 중단점은 bu 중단점과 동일합니다. 즉, bm 중단점은 기호 참조에 설정된 지연된 중단점입니다. 그러나 bm /d 명령은 하나 이상의 bp 중단점을 만듭니다. 각 중단점은 일치하는 위치의 주소에 설정되며 모듈 상태를 추적하지 않습니다.
기존 중단점을 설정하는 데 어떤 명령이 사용되었는지 확실하지 않은 경우 .bpcmds(중단점 명령 표시)를 사용하여 중단점을 만드는 데 사용된 명령과 함께 모든 중단점을 나열합니다.
bp 중단점과 부 중단점 사이에는 세 가지 주요 차이점이 있습니다.
bp 중단점 위치는 항상 주소로 변환됩니다. 모듈 변경으로 bp 중단점이 설정된 코드가 이동하면 중단점이 동일한 주소에 유지됩니다. 반면, bu 중단점은 사용된 기호 값(일반적으로 기호 및 오프셋)과 연결되어 있으며 주소가 변경되더라도 이 기호 위치를 추적합니다.
로드된 모듈에서 bp 중단점 주소가 발견되고 나중에 해당 모듈이 언로드되면 중단점이 중단점 목록에서 제거됩니다. 반면 에 부 중단점은 반복된 언로드 및 로드 후에 유지됩니다.
bp로 설정한 중단점은 WinDbg 작업 영역에 저장되지 않습니다. bu로 설정된 중단점은 작업 영역에 저장됩니다.
bm 명령은 중단점에 대한 기호 패턴에서 와일드카드 문자를 사용하려는 경우에 유용합니다. bm SymbolPattern 구문은 x SymbolPattern을 사용한 다음 각 결과에 bu를 사용하는 것과 같습니다. 예를 들어 "mem" 문자열로 시작하는 Myprogram 모듈의 모든 기호에 중단점을 설정하려면 다음 명령을 사용합니다.
예시
0:000> bm myprogram!mem*
4: 0040d070 MyProgram!memcpy
5: 0040c560 MyProgram!memmove
6: 00408960 MyProgram!memset
bm 명령은 프로세서 중단점이 아닌 소프트웨어 중단점을 설정하므로 데이터 손상을 방지하기 위해 중단점을 설정하는 경우 데이터 위치를 자동으로 제외합니다.
bp 또는 bm /a 명령을 사용할 때 프로그램 주소가 아닌 데이터 주소를 지정할 수 있습니다. 그러나 데이터 위치를 지정하더라도 이러한 명령은 프로세서 중단점이 아닌 소프트웨어 중단점을 만듭니다. 소프트웨어 중단점이 실행 코드 대신 프로그램 데이터에 배치되면 데이터가 손상될 수 있습니다. 따라서 해당 위치에 저장된 메모리가 프로그램 데이터가 아닌 실행 코드로 사용되도록 확신하는 경우에만 데이터 위치에서 이러한 명령을 사용해야 합니다. 그렇지 않으면 ba(Access에서 중단) 명령을 대신 사용해야 합니다. 자세한 내용은 프로세서 중단점(ba 중단점)을 참조하세요.
C++ 공용 클래스의 멤버 또는 제한된 문자가 포함된 임의의 텍스트 문자열과 같이 더 복잡한 구문으로 지정된 위치에 중단점을 설정하는 방법에 대한 자세한 내용은 중단점 구문을 참조하세요.
단일 논리 소스 줄이 여러 실제 줄에 걸쳐 있는 경우 중단점은 문 또는 호출의 마지막 물리적 줄에 설정됩니다. 디버거가 요청된 위치에서 중단점을 설정할 수 없는 경우 중단점을 다음으로 허용된 위치에 배치합니다.
스레드를 지정하면 중단점이 지정된 스레드에 설정됩니다. 예를 들어 ~*bp 명령은 모든 스레드에서 중단점을 설정하고, ~#bp 현재 예외를 발생시키는 스레드에서 중단점을 설정하고, ~123bp 는 스레드 123에서 중단점을 설정합니다. ~bp 및 ~.bp 명령은 모두 현재 스레드에서 중단점을 설정합니다.
커널 모드에서 다중 프로세서 시스템을 디버깅하는 경우 bp 또는 ba(액세스 중단)를 사용하여 설정한 중단점이 모든 프로세서에 적용됩니다. 예를 들어 현재 프로세서가 3이고 bp MemoryAddress를 입력하여 MemoryAddress에 중단점을 배치하는 경우입니다. 해당 주소에서 실행되는 모든 프로세서(프로세서 3뿐만 아니라)는 중단점 트랩을 발생합니다.
bp, bu 및 bm 명령은 프로세서 명령을 중단 명령으로 바꿔 소프트웨어 중단점을 설정합니다. 변경할 수 없는 읽기 전용 코드 또는 코드를 디버그하려면 실행 전용 액세스를 나타내는 ba e 명령을 사용합니다.
다음 명령은 MyTest 함수의 시작을 지나 중단점을 12바이트 설정합니다. 이 중단점은 코드를 통과하는 처음 여섯 번의 패스에 대해 무시되지만 실행은 코드를 통과하는 일곱 번째 패스에서 중지됩니다.
0:000> bp MyTest+0xb 7
다음 명령은 RtlRaiseException에서 중단점을 설정하고, eax 레지스터를 표시하고, MyVar 기호의 값을 표시하고, 계속합니다.
kd> bp ntdll!RtlRaiseException "r eax; dt MyVar; g"
다음 두 bm 명령은 세 개의 중단점을 설정합니다. 명령이 실행될 때 표시된 결과는 /d 스위치로 만든 중단점과 해당 스위치 없이 만든 중단점을 구분하지 않습니다. .bpcmds(중단점 표시 명령)를 사용하여 이러한 두 형식을 구분할 수 있습니다. /d 스위치 없이 bm에서 중단점을 만든 경우 .bpcmds 표시는 중단점 유형을 bu로 표시한 다음 @!"" 토큰으로 묶인 계산된 기호(숫자 식 또는 레지스터가 아니라 리터럴 기호임을 나타냄)를 나타냅니다. /d 스위치를 사용하여 bm에서 중단점을 만든 경우 .bpcmds 표시는 중단점 유형을 bp로 나타냅니다.
0:000> bm myprog!openf*
0: 00421200 @!"myprog!openFile"
1: 00427800 @!"myprog!openFilter"
0:000> bm /d myprog!closef*
2: 00421600 @!"myprog!closeFile"
0:000> .bpcmds
bu0 @!"myprog!openFile";
bu1 @!"myprog!openFilter";
bp2 0x00421600 ;