代码之家  ›  专栏  ›  技术社区  ›  YSK

所有线程都运行SIGSEGV处理程序时崩溃

  •  0
  • YSK  · 技术社区  · 7 年前

    我们在嵌入式MIPS系统中开发了一个运行在Linux3.4.11上的用户空间进程。该进程使用pthreads创建多个(>10)线程。该进程有一个SIGSEGV信号处理程序,该处理程序生成一条日志消息,该消息将发送到我们的日志文件。作为这个流的一部分,它获取一个信号量(坏,我知道…)。

    在我们的测试过程中,这个过程似乎挂起了。我们目前无法为目标平台构建gdb,因此我编写了一个CLI工具,它使用ptrace来使用ptrace_PEEKUSR提取寄存器值和用户数据。

    令我惊讶的是,我们所有的线程都是 在…内 我们的崩溃处理程序,试图获取信号量。这(显然?)表明信号量上存在死锁,这意味着线程在持有信号量时死机。当我挖掘堆栈时,当信号处理程序开始运行时,几乎所有线程(除了一个)都处于阻塞调用(recv、poll、sleep)中。在MIPS上手动重建堆栈是一件痛苦的事,所以我们还没有完全完成。一个线程出现在MALOC调用的中间,对我来说,它是由于堆损坏而崩溃的。

    1) 假设一个线程在malloc中崩溃,为什么所有其他线程都在运行SIGSEGV处理程序?据我所知,SIGSEGV信号被传送到故障线程,不是吗?这是否意味着我们的每一个线程都崩溃了?

    2) 查看MIPS的sigcontext结构,它似乎不包含被访问的内存地址(badaddr)。还有别的地方有吗?我在任何地方都找不到它,但我觉得奇怪的是,它不可用。

    0 回复  |  直到 7 年前
        1
  •  2
  •   Florian Weimer    7 年前

    是的,假设您已正确捕获线程状态,则很可能所有线程依次崩溃。

    siginfo_t 有一个 si_addr 成员,它应该为您提供故障的地址。您的内核是否填充了它是另一回事。

    kernel.core_pattern 调用它。在当前内核中,不需要将核心文件写入磁盘;您可以从标准输入读取核心文件,或者只映射僵尸进程的进程内存(当内核调用崩溃处理程序时仍然可用)。

    推荐文章