2012-07-22 2 views
0

나는 실행하는 동안 자체 코드를 수정하는 프로그램이 있습니다. 코드를 수정하면 어떻게 든 중단 점이 삭제되므로 코드에 중단 점을 설정하려고하면 중단되지 않습니다.자체 수정 코드에서 Gdb 토글 링 중단 점

하드웨어 중단 점에 대해 들어 봤지만 하드웨어에서 지원하지 않는 gdb로 작성되었습니다. 자체 수정 코드에서 깨는 다른 방법이 있습니까?

+0

코드 생성기를 변경하여 깨는 방법을 생성 할 수 있습니다. –

답변

1

GDB가 중단 점을 두 가지 방법으로 배치합니다. 하나는 특정 특수 레지스터를 설정하여 CPU가 중단 (커널이 디버거에 신호로 변환하는 인터럽트 발생)하도록 지시하는 것입니다.이 인터럽트는 해당 라인이 실행될 때 발생합니다. 이것들은 GDB가 "하드웨어 브레이크 포인트"라고 부르는 것입니다. 하드웨어에서 지원되지 않는 경우에는 지원되지 않습니다.

다른 방법은 실제로 코드를 수정하고 중단 할 줄의 첫 번째 명령을 해당 인터럽트를 발생시키는 명령으로 바꾸는 것입니다. 예를 들어 Intel X86에서는 인터럽트를 발생시키는 명령 인 "int 5"가 2 바이트 길이이지만 인터럽트 3을 발생시키는 명령은 1 바이트 길이입니다. 이것은 정확하게이 용도로 사용될 수 있습니다.

디버거가 명령어를 깨기 코드로 대체하고 브레이크 포인트에 도달하면 해당 코드를 디버거가 간섭하기 전의 코드로 바꿉니다. 예,이 기법은 자체 수정 코드에서 작동하지 않습니다 (플래시에 쓰는 것과 같은 읽기 전용 메모리의 코드로도 언급하지 않아야합니다).

코드가 규칙적으로 충분하고 분명히 규칙적이지 않은 경우 코드를 메모리에 쓴 직후 한 번 중단 한 다음 올바른 위치에 두 번째 중단 점을 배치 할 수 있습니다. GDB의 스크립팅 기능을 충분히 연구한다면, 심지어 자동으로 만들어서 첫 번째 중단 점에 신경 쓰지 않아도됩니다.

모두 자체 수정 코드를 작성하는 경우 사용자는 길을 벗어났습니다. 행운을 빕니다. 너는 그것을 필요로 할 것이다.

Shachar