C语言 ' gdb '如何附加到正在运行的进程?



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

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

dup2(开放("/tmp/my_stdout" 1089, 0777), 1)

GDB可以毫无问题地做到这一点,但它有一个庞大的源代码。

我想要的是某种指导的起点。

谷歌上有大量的信息,但它们都是10多年前的了,我需要在当时还不存在的aarch64 arch上完成这项工作。

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

当gdb连接到一个进程时,我试图stracegdb,但是我的终端崩溃了。

我寻找的是某种起点的指引。

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

注意:您可以忽略所有unw_*调用。附加于;部分相当琐碎:

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

像这样注入指令:dup2(open("/tmp/my_stdout", 1089, 0777), 1)

搜索"Linux注入代码到运行过程中"。下面是一个例子。

更新:

我想那不行。我不想破坏追踪器的输出。我要把tracee的stout弄掉!

是的,你知道,是的,它会。

嗯,也许不完全是这样(你可以用代码注入来做,但是你不这样做)。

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

最新更新