#c #winapi #mfc #cfile
#c #winapi #mfc #cfile
Вопрос:
Я пытаюсь отладить то, что выглядит как проблема взаимоблокировки, возникающая на одном удаленном компьютере. Мне не удалось создать воспроизводимый случай для на моем локальном компьютере, и это не происходит в 100% случаев на удаленном компьютере.
Мой главный вопрос: может ли дескриптор файла задерживаться и оставаться видимым после его закрытия процессом?
Код довольно сложный, но в основном он выглядит так:
CFile* file = new CFile;
// ...do stuff with the file
delete file
Насколько я могу судить по https://learn.microsoft.com/en-us/cpp/mfc/closing-files?view=msvc-160 , delete
должен гарантировать, что файловый объект закрывает свой дескриптор (фактически вызывая CloseHandle
).
Я проверил (из-за наблюдения дополнительных побочных эффектов), что программа, должно быть, прошла delete
вызов, и в то же время файл все еще открыт через 30 минут при просмотре SysInternals handle.exe
.
Комментарии:
1. С другой стороны, могут быть другие дескрипторы, открытые для того же файла.
2. Если у вас есть доступ к удаленной машине, вы можете извлечь мини-дамп из процесса, как только он перейдет в состояние ошибки. Для этого можно использовать диспетчер задач (щелкните правой кнопкой мыши процесс и выберите Создать файл дампа ).
3. Дескриптор мог быть продублирован вспомогательной функцией где-нибудь.
4. Есть ли у них антивирусное программное обеспечение? Может быть, временно приостановить его? Возможно, это доступ к файлу..
5. И создайте себе простой файл журнала. Регистрируйте при открытии и при закрытии. Затем подсчитайте их в журнале. Убедитесь, что итоговые значения для каждого совпадают.