При получении дампа программы, как я могу быть уверен, что все действия заморожены - PullRequest
0 голосов
/ 10 июля 2019

Регулярно я работаю с аварийными дампами или дампами памяти программ 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 голосов
/ 11 июля 2019

Диспетчер задач вызывает MiniDumpWriteDump .Этот API приостанавливает все потоки в целевом процессе до записи дампа.

ОС (или библиотека справки по отладке) не обеспечивает способ приостановить процесс в целом.Процесс приостанавливается путем перечисления и приостановки одного потока за раз.Состояние потоков в дампе не представляет один и тот же экземпляр во времени.

Это часто не проблема, поскольку потоки часто находятся в состоянии ожидания, которое не меняется со временем.Несмотря на то, что состояние было захвачено в разные моменты времени, захваченное состояние часто не менялось, поэтому оно по существу такое же, как если бы состояние было захвачено в одно и то же время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...