【问题标题】:How can I stop a child process at the first instruction of newly executed program after exec()?如何在 exec() 之后新执行程序的第一条指令处停止子进程?
【发布时间】:2017-02-03 03:27:30
【问题描述】:

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

【问题讨论】:

    标签: fork exec ptrace


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-20
      • 2016-05-31
      • 1970-01-01
      • 2015-01-18
      • 2019-08-15
      相关资源
      最近更新 更多