Недавно я реализовал утилиту для записи дампов пользовательского режима, используя MiniDumpWriteDump (часть Библиотека справки по отладке). Реализация разделена на собственный процесс. Целевой процесс может запустить эту утилиту и связаться с ней, чтобы инициировать запись минидампа.
Это все работает, как ожидалось. Я не уверен, однако, как интерпретировать правила в отношении параллелизма для MiniDumpWriteDump:
Все функции DbgHelp, такие как эта, являются однопоточными. Следовательно, вызовы из более чем одного потока в эту функцию могут привести к неожиданному поведению или повреждению памяти. Чтобы избежать этого, вы должны синхронизировать все одновременные вызовы из более чем одного потока с этой функцией.
Относится ли вышеизложенное к вызовам из разных потоков на один процесс? Или же одновременные вызовы также требуют синхронизации, если MiniDumpWriteDump
вызывается в разных процессах (например, когда каждый целевой процесс запускает свой собственный служебный процесс)?
Проблема в в библиотеке: «Все DbgHelp
функции, такие как эта, являются однопоточными «.
Поэтому любой процесс, вызывающий эту библиотеку, должен убедиться, что только один отдельный поток использует DbgHelp
функционирует одновременно.
Просто используйте замок, прежде чем использовать DbgHelp
если ваша программа использует DbgHelp
является многопоточным (в противном случае нет проблем).
Другой способ снять это ограничение — добавить (для каждого потока) context
к DbgHelp
библиотека: вы перемещаете все (file-scope) static
и (объем программы) global
переменные в структуре C передаются в качестве аргумента всем вызовам библиотечных функций.