6

我有一个已经工作了很长时间的 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. 请看下面我的回答。

4

2 回答 2

7

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

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

于 2011-05-15T19:43:28.693 回答
3

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

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

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

于 2013-06-30T17:07:10.210 回答