. 브레이크 포인트 문법
{[Function],[Source File], [Binary Module]} |
. 소스에서 브레이크 포인트 설정하기
< 함수 명으로 중단점 설정하기>
<줄 번호로 중단점 설정하기>
<설정된 화면>
설정이 되었지만 소스 코드에서는 브레이크 포인트 표시(빨간 점)가 되지 않는다.
하지만 실행(디버그)을 시키면 아래와 같이 변한다.
<최초 실행 시 라인 브레이크 포인트에서 정지된 화면>
<중단점 화면>
계속 실행을 통하여 넘어간 화면
<함수 명 브레이크 포인트에 걸린 화면>
< 중단점 화면 >
실행전의 중단점 화면과 실행중의 중단점 화면이 다르다.
. 시스템이나 Export 된 함수에 브레이크 포인트 설정하기.
위의 기본 문법을 통하여 설정을 한 후 디버그를 실행하면 브레이크 포인트에 걸리지 않는다.
. Export 된 함수에 브레이크 포인트를 설정하기 위해서는 가장 먼저 Export 된 함수를 포함하고 있는 모듈의 심볼을 가지고 있는지 알아야 한다.
디버그 출력 창에 “<프로그램> : DLL 로드, 기호를 로드 하였습니다” 텍스트 출력 여부 |
디버그 메뉴의 하위 메뉴나 <Ctrl + Alt + U> 키를 눌러 표시할 수 있는 [모듈] 창에서 해당 모듈의 정보 컬럼에 ‘기호가 로드 되었습니다’ 라고 표시되는 확인. |
<심볼이 로드 되었는지 확인하는 방법>
. 만약 심볼이 로드 되어있지 않는 경우 슈도 심볼 테이블을 생성하기 위해 ‘도구 -> 옵션 -> 디버깅->네이티브->DLL 내보내기 로드’ 항목을 체크 하여야 한다.
<설정화면>
. 브레이크 포인트 설정하기.
심볼을 로드 하였을 경우
. 심볼 이름을 일치시켜야 정상적으로 브레이크 포인트 기능이 작동한다.
. LoadLibraryA(LPCSTR lpLibfileName) 인 경우 {,,KERNEL32.DLL}_LoadLibraryA@4 가 된다.
- _ 가 붙는 이유는 해당 Dll 때문인지 모르겠지만 최종이름이라고 표시된다.
@4 의 의미는 @#은 기본 문법이며, #의 의미는 매개변수 수 * 4이다. (64비트에서는 달라지지 않을까?)
심볼을 로드 하지 못 한경우.(슈도 심볼 테이블을 만들어야 한다.)
. {,,KERNEL32.DLL}LoadLibraryA 이다. (더 간단한 듯 하다.)
<설정 화면>
<중단점 설정 화면>
<브레이크 포인트에 걸린 화면>
<디스어셈블러로 확인한 모습>
. 사견
- 처음 브레이크 포인트 문법대로 설정을 하였을 경우 (Function 명 지정) 브레이크 포인트에 걸리지 않았다. 그래서 다른 방법으로 여러 가지를 확인 중 함수 명을 오른쪽으로 빼니깐 잘 되었다. (정석이 아닐 수 있다는 말입니다. ^^)
- DLL 관련 브레이크 포인트는 난생 처음 경험하는 브레이크 포인트였습니다. 자주 사용되지 않을 수 도 있지만 알고 있으면 좋을 듯 합니다.
- DLL 심볼을 로드 한 후 Export 된 함수에 브레이크 포인트를 걸어보진 못했습니다. (테스트 시간이….)
