TL; DR. Имеет ли смысл писать несколько дампов для одного и того же сбоя, и если да, то на что нужно обратить внимание.
Мы используем _1 _ для записи аварийного дампа, когда в нашем приложении есть необработанное исключение / abort / younameit.
Код на самом деле записывает два дампа:
- Один с
MiniDumpWithDataSegs
, чтобы получить маленький, который можно отправить даже по дрянной почте без проблем после заархивирования. - Полный
MiniDumpWithFullMemory
, чтобы иметь полную информацию, если она нам понадобится.
Чтобы это сработало, мы дважды вызываем MiniDUmpWriteDump
:
1 Open/create file for small dump
2 Write small dump
3 Open/create file for large dump
4 Write large dump
Насколько я могу судить, одна дополнительная идея этой схемы заключалась в том, что запись небольшого дампа выполняется быстрее. В принципе, это всегда секунда, в то время как запись большого дампа часто может занять довольно много секунд, особенно когда приложение полностью загружено и большой дамп легко будет составлять 1,2 ГБ или больше.
Насколько я могу судить, идея написания небольшого дампа заключалась в том, что, поскольку он быстрее, он будет делать более подробный снимок аварийного процесса в момент сбоя, поскольку процесс сильно многопоточный.
Очевидно, потоки процесса продолжают выполняться между концом первого вызова и началом второго вызова MDWP, поэтому у нас есть довольно много случаев, когда информация в небольшом дампе на самом деле более точна, чем информация в большая свалка.
Поразмыслив над этим, я бы предположил, однако, что для записи дампа MiniDumpWriteDump
в любом случае должен приостановить потоки процесса, поэтому, если бы мы сначала написали большой дамп, у нас был бы большой дамп точнее маленького.
Вопрос
Следует ли писать большой дамп перед маленьким? Стоит ли вообще писать два дампа? Можно ли каким-то образом заставить систему сначала приостановить потоки процесса, а затем записать два полностью «синхронных» дампа?