转储程序时,如何确定所有动作均被冻结

时间:2019-07-10 13:43:04

标签: c++ windows multithreading dump procdump

通常,我正在使用C ++ Windows程序的崩溃转储或内存转储(那些程序是多线程的)。

此类转储是特定时刻与应用程序相关的内存块的外观的图片,但我想知道这是如何工作的:

让我们假设我有两个线程,每个线程运行一个从一到一千万的循环。假设在我进行转储时,两个线程都达到了一定数量:

Thread A      has reached number 12345.
Thread B also has reached number 12345.

我使用任务管理器(右键单击“创建转储文件”)或使用procdump工具进行转储。

正在写入转储,但与此同时线程正在继续其工作(*)。 “ dump-taker”首先获取线程A的转储,该线程的转储已达到编号12345,但是到“ dump-taker”将其线程B的转储进行转储时,该转储已达到编号12399。

这可能吗?如果没有,为什么?如何确保不同线程的状态全部同时获取,并且它们之间没有延迟?

(*)如果您说“ 不,这是不正确的:在转储时,程序被暂停”,然后我的问题变为“但是我如何确定所有线程在同一时间被停顿?”。

1 个答案:

答案 0 :(得分:0)

任务管理器调用MiniDumpWriteDump。该API会在写入转储之前暂停目标进程中的所有线程。

OS(或调试帮助库)不提供一种挂起整个进程的方法。通过一次枚举和挂起一个线程来挂起进程。转储中的线程状态不能及时表示同一实例。

这通常不是问题,因为线程经常处于等待状态,并且不会随时间变化。即使在不同的时间点捕获了状态,捕获的状态通常也没有改变,因此它与在同一时间捕获状态基本上相同。