반응형

조건부 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를 설정하면 해당 breakpointntimes만큼 적중(?)되었을 때 breakpoint가 걸리게 된다.
- [ bp TestApp!DoSomthing 10 ]

 

* WinDbg 도움말 키워드 - 'Setting a Conditional Breakpoint' 

* 참고사이트

http://blogs.msdn.com/debuggingtoolbox/archive/2008/06/12/special-command-if-and-j-to-use-in-breakpoints-and-scripts.aspx

http://www.driveronline.org/bbs/view.asp?tb=tipbbs&no=91

반응형

+ Recent posts