【问题标题】:Assertion error in CRT calling _osfile() in VS 2008?CRT 在 VS 2008 中调用 _osfile() 时出现断言错误?
【发布时间】:2011-05-12 20:35:40
【问题描述】:

我有一个已经工作了很长时间的 C++ 代码库。代码库是我最近迁移到 VS 2008 的遗留 VS 2003 项目集。迁移似乎是成功的,因为生成的程序已构建并运行。

我在新驱动器上重新安装了我的操作系统和所有应用程序,现在当我尝试在调试器中调试程序时,我在 CRT 的chsize(真的,_chsize_s)中收到一个断言错误。具体来说(裁剪为必需品,忽略安全检查):

FILE * testfile = fopen("P:\\_Dan\\local\\foogoo.txt", "w");
int filehandle = fileno(testfile);
chsize(filehandle, 0);
fwrite("goohoo", 1, 6, testfile);
fclose(testfile);

调试断言发生在 chsize 中 - 具体来说,在 CRT 的源代码文件 chsize.c 中的以下行:

 _VALIDATE_CLEAR_OSSERR_RETURN_ERRCODE((_osfile(filedes) & FOPEN), EBADF);

...filedes 匹配 filehandle

我认为问题可能是由于新系统上没有安装旧版本的 VS(仅限 VS 2008),因为一些第 3 方库需要 VS 8.0 可再发行版 - 即使在旧系统上似乎是使用 VS 2008 构建和运行得很好。因此我安装了 VS 2005(不是 2003)。但是,问题仍然存在。

非常欢迎任何建议。

* 更新 - 该问题与 chsize 无关。请参阅下面的答案。

【问题讨论】:

  • 既然你把它剪下来了,你能确认你测试了那个testfile!= NULL吗?另外,请注意 MSDN 文档说 chsize 自 VS2005 起已弃用:msdn.microsoft.com/en-us/library/ms235502(v=VS.90).aspx - 他们提供替代方案。
  • 感谢您的提问 - 是的,我确实仔细确认了 testfile != null。无论如何 - 我解决了这个问题 - 涉及 c-runtime 线程模型选择的不匹配(请参阅我的答案),并且与 chsize 无关。

标签: c++ visual-studio visual-studio-2008 msvcrt crt


【解决方案1】:

问题已解决 - 与 chsize 无关。选择用于代码生成的 c 运行时库的链接模型被设置为主项目的多线程调试 (/MTd),但它链接的解决方案中的所有项目的多线程调试 DLL (/MDd)到。更改为 /MDd 解决了这个问题。

我对这些链接问题很熟悉,并且通常会小心地正确设置它们,但是因为这是从早期版本的 Visual Studio 升级的工作项目,没有任何更改,所以我没有想过要往下看。我没有调查设置更改的方式或原因(或者即使在以前的版本中以这种方式设置但没有引起问题)。

【讨论】:

    【解决方案2】:

    在我的代码中也发现了这个问题。 主程序需要与使用 MT 构建的共享库链接。 当主程序中打开的文件处理程序传递给共享库的函数时,CRT 的 setmode.c 中的 _VALIDATE_RETURN((_osfile(fh) & FOPEN), EBADF, -1) 使程序崩溃。

    在汇编模式下调试 _osfile,osfile 在表 __pioinfo (01802EEDB0h) 中查找文件处理程序。好吧,它是静态链接 CRT 中的固定区域。而主程序中的另一个__pioinfo是另一个地址01E619540h。 一言以蔽之,如果两个模块需要共享全局数据,不能用MT模型构建。

    我只想通过静态编译来优化共享库,可能会发生一些难以注意到的错误。 似乎 GCC 的力量共享或静态在大多数情况下都是有意义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多