조건부 breadkpoint
아래와 같은 코드를 포함한 TestApp.exe 프로그램이 있고, 지역변수 i의 값이 9999인 상황에 문제가 발생한다 가정해 보자.
void DoSomething( int iValue ) { static int iStaticValue = 0; iStaticValue = iValue; } void SomeFunction() { int i = 0; for ( i = 0; i < 10000; i++ ) { DoSomething( i ); } } |
이 경우 다음과 같은 선택이 가능할 것이다.
1. 해당 함수에 breakpoint를 걸고 9999번을 트레이스 한다.(설마?)
2. i값을 디버깅 상태에서 수정해서 디버깅을 한다.(어디까지나 이건 가정이고 만들어낸 예시 코드니까 이경우엔 부가적인 문제가 있다고 치자 - 예시는 예시일 뿐, 꼬투리 잡지 말자~)
3. 다음과 같은 코드를 작성한 후, “int k = 0;”에 breakpoint를 걸어서 디버깅한다.
void SomeFunction() { int i = 0; for ( i = 0; i < 10000; i++ ) { if ( i == 9999 ) { int k = 0; } DoSomething( i ); } } |
아마 많은 개발자들이 이와 같은 방법으로 디버깅을 할 꺼라 생각된다.
하지만 이러한 상황이 Unload를 지원하지 않는 드라이버의 코드라면? 혹은 여러 모듈이 얽혀서 돌아가는 시스템의 일부라면 여간 성가신 작업이 아닐 수 없다.
바로 이러한 상황에 사용하면 편리한 것이 조건부 breakpoint이다.
위의 상황에 적용해 보자면 아래와 같은 설정이 되겠다.(SomeFunction에 breakpoint를 걸려면 주소를 써야하니 보기 편하게 DoSomething()에 breakpoint를 걸어본다)
bp TestApp!DoSomething ".if@@( iValue == 9999 ) {} .else {gc}" |
breakpoint에서 멈춰진 후 iValue의 값을 보면 9999임을 알 수 있다.
그럼 조건부 breakpoint 문법에 대해 조금 자세히 살펴보자
bp FuncAddress “.if @@(Condition) { Commands } .elsif @@(Condition) { Commands } .else { Commands }” |
n @@( )
괄호안에는 C/C++타입의 코드를 사용할 수 있을 뿐만 아니라, 정확한 심볼이 있다면 변수의 이름도 사용 가능하다..
n { Commands }
n Breakpoint가 적중되었을때 실행될 Windbg Command를 입력한다.
n 메시지를 출력하려면 .echo String 을 쓴다
n 두개 이상의 명령을 사용하려면, ;로 각 명령어를 구분한다.
n .else 조건(조건이 만족하지 않을 경우)에는 g 커맨드 대신 gc(Go from Conditional Breakpoint)를 사용한다.(gc대신 g를 사용하면 해당 함수를 한 줄씩 step trace하는 동안 해당 함수를 도달 했을때 다음 명령(F10)이 아니라 F5를 누른 것처럼 그냥 진행되어 버린다.)
n bp FuncAddress ntimes
로 breakpoint를 설정하면 해당 breakpoint가 ntimes만큼 적중(?)되었을 때 breakpoint가 걸리게 된다.
- [ bp TestApp!DoSomthing 10 ]
* 참고사이트
http://blogs.msdn.com/debuggingtoolbox/archive/2008/06/12/special-command-if-and-j-to-use-in-breakpoints-and-scripts.aspx
'Windows Programming > 디버깅' 카테고리의 다른 글
[windbg] ba(break on access) 메모리 엑세스 시점 잡기 (0) | 2011.07.11 |
---|---|
Windbg case by case (0) | 2011.07.08 |
‘Low’ Integrity level 프로세스 디버깅 (0) | 2011.07.07 |
[WinDbg] Kernel 모드에서 특정 프로세스 디버깅하기 (0) | 2011.07.05 |
WOW64 디버깅 (0) | 2011.06.27 |