프로세서 중단점(ba 중단점)
디버거 요청 시 프로세서가 제어하는 중단점을 프로세서 중단점 또는 데이터 중단점이라고 합니다. 디버거에서 직접 제어하는 중단점을 소프트웨어 중단점이라고 합니다.
참고 데이터 중단점이라는 용어는 일반적으로 프로세서 중단점의 동의어로 사용되지만 이 용어는 오해의 소지가 있을 수 있습니다. 두 가지 기본 유형의 중단점은 프로세서에서 제어하는 프로세서 중단점과 디버거가 제어하는 소프트웨어 중단점입니다. 프로세서 중단점은 일반적으로 프로그램 데이터에 설정됩니다. 이것이 "데이터 중단점"이라고 하는 이유이지만 실행 코드에서도 설정할 수 있습니다. 소프트웨어 중단점은 일반적으로 실행 코드에 설정되지만 프로그램 데이터에서도 설정할 수 있습니다. 아쉽게도 디버깅 문헌에서는 실행 코드에 설정된 경우에도 프로세서 중단점을 "데이터 중단점"으로 참조하는 것이 일반적입니다.
프로세서 중단점
프로세서 중단점은 특정 메모리 위치에 액세스할 때 트리거됩니다. 이를 트리거하는 메모리 액세스의 종류에 해당하는 네 가지 유형의 프로세서 중단점이 있습니다.
중단점 유형 | 작업 |
---|---|
e(execute) | 프로세서가 지정된 주소에서 명령을 검색할 때 트리거됩니다. |
r(읽기/쓰기) | 프로세서가 지정된 주소에서 메모리를 읽거나 쓸 때 트리거됩니다. |
w(쓰기) | 프로세서가 지정된 주소에 메모리를 쓸 때 트리거됩니다. |
i(i/o) | 지정된 주소의 I/O 포트에 액세스할 때 트리거됩니다. |
각 프로세서 중단점에는 연결된 크기가 있습니다. 예를 들어 w(쓰기) 프로세서 중단점은 4바이트의 크기로 주소 0x70001008 설정할 수 있습니다. 이렇게 하면 0x70001008 0x7000100B 주소 블록을 모니터링합니다. 이 메모리 블록이 기록되면 중단점이 트리거됩니다.
프로세서가 지정된 영역과 겹치지만 동일하지 않은 메모리 영역에서 작업을 수행하는 경우 발생할 수 있습니다. 이전 단락에 제공된 예제에서 0x7000100F 0x70001000 범위를 포함하는 단일 쓰기 작업 또는 0x70001009 바이트만 포함하는 쓰기 작업은 겹치는 작업입니다. 이러한 상황에서 중단점이 트리거되는지 여부는 프로세서에 따라 달라집니다. 특정 프로세서에서 이 상황을 처리하는 방법에 대한 자세한 내용은 프로세서 아키텍처 설명서를 참조하고 "디버그 레지스터" 또는 "디버그 컨트롤 레지스터"를 찾습니다. 예를 들어 x86 프로세서에서 하나의 특정 프로세서 유형을 사용하려면 액세스된 범위가 중단점 범위와 겹칠 때마다 읽기 또는 쓰기 중단점이 트리거됩니다.
마찬가지로 주소 0x00401003 e (실행) 중단점이 설정된 다음 주소 0x00401002 0x00401003 걸쳐 있는 2 바이트 명령이 실행되면 결과는 프로세서에 따라 달라집니다. 다시 한 번 자세한 내용은 프로세서 아키텍처 설명서를 참조하세요.
프로세서는 사용자 모드 디버거에서 설정한 중단점과 커널 모드 디버거에서 설정한 중단점을 구분합니다. 사용자 모드 프로세서 중단점은 커널 모드 프로세스에 영향을 주지 않습니다. 커널 모드 프로세서 중단점은 사용자 모드 코드가 디버그 레지스터 상태를 사용하는지 여부와 연결된 사용자 모드 디버거가 있는지 여부에 따라 사용자 모드 프로세스에 영향을 줄 수도 있고 영향을 미치지 않을 수도 있습니다.
현재 프로세스의 기존 데이터 중단점을 다른 레지스터 컨텍스트에 적용하려면 .apply_dbp(컨텍스트에 데이터 중단점 적용) 명령을 사용합니다.
다중 프로세서 컴퓨터에서 각 프로세서 중단점은 모든 프로세서에 적용됩니다. 예를 들어 현재 프로세서가 3이고 명령을 ba e1 MyAddress
사용하여 MyAddress에 중단점을 배치하는 경우 해당 주소에서 실행되는 프로세서 3뿐만 아니라 모든 프로세서가 중단점을 트리거합니다. 소프트웨어 중단점도 마찬가지입니다.
소프트웨어 중단점
프로세서 중단점과 달리 소프트웨어 중단점은 디버거에 의해 제어됩니다. 디버거가 특정 위치에서 소프트웨어 중단점을 설정하는 경우 일시적으로 해당 메모리 위치의 내용을 중단 명령으로 바꿉니다. 디버거는 이 위치의 원래 내용을 기억하므로 이 메모리가 디버거에 표시되는 경우 디버거는 중단 명령이 아니라 해당 메모리 위치의 원래 콘텐츠를 표시합니다. 대상 프로세스가 이 위치에서 코드를 실행하면 중단 명령으로 인해 프로세스가 디버거에 침입합니다. 선택한 작업을 수행한 후에는 대상이 실행을 다시 시작하도록 할 수 있으며 원래 해당 위치에 있던 명령으로 실행이 다시 시작됩니다.
프로세서 중단점 유형의 가용성
i(i/o) 옵션은 커널 모드 디버깅 중에만 사용할 수 있습니다.
모든 데이터 크기를 모든 프로세서 중단점 유형과 함께 사용할 수 있는 것은 아닙니다. 허용되는 크기는 대상 컴퓨터의 프로세서에 따라 달라집니다. 자세한 내용은 ba(액세스 중단)를 참조하세요.
소프트웨어 중단점 및 프로세서 중단점의 제한 사항
bp 또는 bm /a 명령을 사용할 때 프로그램 주소가 아닌 데이터 주소를 지정할 수 있습니다. 그러나 데이터 위치를 지정하더라도 이러한 명령은 프로세서 중단점이 아닌 소프트웨어 중단점을 만듭니다. 디버거가 특정 위치에 소프트웨어 중단점을 배치하면 일시적으로 해당 메모리 위치의 내용을 중단 명령으로 바꿉니다. 디버거가 이 위치의 원래 내용을 기억하고 대상 프로세스가 이 코드를 실행하려고 하면 디버거가 적절하게 응답할 수 있으므로 실행 파일이 손상되지 않습니다. 그러나 소프트웨어 중단점이 데이터 위치에 설정되면 결과 덮어쓰기가 데이터 손상으로 이어질 수 있습니다. 따라서 이 위치가 실행 코드로만 사용된다는 확신이 있는 경우에만 데이터 위치에 소프트웨어 중단점을 설정하는 것이 안전합니다.
bp, bu 및 bm 명령은 프로세서 명령을 중단 명령으로 바꿔 소프트웨어 중단점을 설정합니다. 따라서 이러한 코드는 읽기 전용 코드 또는 덮어쓸 수 없는 다른 코드에서 사용할 수 없습니다. 이러한 코드에서 중단점을 설정하려면 e(실행) 옵션과 함께 ba(Access에서 중단)를 사용해야 합니다.
중단점이 트리거될 때 자동으로 실행되는 명령에서만 다른 동일한 주소에 여러 프로세서 중단점을 만들 수 없습니다. 그러나 다른 제한 사항이 다른 동일한 주소에 여러 중단점을 만들 수 있습니다(예: /p, /t, /c 및 /C 옵션의 값이 다른 ba 명령을 사용하여 동일한 주소에 여러 중단점을 만들 수 있습니다).
사용자 모드 프로세스의 초기 중단점(일반적으로 기본 함수 또는 해당 함수에 대해 설정됨)은 프로세서 중단점이 될 수 없습니다.
지원되는 프로세서 중단점 수는 대상 프로세서 아키텍처에 따라 달라집니다.
소프트웨어 중단점 및 프로세서 중단점 제어
bp(중단점 설정), bm(기호 중단점 설정) 및 bu(해결되지 않은 중단점 설정) 명령을 사용하여 소프트웨어 중단점을 만들 수 있습니다. ba(Access에서 중단) 명령을 사용하여 프로세서 중단점을 만들 수 있습니다. 중단점을 사용하지 않도록 설정, 사용 및 수정하는 명령은 모든 종류의 중단점에 적용됩니다. 중단점 목록을 표시하는 명령에는 모든 중단점이 포함되며 각 중단점의 유형을 나타냅니다. 이러한 명령 목록은 중단점 제어 메서드를 참조 하세요.
WinDbg 중단점 대화 상자에는 "e", "r", "w" 또는 "i' 뒤에 블록 크기가 표시된 프로세서 중단점을 나타내는 모든 중단점이 표시됩니다. 이 대화 상자를 사용하여 중단점을 수정할 수 있습니다. 이 대화 상자의 명령 텍스트 상자를 사용하여 모든 유형의 중단점을 만들 수 있습니다. 프로세서 중단점이 필요한 경우 "ba"로 입력을 시작합니다. WinDbg 디스어셈블리 창 또는 원본 창에서 마우스를 사용하여 중단점을 설정하는 경우 디버거는 해결되지 않은 소프트웨어 중단점을 만듭니다.
프로세서 중단점은 프로세서의 디버그 레지스터에 저장됩니다. 디버그 레지스터 값을 수동으로 편집하여 중단점을 설정할 수 있지만 이는 권장되지 않습니다.