문제

나는지 궁금 어떻게 디버거로 작동하는가?특히 사용할 수 있는'연결된'을 이미 실행하는 실행 파일을 실행합니다.나는 컴파일러 변환 코드를 컴퓨터 언어,하지만 그때는 어떻게 디버거'알고'그것이 무엇인지 연결되는?

도움이 되었습니까?

해결책

디버거 작동 방식에 대한 세부 사항은 디버깅중인 내용 및 OS의 내용에 달려 있습니다. Windows에서 기본 디버깅의 경우 MSDN에 대한 몇 가지 세부 정보를 찾을 수 있습니다. Win32 디버깅 API.

사용자는 이름 또는 프로세스 ID에 따라 어떤 프로세스에 부착 해야하는지 디버거를 지시합니다. 이름 인 경우 디버거는 프로세스 ID를 찾아 시스템 호출을 통해 디버그 세션을 시작합니다. 창문 아래에서 이것은 될 것입니다 디버시티브 프로세스.

첨부되면 디버거는 모든 UI와 비슷한 이벤트 루프에 들어가지 만 Windowing 시스템에서 나오는 이벤트 대신 OS는 디버깅되는 프로세스에서 발생하는 일에 따라 이벤트를 생성합니다 (예 : 예외 발생). 보다 Waitfordebugevent.

디버거는 대상 프로세스의 가상 메모리를 읽고 쓸 수 있으며 OS가 제공 한 API를 통해 레지스터 값을 조정할 수 있습니다. 목록을 참조하십시오 디버깅 기능 Windows 용.

디버거는 기호 파일의 정보를 사용하여 주소에서 소스 코드의 변수 이름 및 위치로 변환 할 수 있습니다. 기호 파일 정보는 별도의 API 세트이며 OS의 핵심 부분이 아닙니다. 창에서 이것은 디버그 인터페이스 액세스 SDK.

관리 환경 (.NET, Java 등)을 디버깅하는 경우 프로세스는 일반적으로 비슷해 보이지만 가상 머신 환경이 기본 OS가 아닌 디버그 API를 제공하기 때문에 세부 사항은 다릅니다.

다른 팁

로 내가 이해하기:

소프트웨어에는 중단 86,디버거 대체는 첫 번째 바이트의 명령으로 CC (int3).이렇 WriteProcessMemory 응용 프로그램을 시작합니다.면 CPU 가져오는 명령어,실행 int3, 이 원인을 CPU 를 생성하는 디버그는 예외입니다.OS 가 이 인터럽트를 실현하는 과정을 디버깅,그리고 알리는 디버거하는 프로세스의 중단되었습니다.

후 중단점과 프로세스가 중지된 디버거 목록에서의 중단점,그리고 대체 CC 을 가진 바이트는 원래 거기.디버거 세트 TF, 시,플래그EFLAGS (으로 수정 CONTEXT),과 과정을 계속한다.트랩 깃발의 원인 CPU 가 자동으로 생성하는 단일 제외(INT 1)에서 다음 명령입니다.

면 프로세스를 디버깅 정지 다음 시간,디버거가 다시 대체는 첫 번째 바이트의 중단으로 교육 CC, 고,프로세스는 계속 진행됩니다.

나는 확실하지 않는 경우는 이 방법을 정확하게 구현되는 모든 디버거,하지만 내가 쓴 Win32 프로그램을 관리하는 디버그 자체를 사용하여 이 메커니즘이 있습니다.완전 쓸모없는,하지만,교육입니다.

Linux에서는 프로세스를 디버깅하여 시작합니다 ptrace (2) 시스템 호출. 이 기사 사용 방법에 대한 훌륭한 자습서가 있습니다 ptrace 간단한 디버깅 구성을 구현합니다.

Windows OS에있는 경우 John Robbins의 "Microsoft .NET 및 Microsoft Windows를위한 디버깅 애플리케이션"입니다.

(또는 이전 판도 : "디버깅 응용 프로그램")

이 책에는 단순한 (그러나 작동하는) 디버거를위한 코드가 포함 된 디버거가 어떻게 작동하는지에 대한 장이 있습니다.

UNIX/Linux 디버깅의 세부 사항에 익숙하지 않기 때문에이 내용은 다른 OS에 전혀 적용되지 않을 수 있습니다. 그러나 매우 복잡한 주제에 대한 소개로서 세부 사항과 API가 아니라면 대부분의 OS에 '포트'해야한다고 생각합니다.

디버깅을 이해하는 또 다른 귀중한 소스는 Intel CPU Manual (Intel® 64 및 IA-32 Architectures Software Developer 's Manual)입니다. 16 장, 16 장에서는 특별한 예외 및 하드웨어 디버깅 레지스터와 같은 디버깅의 하드웨어 지원을 도입했습니다. 다음 장에서 다음과 같습니다.

T (Trap) Flag, TSS - TSS에 T 플래그를 설정 한 상태에서 작업으로 전환하려고 시도하면 디버그 예외 (#DB)를 생성합니다.

Window 또는 Linux 가이 플래그를 사용하는지 여부는 확실하지 않지만 해당 장을 읽는 것은 매우 흥미 롭습니다.

이것이 누군가를 돕기를 바랍니다.

내 이해는 응용 프로그램 또는 DLL 파일을 컴파일 할 때 함수와 변수를 나타내는 기호를 포함하도록 컴파일하는 것이 무엇이든 간다는 것입니다.

디버그 빌드가 있으면이 기호는 릴리스 빌드 일 때보 다 훨씬 상세하므로 디버거가 더 많은 정보를 제공 할 수 있습니다. 디버거를 프로세스에 첨부하면 현재 기능이 액세스중인 기능을보고 여기에서 사용 가능한 모든 디버깅 기호를 해결합니다 (컴파일 된 파일의 내부가 어떻게 보이는지 알고 있으므로 메모리에 무엇이 있는지 확인할 수 있습니다. , ints, floats, strings 등의 내용과 함께). 첫 번째 포스터와 마찬가지로이 정보와 이러한 기호가 어떻게 작동하는지는 환경과 언어에 크게 의존합니다.

내가 생각하는 두 가지 주요 질문에 대답하기:

1.어떻게 디버거 알고 있는 예외가 발생했?

예외가 발생하면 프로세스에서는 디버깅,디버거로 통지받 OS 기 전에는 모든 예외 처리기 사용자 정의된 대상 프로세스에서는 주어진 기회에 대응하는 예외는 아니다.면 디버거를 선택하지 않는 손잡이(첫 번째)예외를 발생시 알림을 제외 파견하는 순서로 진행이 더 대상 스레드에 다음 주 예외를 처리할 기회를 원하는 경우다.는 경우 SEH 예외로 처리하지 않으로 대상 프로세스,디버거를 그 전송 또 다른 디버그 이벤트라고 하는 두 번째 기회에 통지를 알려주는 처리 되지 않은 제외에서 발생한 대상 프로세스.

enter image description here


2.어떻게 디버거하는 방법을 알고 있 중지에서점?

간이 응답 입니다:을 때 당신은 휴식을 넣어점으로 프로그램,디버거 대체 코드에서는 점 int3 교육는 소프트웨어 인터럽트.영향으로 프로그램을 중단하고 디버거가 호출됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top