【问题标题】:How crash in one thread affects other threads.一个线程中的崩溃如何影响其他线程。
【发布时间】:2017-05-10 21:56:15
【问题描述】:

我有一个有 2 个线程的程序。

  • 线程 1:在 IOCTL 调用中(与驱动程序交互)
  • 线程 2:在 SIGSEGV 出现的地方做其他事情。

在这种情况下,Thread1 是否完成了 ioctl 调用的执行或线程在执行内核代码之间停止了?

如果可能,请在 Windows、linux 和 android 上下文中提供答案(其中 debuggerd 使用 ptrace 附加到进程以创建墓碑)。

【问题讨论】:

  • 请详细说明您自己调查此问题所采取的步骤。

标签: android c multithreading linux-device-driver system-calls


【解决方案1】:

Linux 的答案:我假设该进程将作为线程 2 处理 SIGSEGV 的一部分终止。在 Linux 中,线程在内核模式下不能正常终止,尽管系统调用代码可能(例如,如果它处于所谓的可中断等待中)通知进程终止并提前退出。线程 1 将在返回后终止。

从开发的角度来看,我对 Android 并不熟悉,但我的理解是进程为许多信号设置了一个处理程序,该处理程序会唤醒 debuggerd 守护进程,而 debuggerd 守护进程又会附加到使用 ptrace 处理信号的进程并转储各种进程状态位。我希望这能够在线程 1 从系统调用返回之前发生。

【讨论】:

  • 感谢您花时间回答这个问题。您能否为“线程在内核模式下无法正常终止”提供任何引用
  • 如果正在执行的内核代码显式终止线程(例如,_exit 系统调用)或另一个内核线程这样做,那么线程当然可以在内核模式下终止。否则:我没有很好的引用可提供,但请看一下 kernel/exit.c 和 kernel/thread.c,特别是 do_group_exit(),它是“由致命信号调用的”。这会向组中的所有线程发送终止信号,并且信号在用户模式下(例如在完成系统调用之后)而不是在内核模式下处理。可中断睡眠的线程被唤醒。
猜你喜欢
  • 1970-01-01
  • 2017-02-28
  • 1970-01-01
  • 2012-11-07
  • 2021-12-08
  • 1970-01-01
  • 2015-09-08
  • 2014-08-07
  • 2010-09-17
相关资源
最近更新 更多