可以stl set :: insert导致BSOD?

时间:2011-11-18 16:02:21

标签: c++ stl set

我写了一个' 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);
    }
}

基本上,这段代码的作用是&#39; filemon&#39;实用程序与回调过滤器驱动程序交互,每当任何进程触摸文件时,驱动程序都会将相应的文件名报告给“文件”。实用程序通过CbFltOpenFileN函数。

现在的问题是这个&#39; filemon&#39;实用程序在win7 x64机器4GB机器上运行良好,但是一旦我取消注释CbFltOpenFileN函数中的最后一行即开始在集合中插入报告的文件名然后我开始获得BSOD主要使用BugCheck 0xCC,有时使用BugCheck 0x50,这基本上表明& #34;系统正在尝试访问已释放的内存&#34;

P.S。在带有8GB RAM的win7 x64上,无论CbFltOpenFileN函数中的最后一行是否被注释,我都没有看到任何问题。

目前,&#39; wstrSet&#39;使用默认分配器,所以在声明set wstrSet时我需要使用特定的分配器;如果有,有人可以告诉我如何&amp;为什么?

  • 让我在这里分享更多信息:
    • 我正在使用VS2010
    • 我的实用程序是针对x86平台的32位应用程序
    • 我使用的文件系统过滤器驱动程序是Eldos corp。
    • 提供的callabck过滤器驱动程序
    • 现在,我正在使用模拟器来测试此实用程序,该模拟器会生成大量文件,然后启动“文件传输”。实用程序,然后它触及所有这些文件,并最终停止'filemon&#39;效用。该模拟器重复此过程25次。
    • 现在,对于评论最后一行的情况,我会创建25次空日志文件,因为我没有在集合中插入任何内容,但是&#39; filemon&#39;实用程序也不会导致任何BSOD
    • 但是对于没有评论最后一行的情况,我每次使用路径进入时都会创建日志文件,因为现在我在集合中插入路径,但是在前几次迭代中,比如说第二或第三或第六,本身&#39;的filemon&#39;实用程序击中了这个BSOD场景。

我很难在调试模式下重新调试此问题,因为我的模拟器负责启动/停止&#39; filemon&#39;实用程序,我需要多次运行它来重现问题。

希望这个增加的信息有帮助!!!

谢谢和问候, 萨钦

1 个答案:

答案 0 :(得分:0)

如果CbFltOpenFileN是回调函数,这是否意味着它具有异步调用?在这种情况下,您可能希望使用互斥锁保护全局变量(wstrSet