может STL установить :: вставить причину BSOD? - PullRequest
0 голосов
/ 18 ноября 2011

Я написал утилиту 'filemon', которая в основном регистрирует файл, открываемый в течение определенного периода времени.Теперь у меня есть две эти функции в моей утилите 'filemon':

set<wstring> wstrSet;

// callback - get notified by callback filter driver on any file open operation
void CbFltOpenFileN(
                                    CallbackFilter* Sender,
                                    LPWSTR FileName,
                                    ACCESS_MASK DesiredAccess,
                                    WORD FileAttributes,
                                    WORD ShareMode,
                                    DWORD CreateOptions,
                                    WORD CreateDisposition )
 {
      // don't log for directories
      if (FileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
          return;
      }
      wstring wstr = FileName;
      wstr.append(L"\n");
      //wstrSet.insert(wstr); // as soon as I un-comment this line I start getting BSOD in multiple execution of this utility
 }


// Read all paths stored in the set and write them into the log file
void WritePathsToLog() {
    typedef set<wstring>::const_iterator CI;
    printf("\nNo. of files touched ===> %d\n\n", wstrSet.size());
    for (CI iter = wstrSet.begin(); iter != wstrSet.end(); iter++) {
        fputws((*iter).c_str(), logFile);
    }
}

В основном, этот код делает то, что утилита 'filemon' взаимодействует с драйвером фильтра обратного вызова и всякий раз, когда файл затрагивается любым процессом, который сообщает драйверсоответствующее имя файла утилите 'filemon' через функцию CbFltOpenFileN.

Теперь проблема в том, что эта утилита 'filemon' работает нормально на машине 4GB 64-разрядной машины win7, но как только я раскомментирую последнюю строку в функции CbFltOpenFileNто есть начать вставлять указанное имя файла в набор, затем я начинаю получать BSOD в основном с BugCheck 0xCC, а иногда и с BugCheck 0x50, который в основном указывает, что «система пытается получить доступ к уже освобожденной памяти»

PS на win7 x64 с 8 ГБ ОЗУЯ не вижу никаких проблем, независимо от того, закомментирована ли последняя строка в функции CbFltOpenFileN.

В настоящее время 'wstrSet' использует распределитель по умолчанию, поэтому мне нужно использовать определенный распределитель при объявлении set wstrSet;если да, может кто-нибудь сказать мне, как и почему?

  • Позвольте мне поделиться дополнительной информацией:
    • Я использую VS2010
    • Моя утилита - 32-разрядное приложение, предназначенное для платформы x86
    • Драйвер фильтра файловой системы, который я использую, является драйвером фильтра callabck, предоставленным корпорацией Eldos.
    • Теперь я тестирую эту утилиту с помощью симулятора, который генерирует много файлов и затем запускает утилиту 'filemon', затем она затрагивает все тефайлы и в конце останавливает утилиту filemon.Этот симулятор повторяет этот процесс 25 раз.
    • Теперь для случая, когда закомментирована последняя строка, я получаю пустой файл журнала, созданный 25 раз, поскольку я ничего не вставляю в набор, но утилита filemon также не вызывает никакихBSOD
    • Но для случая, когда последняя строка НЕ ​​закомментирована, я получаю файл журнала, каждый раз создаваемый с путевыми путями, так как теперь я вставляю пути в набор, но затем во время первых нескольких итераций, скажем, 2-й, 3-й или 6-й, самаУтилита 'filemon' выполняет этот сценарий BSOD.

Мне сложно воспроизвести эту проблему в режиме отладки, так как мой симулятор заботится о запуске / остановке утилиты 'filemon'и мне нужно запустить его несколько раз, чтобы повторить проблему.

Надеюсь, эта добавленная информация поможет !!!

Спасибо и С уважением, Sachin

1 Ответ

0 голосов
/ 19 ноября 2011

Если вы CbFltOpenFileN - функция обратного вызова, означает ли это, что она имеет асинхронные вызовы? в этом случае вы можете защитить глобальную переменную (wstrSet) с помощью мьютекса ...

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