그런 종류의 것들에 대해 깊이 파고 들었으니 꽤 오랜 시간이 걸렸지 만, 다음 주소가 스택에 푸시되었다고 가정하면 디버거는 리턴 주소를 팝업하여 중단 점의 위치를 파악할 수 있습니다 (INT 3 명령이 1 바이트 길이이기 때문에 반환 주소에서 1을 뺀) [편집 됨].
즉, 디버거가 반드시 스택의 주소로 돌아갈 필요는 없습니다. 원본 명령을 복원 한 다음 원래 위치에서 실행할 수 있습니다. 중단 점을 설정하려면 플래그에서 "트랩 비트"를 사용하여 다른 트랩이 생성되기 전에 하나의 명령 (원래의 덮어 쓰기 된 명령) 만 실행하면됩니다 (INT 3 다시 생각합니다). INT 3 명령은 실행을 올바르게 계속하기 전에 재설정 될 수 있습니다.
그러나 대부분의 경우 디버거는 어쨌든 트랩을 직접 처리하지 않는 시스템에서 작동합니다. 예를 들어 트랩이 발생한 위치를 알려주는 신호가 전달 될 수 있습니다. 대부분의 경우 OS가이 작업을 수행 할 방법이 없으므로 트랩 주소에서 "실제"주소 (즉 INT 3 명령어의 주소)를 파악해야 할 가능성이 큽니다.
여러 스레드가 관련된 경우 상황이 복잡해집니다. 이 경우 원래의 명령을 "제자리"로 복원하면 다른 스레드가 충돌 한 경우 중단 점이 누락 될 수 있습니다. 한 가지 해결책은 명령을 복원하기 전에 다른 모든 스레드를 중지하는 것입니다 (나중에 다시 시작하는 것).
누군가 GDB 소스 코드를 인용 해 주시겠습니까? :-) –