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 提交错误报告。
给定以下代码:
#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 提交错误报告。