. 브레이크 포인트 문법









{[Function],[Source File], [Binary Module]}


    


. 소스에서 브레이크 포인트 설정하기



< 함수 명으로 중단점 설정하기>



<줄 번호로 중단점 설정하기>



<설정된 화면>


    설정이 되었지만 소스 코드에서는 브레이크 포인트 표시(빨간 점)가 되지 않는다.


    하지만 실행(디버그)을 시키면 아래와 같이 변한다.




<최초 실행 시 라인 브레이크 포인트에서 정지된 화면>



<중단점 화면>


    계속 실행을 통하여 넘어간 화면



<함수 명 브레이크 포인트에 걸린 화면>



< 중단점 화면 >



    실행전의 중단점 화면과 실행중의 중단점 화면이 다르다.


    


. 시스템이나 Export 된 함수에 브레이크 포인트 설정하기.




  1. 위의 기본 문법을 통하여 설정을 한 후 디버그를 실행하면 브레이크 포인트에 걸리지 않는다.

    . Export 된 함수에 브레이크 포인트를 설정하기 위해서는 가장 먼저 Export 된 함수를 포함하고 있는 모듈의 심볼을 가지고 있는지 알아야 한다.













디버그 출력 창에 “<프로그램> : DLL 로드, 기호를 로드 하였습니다” 텍스트 출력 여부


디버그 메뉴의 하위 메뉴나 <Ctrl + Alt + U> 키를 눌러 표시할 수 있는 [모듈] 창에서 해당 모듈의 정보 컬럼에 ‘기호가 로드 되었습니다’ 라고 표시되는 확인.


<심볼이 로드 되었는지 확인하는 방법>



. 만약 심볼이 로드 되어있지 않는 경우 슈도 심볼 테이블을 생성하기 위해 ‘도구 -> 옵션 -> 디버깅->네이티브->DLL 내보내기 로드’ 항목을 체크 하여야 한다.



<설정화면>


. 브레이크 포인트 설정하기.




  1. 심볼을 로드 하였을 경우

    . 심볼 이름을 일치시켜야 정상적으로 브레이크 포인트 기능이 작동한다.


    . LoadLibraryA(LPCSTR lpLibfileName) 인 경우 {,,KERNEL32.DLL}_LoadLibraryA@4 가 된다.



  • _ 가 붙는 이유는 해당 Dll 때문인지 모르겠지만 최종이름이라고 표시된다.

  • @4 의 의미는 @#은 기본 문법이며, #의 의미는 매개변수 수 * 4이다. (64비트에서는 달라지지 않을까?)





  1. 심볼을 로드 하지 못 한경우.(슈도 심볼 테이블을 만들어야 한다.)

    . {,,KERNEL32.DLL}LoadLibraryA 이다. (더 간단한 듯 하다.)




    <설정 화면>



    <중단점 설정 화면>



    <브레이크 포인트에 걸린 화면>



    <디스어셈블러로 확인한 모습>

    . 사견



  • 처음 브레이크 포인트 문법대로 설정을 하였을 경우 (Function 명 지정) 브레이크 포인트에 걸리지 않았다. 그래서 다른 방법으로 여러 가지를 확인 중 함수 명을 오른쪽으로 빼니깐 잘 되었다. (정석이 아닐 수 있다는 말입니다. ^^)
  • DLL 관련 브레이크 포인트는 난생 처음 경험하는 브레이크 포인트였습니다. 자주 사용되지 않을 수 도 있지만 알고 있으면 좋을 듯 합니다.
  • DLL 심볼을 로드 한 후 Export 된 함수에 브레이크 포인트를 걸어보진 못했습니다. (테스트 시간이….)

Post to Twitter