`gdb` 如何附加到 运行 进程?

How is `gdb` attaching to running processes?

我想创建一个简单的工具(使用 C),它可以执行 gdb 功能的这一小子集:

  1. 附加到已经 运行 的程序(带 PID)
  2. 像这样向其中注入指令:

dup2(open("/tmp/my_stdout", 1089, 0777), 1)

GDB 可以毫无问题地做到这一点,但它有大量的资源。

我正在寻找的是某种指导的起点。

关于 Google 的信息很多,但它们都已有 10 年历史,我需要在当时还不存在的 aarch64 架构上完成这项工作。

真的,非常感谢任何帮助。

我试图 strace gdb 附加到进程时,但我的终端确实炸毁了。

Im looking for is some kind of starting point of guidance.

看看 unwind-pid 示例 here。它使用 ptrace 展开由 PID 标识的外来进程的堆栈。

注意:您可以忽略所有 unw_* 调用。 “附加到 pid”部分相当简单:

    pid_t pid = atoi(argv[1]);
    if (ptrace(PTRACE_ATTACH, pid, 0, 0) != 0)
        die("ERROR: cannot attach to %d\n", pid);
...
    (void) ptrace(PTRACE_DETACH, pid, 0, 0);

Inject instructions into it like this: dup2(open("/tmp/my_stdout", 1089, 0777), 1)

搜索“Linux 将代码注入 运行ning 进程”。这是一个 example.

更新:

That will not work, I think. I don't want to dup2 the tracer's stdout. I want to dup2 the tracee's stdout!

是的,你会的,是的。

好吧,也许不完全是(你可以通过代码注入来做到这一点,但你没有这样做)。

您要做的是构造(在堆栈和寄存器中)被跟踪者的状态 ,就好像 它只是调用了 open("/tmp/my_stdout", ...) 本身一样。然后在openreturns后设置断点,将IP设置为open,恢复tracee。 tracee 将 运行 直到断点,此时您将在结果寄存器中打开 fd。现在对 dup2 重复相同的过程,您就完成了。