GDB를 사용하여 실행중인 프로세스를 디버깅 할 수 있습니까?


답변:


88

예. attach명령을 사용하십시오 . 체크 아웃 이 링크를 자세한 내용은. help attachGDB 콘솔에 입력 하면 다음이 제공됩니다.

(gdb) help attach

GDB 외부의 프로세스 또는 파일에 첨부합니다. 이 명령은 마지막 " target"명령 ( " info files"이 대상 스택을 표시 함) 과 동일한 유형의 다른 대상에 연결됩니다 . 명령은 프로세스 ID, 프로세스 이름 (접미사로 선택적 프로세스 ID 포함) 또는 장치 파일을 인수로 사용할 수 있습니다. 프로세스 ID의 경우 프로세스에 신호를 보낼 수있는 권한이 있어야하며 디버거와 동일한 유효 uid가 있어야합니다. attach기존 프로세스에 " "을 사용할 때 디버거는 프로세스에서 실행중인 프로그램을 찾고 현재 작업 디렉토리에서 먼저 검색하거나 (찾지 못한 경우) 소스 파일 검색 경로를 사용합니다 ( " directory"명령 참조 ). " file"명령을 사용하여 프로그램을 지정하고 해당 기호 테이블을로드 할 수도 있습니다 .


참고 : Linux 커널의 향상된 보안 으로 인해 프로세스에 연결하는 데 어려움이있을 수 있습니다 ( 예 : 다른 셸의 자식에 연결).

/proc/sys/kernel/yama/ptrace_scope요구 사항에 따라 설정해야 할 수 있습니다. 이제 많은 시스템이 1이상 으로 기본 설정됩니다 .

The sysctl settings (writable only with CAP_SYS_PTRACE) are:

0 - classic ptrace permissions: a process can PTRACE_ATTACH to any other
    process running under the same uid, as long as it is dumpable (i.e.
    did not transition uids, start privileged, or have called
    prctl(PR_SET_DUMPABLE...) already). Similarly, PTRACE_TRACEME is
    unchanged.

1 - restricted ptrace: a process must have a predefined relationship
    with the inferior it wants to call PTRACE_ATTACH on. By default,
    this relationship is that of only its descendants when the above
    classic criteria is also met. To change the relationship, an
    inferior can call prctl(PR_SET_PTRACER, debugger, ...) to declare
    an allowed debugger PID to call PTRACE_ATTACH on the inferior.
    Using PTRACE_TRACEME is unchanged.

2 - admin-only attach: only processes with CAP_SYS_PTRACE may use ptrace
    with PTRACE_ATTACH, or through children calling PTRACE_TRACEME.

3 - no attach: no processes may use ptrace with PTRACE_ATTACH nor via
    PTRACE_TRACEME. Once set, this sysctl value cannot be changed.

8
링크가 깨진 :( 내 관점에서, 같은 대답처럼 내가 이 일 에서 J. Polfer 건배).
olibre

링크를 수정했습니다.
Attie 2017-10-13

이것은 원격 대상에서 프로세스의 PID에서도 작동합니까?
Bionix1441

그런 다음 원격 대상에서 디버그 서버를 실행해야합니다. 그 후에는 동일해야합니다.
Carl Norum

플래그는를 사용하여 변경할 수 있습니다 echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope.
Daisuke Aramaki


24

예. 넌 할 수있어:

gdb program_name program_pid

단축키는 다음과 같습니다 (하나의 인스턴스 만 실행 중이라고 가정).

gdb program_name `pidof program_name`

나는 그것이 무엇을하는지 모르지만 지옥이 나를 위해 작동하지 않는 것이 확실합니다. <program_pid>가 존재하지 않는다고합니다.
Owl

2
프로세스에 첨부하는 것 외에도 기호 테이블을로드 할 때 이것이 가장 잘 작동한다는 것을 알았습니다. program_name바이너리와 동일한 디렉토리에있는 경우 작동 한다는 점에 유의해야합니다 . 다른 디렉토리에 있으면 바이너리 경로가 작동한다고 생각합니다.
KarateSnowMachine

-p앞 을 잊으 셨나요 program_id? 또한 실행중인 프로세스에 연결하려면 sudo로 gdb를 실행해야 할 수도 있습니다.
mxmlnkn


3

그래 넌 할수있어. 프로세스 foo가 실행 중이라고 가정합니다 ...

ps -elf | grep foo

PID 번호를 찾으십시오

gdb -a {PID 번호}

5
어떤 배포판에서 실행 중입니까? 최신 버전의 Fedora를 사용하면 'gdb -a'가 "option -a is ambiguous"오류를 출력합니다.
Justin Ethier

1
PID - 공식 인수는 -p / 인
마흐무드 알 - Qudsi

3

프로세스를 첨부하려면이 프로세스의 소유자가 동일해야합니다. 루트는 모든 프로세스에 연결할 수 있습니다.


2

ps -elf가 PID를 표시하지 않는 것 같습니다. 대신 사용하는 것이 좋습니다.

ps -ld | grep foo
gdb -p PID

2

가장 쉬운 방법은 프로세스 ID 를 제공하는 입니다.

gdb -p `pidof your_running_program_name`

man gdb명령 에서 전체 옵션 목록을 얻으십시오 .

동일한 프로그램에 대해 여러 프로세스가 실행중인 경우 다음 명령이 프로세스를 나열합니다.

ps -C program -o pid h
<number>

그런 다음 출력 프로세스 ID (숫자)를 gdb에 대한 인수로 사용할 수 있습니다.

gdb -p <process id>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.