2012-04-05 63 views
1

我能够打印在运行时捕获到异常的线程的堆栈跟踪。我还需要打印在同一个进程中运行的其他线程的跟踪。我有兴趣找到一种很好的方法,只要在一个线程中捕获到异常,就立即冻结所有线程。当一个线程遇到异常时,是否可以冻结所有线程

现在,我所能做的就是查询每个活动线程,然后对其执行SuspendThread()。但是,这将导致每个线程在捕获到初始异常之后执行一次。有没有办法立即导致每个线程暂停?

谢谢。

+1

用崩溃报告杀死进程?您发送给另一个线程的任何信号都需要时间。我想真正的问题是为了你的目的,什么是瞬时的资格,以及如何在那里得到一个快速的信号? – 2012-04-05 02:50:29

+2

我不认为一般情况下,即使对于操作系统来说,“立即”也是不可能的......例如,在多核/多处理器机器上,当#1核心线程崩溃时,核心#2如何知道停止其线程?核心#1必须发送一个“可疑线程”消息到核心#2,届时内核#2的线程已经执行了更多的指令。 – 2012-04-05 03:02:41

+0

根据应用程序的体系结构,您可能可以使用光纤而不是线程。 (当然,您不希望在发布版本中这样做,但调试可能是正确的。) – 2012-04-05 03:46:03

回答

2

您是否尝试从被捕获异常的工作线程使用PostMessage()到GUI线程?

简要步骤的提议:
1)GUI线程产卵数的工作线程
2)工作线程PostMessage的()一次捕获的异常
3)GUI线程接收消息
4)GUI线程请示剩余工作线程暂停

注:定义自己的消息

通过这种方式,你仍然会看到已暂停你的工作线程前有延迟。

另一种方法是使用同步对象,如工作线程中的事件句柄。