디버거는 해석 된 프로그램에 대해 이야기 할 때 완벽합니다. 왜냐하면 명령은 항상 실행 전에 확인을 위해 인터프리터를 통과하기 때문입니다. 그러나 컴파일 된 응용 프로그램의 디버거는 어떻게 작동합니까? 지침이 이미 메모리에 레이아웃되어 실행중인 경우 '중단 점'에 도달했거나 '예외'가 발생했다는 알림을받을 수 있습니까?컴파일 된 프로그램에서 어떻게 디버거/예외가 작동합니까?
답변
하드웨어 및/또는 운영 체제의 도움으로.
대부분의 최신 CPU에는 특정 주소에 도달 할 때 CPU 예외를 트리거하도록 설정할 수있는 여러 디버그 레지스터가 있습니다. 또한 응용 프로그램이 지정된 주소 또는 주소 범위에서 읽거나 쓸 때 예외를 트리거하는 주소 감시 점 (address watchpoint)과 프로세스가 단일 명령을 실행하고 예외를 throw하는 단일 단계 실행을 지원하기도합니다. 이러한 예외는 프로그램에 첨부 된 디버거에서 발견 할 수 있습니다 (아래 참조).
또는 일부 디버거는 중단 점의 명령어를 인터럽트 또는 트랩 명령어로 일시적으로 대체하여 중단 점을 생성하므로 프로그램이 CPU 예외를 발생시킵니다. 중단 점에 도달하면 디버거는 원래의 명령으로 바꾸고 프로그램이 정상적으로 작동하도록 CPU가 해당 명령을 한 단계 수행합니다.
예외 사항은 현재 작업중인 시스템에 따라 다릅니다. UNIX 시스템에서 디버거는 일반적으로 ptrace()
시스템 호출을 사용하여 프로세스에 연결하고 신호를 처리하는 첫 번째 샷을 얻습니다.
TL : DR - 저급 마술.
정말 대단합니다. 그것이 프로세서 기능인지 몰랐습니다. – sircodesalot
브레이크 포인트를 설정할 때 실제로 코드의 주어진 위치에 특수 연산 코드 'int3'을 쓰면 실행이 중단됩니다. – Cyclonecode