关于_debugger_hook_dummy = 0;的原因以及解决办法

anuosix 2008-11-22 08:41:48
首先是release版本出现的错误位置:
在文件 dbghook.c 的最后一行,具体的就是程序出问题的时候就指到下面函数的最后一条语句
void __cdecl _CRT_DEBUGGER_HOOK(int _Reserved)
{
/* assign 0 to _debugger_hook_dummy so that the function is not folded in retail */
(_Reserved);
_debugger_hook_dummy = 0;
}

就指在这最后一行,怎么回事?不明白


上面描述的错误是在release版本下出现的
在debug版本下边出现的错误是这样的
一个断言失败的对话框:
Debug Assersion Failed
然后出错代码位置在filetxt.cpp的268行
代码如下:
ULONGLONG CStdioFile::Seek(LONGLONG lOff, UINT nFrom) { ASSERT_VALID(this); ASSERT(nFrom == begin || nFrom == end || nFrom == current); ASSERT(m_pStream != NULL);

ASSERT(m_pStream != NULL);就是错误的位置,看来是产生了指向NULL的指针,但是如何产生的呢?还是不明白



后来找到出错的函数主要在于两个文件读写的函数:
void CTest::printIntToFile(const std::string &str,int iPrint)
{
std::string strToPrint=str+boost::lexical_cast<std::string>(iPrint)+"\n";
CStdioFile cfLogOfFunc;
cfLogOfFunc.Open("C:\\Documents and Settings\\Administrator\\桌面\\logOfFunc.txt",CStdioFile::modeReadWrite|CStdioFile::typeText );
cfLogOfFunc.SeekToEnd();
cfLogOfFunc.WriteString(CString(strToPrint.c_str()));
cfLogOfFunc.Close();
}

void CTest::printLogToFile(const std::string &str,int iPrint)
{
std::string strToPrint=str+boost::lexical_cast<std::string>(iPrint)+"\n";
CStdioFile cfLog;
cfLog.Open("C:\\Documents and Settings\\Administrator\\桌面\\log.txt",CStdioFile::modeReadWrite|CStdioFile::typeText );
cfLog.SeekToEnd();
cfLog.WriteString(CString(strToPrint.c_str()));
cfLog.Close();

}

这两个函数主要是写一些程序运行信息,需要在大量循环里边使用,可能要执行上万次,问题就出在这两个函数里边,但是我不知道这样写这两个函数有什么不对的

后来把其中一个函数改写了一下,能够运行出结果,但是非常慢,如果这两个函数全部被注释掉,运行时间7000毫秒左右,但是如果这样改写,运行时间350000毫秒左右,虽然打印会花费时间,但是这样还是我不能接受的
void CTest::printLogToFile(const std::string &str,int iPrint)
{
std::string strToPrint=str+boost::lexical_cast<std::string>(iPrint)+"\n";
CStdioFile cfLog;
bool isOpenFileSuccess=false;

int i=0;
while (isOpenFileSuccess==false)
{
isOpenFileSuccess=cfLog.Open("C:\\Documents and Settings\\Administrator\\桌面\\log.txt",CStdioFile::modeReadWrite|CStdioFile::typeText );
i++;

}

cfLog.SeekToEnd();
cfLog.WriteString(CString(("\n\n\n\ni="+boost::lexical_cast<std::string>(i)).c_str()));
cfLog.WriteString(CString(strToPrint.c_str()));
cfLog.Close();

}

打印i的值,发现有时候i的值能达到2000至4000,偶有4000以上,很少,也就是说,在打开文件的时候,有时候要重复几千次才能够打开成功,这是为什么呢?
而且i要么是1(绝大部分是这个值),要么就是2000-4000,中间的值基本没有,在我的测试中,只有一次出现了i=2,什么原因?
望高手解答!!!
谢谢!!!
...全文
6430 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
seikou1100 2011-09-19
  • 打赏
  • 举报
回复
我也碰到了,不知道是怎么解决的~
mainsea 2011-09-18
  • 打赏
  • 举报
回复
请问这个最后是怎么解决的啊??今天碰到相同的问题
似水流年__ 2009-11-27
  • 打赏
  • 举报
回复
是因为路径中有空格的原因,我也在找解决方法的
anuosix 2008-11-23
  • 打赏
  • 举报
回复
找到原因:共享访问冲突,m_cause代码是11

我考虑了两个原因:
(1)这个错误是在release下出现,那么系统在作优化的时候启用了多线程,那么这样就造成了访问冲突
(2)打开文件的时候,防毒软件对文件进行扫描造成访问冲突

不知道这样理解对不对
deerwin1986 2008-11-22
  • 打赏
  • 举报
回复
关注 也曾经有过类似的问题
想知道这个变量的意义 等待高手
hityct1 2008-11-22
  • 打赏
  • 举报
回复
检查一下失败的原因,msdn中的例子。

//example for CFile::Open
CFile f;
CFileException e;
char* pFileName = "test.dat";
if( !f.Open( pFileName, CFile::modeCreate | CFile::modeWrite, &e ) )
{
#ifdef _DEBUG
afxDump << "File could not be opened " << e.m_cause << "\n";
#endif
}

帅得不敢出门 2008-11-22
  • 打赏
  • 举报
回复
有一个可能的原因是
"C:\\Documents and Settings\\Administrator\\桌面\\logOfFunc.txt",
这个路径名称带有空格
你换成其他路径
或者路径名再用一个""括起来
Non_Recursive 2008-11-22
  • 打赏
  • 举报
回复
up
anuosix 2008-11-22
  • 打赏
  • 举报
回复
自己顶一下
anuosix 2008-11-22
  • 打赏
  • 举报
回复
楼上两位兄弟,关于你们回答的两个问题:
(1)路径空格是怎么回事,为什么有空格就不行呢,又为什么要多加一个引号
(2)频繁打开虽然效率不高,但是也不至于要导致持续几千次打开失败阿,这个又是为什么
hityct1 2008-11-22
  • 打赏
  • 举报
回复
打开文件后,你怎么不检查一下是否成功?

cfLogOfFunc.Open("C:\\Documents and Settings\\Administrator\\桌面\\logOfFunc.txt",CStdioFile::modeReadWrite|CStdioFile::typeText );
cfLogOfFunc.SeekToEnd();

如果是是频繁使用,那你就事先打开,不要频繁的打开、关闭。


65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧