OS X 中子进程设置的 GDB 和 LLDB "swallow" 状态

GDB and LLDB "swallow" status set by child process in OS X

给定以下代码:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>

int main(int ac, char** av) {
    int status;
    pid_t cpid = fork();
    if(0 == cpid) { /* Child */
        return *(volatile int*) 0; /* exits with signal 11 */
    } else { /* Parent */
        do {
            waitpid(cpid, &status, WUNTRACED);
            if(WIFSIGNALED(status)) {
                printf("\nChild exited with signal %d\n\n", WTERMSIG(status));
                return 0;
            }
        } while (!WIFEXITED(status) && !WIFSIGNALED(status));
        printf("\nChild exited normally\n\n");
    }
    return 0;
}

我得到了预期的结果 运行 来自终端的应用程序:

$ ./Fork4GdbTests.exe

Child exited with signal 11

运行 LLDB(或 GDB)中的应用程序,奇怪的是,我得到:

$ lldb ./Fork4GdbTests.exe
(lldb) target create "./Fork4GdbTests.exe"
Current executable set to './Fork4GdbTests.exe' (x86_64).
(lldb) r
Process 46815 launched: './Fork4GdbTests.exe' (x86_64)

Child exited normally

Process 46815 exited with status = 0 (0x00000000) 

我的 Makefile 看起来像这样(也用于 Cygwin):

CC = gcc
CFLAGS = -Wextra -Wall -Werror -Wno-unused-parameter -g
.PHONY: all clean
all: Fork4GdbTests.exe
%.exe: %.o
    $(CC) $(CFLAGS) $? $(LIBS) -o $@
clean:
    rm -f *.o *.exe *.stackdump;

在 Cygwin 中,我从命令提示符和调试器中都得到了预期的结果 运行。类似的行为会发生在所有类型的其他信号上,例如 SIGFPE 或通过 kill() 发送给子进程的任何信号。

这是怎么回事?

这只是一个错误。鉴于它同时影响 gdb 和 lldb,它可能在 CoreOS 中而不是调试器中(尽管同样的人做了两个调试器的 Mach 特定层,所以这不能保证......)

无论如何,请使用 http://bugreporter.apple.com 提交错误报告。