通常,我正在使用C ++ Windows程序的崩溃转储或内存转储(那些程序是多线程的)。
此类转储是特定时刻与应用程序相关的内存块的外观的图片,但我想知道这是如何工作的:
让我们假设我有两个线程,每个线程运行一个从一到一千万的循环。假设在我进行转储时,两个线程都达到了一定数量:
Thread A has reached number 12345.
Thread B also has reached number 12345.
我使用任务管理器(右键单击“创建转储文件”)或使用procdump工具进行转储。
正在写入转储,但与此同时线程正在继续其工作(*)。 “ dump-taker”首先获取线程A的转储,该线程的转储已达到编号12345,但是到“ dump-taker”将其线程B的转储进行转储时,该转储已达到编号12399。
这可能吗?如果没有,为什么?如何确保不同线程的状态全部同时获取,并且它们之间没有延迟?
(*)如果您说“ 不,这是不正确的:在转储时,程序被暂停”,然后我的问题变为“但是我如何确定所有线程在同一时间被停顿?”。
答案 0 :(得分:0)
任务管理器调用MiniDumpWriteDump。该API会在写入转储之前暂停目标进程中的所有线程。
OS(或调试帮助库)不提供一种挂起整个进程的方法。通过一次枚举和挂起一个线程来挂起进程。转储中的线程状态不能及时表示同一实例。
这通常不是问题,因为线程经常处于等待状态,并且不会随时间变化。即使在不同的时间点捕获了状态,捕获的状态通常也没有改变,因此它与在同一时间捕获状态基本上相同。