Linux에서 디버거는 어떻게 작동합니까?

Linux에서 디버거는 어떻게 작동합니까?

Linux에서 디버거는 어떻게 작동합니까? 이미 실행 중인 실행 파일이나 프로세스에 어떻게 "연결"합니까? 컴파일러가 코드를 기계어로 변환한다는 것은 알고 있지만 디버거는 코드가 연결된 내용을 어떻게 "알 수" 있습니까?

답변1

라는 시스템 호출이 있습니다.. 여기에는 작업, 대상 프로세스의 PID, 대상 프로세스 메모리의 주소, 데이터 포인터 등 4개의 매개변수가 필요합니다. 마지막 2개의 매개변수가 사용되는 방식은 작업에 따라 다릅니다.

예를 들어 디버거를 프로세스에 연결/분리할 수 있습니다.

ptrace(PTRACE_ATTACH, pid, 0, 0);
...
ptrace(PTRACE_DETACH, pid, 0, 0);

단일 단계 실행:

ptrace(PTRACE_ATTACH, pid, 0, 0);
int status;
waitpid(pid, &status, WSTOPPED);
while (...) {
    ptrace(PTRACE_SINGLESTEP, pid, 0, 0);
    // give the user a chance to do something
}
ptrace(PTRACE_DETACH, pid, 0, 0);

PTRACE_PEEKDATA 및 PTRACE_POKEDATA를 사용하여 대상 프로세스의 메모리를 읽고 쓸 수도 있습니다. 실제 사례를 보고 싶다면 확인해 보세요데이터 베이스.

답변2

하지만 디버거는 연결된 내용을 어떻게 "알"까요?

~에서사람 추적

ptrace() 시스템 호출은 하나의 프로세스("추적자")가 다른 프로세스("추적자")의 실행을 관찰 및 제어하고 피추적자의 메모리와 레지스터를 검사하고 변경할 수 있는 방법을 제공합니다. 주로 중단점 디버깅 및 시스템 호출 추적을 구현하는 데 사용됩니다.

디버거 작동 방식(1/3부)참고하시면 좋을 것 같습니다,이것시스템 호출 디버깅.

매우 간단합니다. gdb는 복잡한 짐승이기 때문입니다. 오늘의 gdb 소스코드에는 gdb 사용법에 대한 흥미로운 정보가 있습니다.다음에서 발견됨타겟.h그리고inf-ptrace.c그리고 야심찬 사람들에게 쫓기기도 쉽습니다. gdb가 사용 중임을 알 수 있습니다., 일반적으로 전혀 모호하지 않습니다. target_ops 구조의 구성요소를 확인하고 다음에서 찾으세요.inf-ptrace.c.

사람 추적에서

>PTRACE_ATTACH
>       Attach to the process specified in pid, making it a tracee of the calling process.  The
>       tracee is sent a SIGSTOP, but will not necessarily have stopped by  the  completion  of
>       this  call;  use  waitpid(2)  to  wait  for the tracee to stop.  See the "Attaching and
>       detaching" subsection for additional information.  (addr and data are ignored.)

그래서 ptrace가 사용되는데, 뭔가가 어디에 있는지 어떻게 알 수 있을까요? GDB는 중단점을 설정하고 데이터를 읽는 데 필요한 정보를 어떻게 얻나요? DWARF나 더 작은 디버깅 형식이 없으면 gdb는 실제로 무엇을 하고 있는지, 어디서 무엇을 찾을 수 있는지 알 수 없습니다. 정보는 여전히 프로그램 이미지에 존재하지만 gdb에는 단서가 없기 때문에 수동으로 검색하여 gdb를 사용하여 해당 정보를 찾을 수 있습니다.

다음은GDB 사용자 매뉴얼 - Stallman. 모든 디버거와 마찬가지로 GDB는 디버깅 형식(일반적으로 합리적인 운영 체제에서는 DWARF)을 사용하여 프로그램의 기능과 변수에 대한 기호 정보를 얻습니다.

프로그램을 효과적으로 디버깅하려면 컴파일 타임에 디버깅 정보가 생성되어야 합니다. 이 디버깅 정보는 개체 파일에 저장됩니다. 각 변수나 함수의 데이터 유형과 실행 코드의 소스 코드 줄 번호와 주소 간의 대응을 설명합니다. .... 컴파일러에서 지원하는 최신 버전의 DWARF 디버깅 형식을 사용하면 최상의 디버깅 환경을 얻을 수 있습니다.

GDB, DWARF 및 PTRACE에 대한 정보는 모두 쉽게 찾을 수 있습니다. 표기법을 좋아한다면 ELF 파일에 대한 정보도 쉽게 찾을 수 있습니다.

관련 정보