如何在exec()之后的新执行程序的第一条指令处停止子进程?

时间:2017-02-03 03:27:30

标签: fork exec ptrace

我要做的是分叉一个进程,在子进程中执行一个新的可执行文件,让父进程终止并通过GDB附加到子进程来调试这个子进程。我使用初始父进程来分叉子(可调试)进程的原因是我想为这个子进程设置一些环境属性,这需要对linux内核进行一些系统调用,并且不想修改GDB这样做。我尝试并发现在父进程终止后我可以通过GDB附加到子进程,但在这种情况下,子进程在exec()系统调用之后已经运行。 问题是我不能对子进程使用ptrace(PTRACE_TRACEME),导致它在第一条指令处停止,因为在这种情况下GDB无法附加到它,因为它已经被父进程跟踪。 如何在设置环境后停止子进程,以便在我执行exec()时在第一条指令处停止它?

1 个答案:

答案 0 :(得分:0)

我想出了一种满足我需求的方式,我发布它可能对其他人有帮助。在分配,设置必要的环境之后,在执行要调试的程序之前,向自己发送停止信号{kill(getpid(),SIGSTOP)}。让父母不要等待子进程并终止。所以只有一个pid。使用" gdb -p pid"打开GDB连接到它。停止信号将传送到GDB。通过在GDB提示符处输入命令sig 0来继续该过程。子进程将继续并执行下一个可调试程序,您现在可以正常调试它。