중단점을 설정할 때 수반되는 위험
메모리 주소 또는 기호와 오프셋을 지정하여 중단점을 설정하는 경우 이 중단점을 명령 중간에 배치해서는 안 됩니다.
예를 들어 다음 디스어셈블된 코드를 고려합니다.
770000f1 5e pop esi
770000f2 5b pop ebx
770000f3 c9 leave
770000f4 c21000 ret 0x10
770000f7 837ddc00 cmp dword ptr [ebp-0x24],0x0
처음 세 가지 지침은 1 바이트 길이에 불과합니다. 그러나 네 번째 명령은 3바이트 길이입니다. (바이트 0x770000F4, 0x770000F5 및 0x770000F6 포함됩니다.) bp, bu 또는 ba 명령을 사용하여 이 명령에 중단점을 배치하려면 0x770000F4 주소를 지정해야 합니다.
ba 명령을 사용하여 0x770000F5 주소에 중단점을 배치하면 프로세서는 해당 위치에 중단점을 배치합니다. 그러나 프로세서는 0x770000F4 명령의 실제 주소로 간주하므로 이 중단점은 트리거되지 않습니다.
bp 또는 bu 명령을 사용하여 0x770000F5 주소에 중단점을 배치하는 경우 디버거는 해당 위치에 중단점을 씁니다. 그러나 디버거가 중단점을 만드는 방법 때문에 이 중단점이 대상을 손상시킬 수 있습니다.
디버거는 0x770000F5 내용을 저장하고 중단점 명령으로 이 메모리를 덮어씁니다.
디버거에서 이 메모리를 표시하려고 하면 디버거가 작성한 중단점 명령이 표시되지 않습니다. 대신 디버거는 "있어야"하는 메모리를 표시합니다. 즉, 디버거는 중단점을 삽입한 후 만든 원래 메모리 또는 해당 메모리에 대한 수정 사항을 표시합니다.
BC 명령을 사용하여 중단점을 제거하는 경우 디버거는 원래 메모리를 적절한 위치로 복원합니다.
0x770000F5 중단점을 배치하면 디버거가 이 바이트를 저장하고 중단 명령이 여기에 기록됩니다. 그러나 애플리케이션이 실행되면 0x770000F4 주소에 도달하고 이 주소를 멀티바이트 명령의 첫 번째 바이트로 인식합니다. 그런 다음 프로세서는 0x770000F4, 0x770000F5 및 나중에 몇 바이트를 단일 명령으로 결합하려고 시도합니다. 이 조합은 다양한 동작을 만들 수 있으며, 그 중 어느 것도 바람직하지 않습니다.
따라서 bp, bu 또는 ba 명령을 사용하여 중단점을 배치하는 경우 항상 적절한 주소에 중단점을 배치해야 합니다. WinDbg 그래픽 인터페이스를 사용하여 중단점을 추가하는 경우 올바른 주소가 자동으로 선택되므로 이 상황에 대해 걱정할 필요가 없습니다.
모호한 중단점 확인
이제 디버거 엔진 버전 10.0.25310.1001 이상에서 모호한 중단점 확인이 지원됩니다. 모호한 중단점을 사용하면 디버거가 중단점 식이 여러 위치로 확인되는 특정 시나리오에서 중단점을 설정할 수 있습니다. 자세한 내용은 모호한 중단점 확인을 참조하세요.