2

我安装了一个 SIGSEV 和 SIGABRT 信号处理程序,它派生了一个子进程: 1. 使用 SIGSTOP 停止其父进程。2. 在父进程上调用 gdb 以收集崩溃诊断信息。

问题是,由于 ptmalloc 安装了 pthread_atfork 处理程序, fork 在 glibc 上不是异步信号安全的。现在我的信号处理程序有可能冻结,因为 fork() 尝试分配内存,这反过来可能会抓住一个已经锁定的互斥锁。

我想通过直接调用 fork 系统调用、绕过任何 libc 包装器并因此绕过任何 atfork 处理程序来解决这个问题。我怎么做?以下代码适用于 Linux,但似乎不适用于 OS X。它总是返回子 PID,从不为 0,还是应该这样做?我也不确定我是否正确捕获了返回值,因为定义是int syscall(...)但是 fork 返回一个整数类型pid_t

pid = syscall(SYS_fork);

我的应用程序可以在许多平台上运行,包括 Linux 和 OS X。

编辑:修复错字:s/线程安全/异步信号安全/。

4

1 回答 1

0

在 Linux 上,如果您只想在软件核心转储信号上自动触发调试器,您可以将核心转储管道转换为一些脚本,根据core(5),您只需coredump_filter 使用| (管道字符后跟命令) .

这个技巧避免了任何额外的编程(除了你为此编写的脚本)

于 2012-07-03T05:18:52.740 回答