Могут ли дескрипторы файлов Win32 задерживаться после закрытия с помощью CloseHandle?

#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. И создайте себе простой файл журнала. Регистрируйте при открытии и при закрытии. Затем подсчитайте их в журнале. Убедитесь, что итоговые значения для каждого совпадают.