命令行应用程序:如何将子进程附加到 xcode 调试器?

inh*_*dle 5 c debugging xcode child-process

我目前正在用 C 语言制作一个命令行应用程序,其中创建了许多子进程。所以我需要调试这个子代码。我在 Xcode 上创建了一个子进程,如下所示。(参见断点和运行光标。)

在此输入图像描述

执行一些语句后,我让 xcode 将 GBN(885) 连接到 xcode 调试器,如下图所示。

在此输入图像描述 在此输入图像描述

这不起作用。如何将子进程附加到 xcode 调试器?先感谢您。

inh*_*dle 5

谷歌和苹果开发者页面在这个问题上真的保持沉默,最后我找到了一个很好的解决方法。当我们将 Xcode 调试器附加到正在调试的进程的子进程或已由 Xcode 调试器、gdb 或 lldb 调试的进程时,会出现此错误消息。

错误信息

为了避免出现此恼人的消息,首先将kill(0, SIGSTOP)语句放在要停止子进程的位置。在下图中,我kill在创建子项之后立即放置了该语句。

在此输入图像描述

其次,使用gcc-g 选项编译源代码。

$ ls
GBN.1  gbn.c  gbn.h  type.h util.c util.h
$ gcc *.c -g
$ ./a.out

[1]+  Stopped                 ./a.out
$ ps -ef | grep a.out
  501   628   600   0  9:33AM ttys000    0:00.00 ./a.out
  501   629   628   0  9:33AM ttys000    0:00.00 ./a.out
Run Code Online (Sandbox Code Playgroud)

现在,我们所要做的就是告诉 Xcode 调试器通过 pid 附加到进程。点击Debug菜单然后找到Attach to process选项点击By Process Identifier (PID) or name选项。然后输入子进程(或父进程)的 pid,然后单击附加按钮。

在此输入图像描述

享受调试的乐趣!

在此输入图像描述

  • 称这是一个“好的”解决方法确实扩展了“好”的定义。我们有一个用 Swift 编写的相当大的服务,具有外部依赖项,而不是一些只有 `fork()` 的两个 C 文件演示程序。将 SIGSTOP 放入调试对象并不是完全不可能的,但当我们尝试调试传送代码时确实很痛苦。此外,这无助于调试由于竞争条件而导致的崩溃,即子级在父级准备好之前执行某些操作;当孩子继续比赛时,比赛早已结束了。 (4认同)