2017-02-03 3 views
0

내가 뭘 하려는지, 프로세스를 포크, 자식 프로세스에서 새 실행 파일을 exec, 자식 프로세스를 디버그하기 위해 부모 프로세스를 GDB로 종료하고 자식 프로세스에 연결하도록한다. 하위 프로세스 (forkable)를 포크하기 위해 초기 부모 프로세스를 사용하는 이유는이 자식 프로세스에 대한 일부 환경 속성을 설정하고자하는데, 이는 리눅스 커널에 대한 시스템 호출을 필요로하고 GDB를 수정하지 않기를 원합니다 . 나는 부모 프로세스가 종료 된 후에 GDB를 통해 자식 프로세스에 연결할 수 있다고했지만,이 경우 자식은 exec() 시스템 호출 후에 이미 실행 중이다. 문제는 자식에 대해 ptrace (PTRACE_TRACEME)를 사용할 수 없다는 것입니다.이 경우 처음 명령에서 중지하게됩니다.이 경우 GDB는 부모에 의해 이미 추적되어 있으므로 연결할 수 없습니다. exec() 할 때 첫 번째 명령에서 중지되도록 환경을 설정 한 후 하위 프로세스를 중지하려면 어떻게해야합니까?exec() 후에 새로 실행 된 프로그램의 첫 번째 명령에서 하위 프로세스를 중지하려면 어떻게해야합니까?

답변

0

나는 다른 사람에게 도움이 될 수 있으므로 내 필요를 충족시키는 방법을 찾아 냈습니다. 포크 후, 필요한 환경을 설정하고, 디버깅 할 프로그램을 실행하기 직전에 {kill (getpid(), SIGSTOP)}에 정지 신호를 보냅니다. 부모가 자식 프로세스를 기다리지 않고 종료합니다. 그래서 오직 하나의 PID가 있습니다. Open GDB는 "gdb -p pid"를 사용하여 연결합니다. 정지 신호는 GDB에 전달됩니다. GDB 프롬프트에서 명령 sig 0을 주어 프로세스를 계속 진행하십시오. 하위 프로세스가 계속 진행되고 다음에 디버그 가능한 프로그램을 실행하면 이제 정상적으로 디버깅 할 수 있습니다.

관련 문제