2011-05-12 26 views
5

我有一個長期工作的C++代碼庫。代碼庫是我最近遷移到VS 2008的傳統VS 2003項目集合。遷移似乎是成功的,因爲生成的程序已經建立並運行。CRT中調用_osfile()在VS 2008中的聲明錯誤?

我重新安裝了操作系統和新的驅動器上的所有應用程序,而現在當我嘗試在調試器中調試程序,我收到內部的斷言錯誤的CRT的chsize(真的,_chsize_s)。具體而言(裁剪爲要領,忽略安全檢查):內chsize發生

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

調試斷言 - 具體地,CRT的源代碼文件chsize.c內,在下面的行:

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

。 ..其中filedes匹配filehandle

我認爲這個問題可能是由於沒有在新系統上安裝VS的舊版本(僅適用於VS 2008),因爲一些第三方庫需要VS 8.0可再發行 - 即使在舊系統上似乎使用VS 2008構建和運行得很好。因此,我安裝了VS 2005(不是2003)。但是,問題仍然存在。

任何建議將非常受歡迎。

*更新 - 問題與chsize無關。請參閱下面的答案。

+0

由於你裁剪它,你能證實你測試過testfile!= NULL嗎?此外,請注意,MSDN文檔聲稱從VS2005開始,chsize已棄用:http://msdn.microsoft.com/zh-cn/library/ms235502(v=VS.90).aspx - 它們提供了替代方法。 – holtavolt 2011-05-12 22:11:13

+0

感謝提問 - 是的,我確實仔細確認了testfile!= null。無論如何 - 我解決了這個問題 - 與選擇c-runtime線程模型不一致(請參閱我的答案),並與chsize無關。 – 2011-05-15 19:26:50

回答

4

問題已解決 - 與chsize無關。與用於代碼生成的c運行時庫鏈接模型被設置爲用於主項目的多線程調試(/ MTd),但是用於鏈接解決方案中的所有項目的多線程調試DLL(/ MDd)至。更改爲/ MDd解決了問題。

我對這些鏈接問題很熟悉,一般都很小心地正確設置它們,但是因爲這是從Visual Studio早期版本升級而沒有任何更改的工作項目,所以我沒有想到要在這條路上往下看。我沒有調查設置被改變的方式或原因(或者即使它在前一版本中以這種方式設置但沒有引起問題)。

1

在我的代碼中也發現了這個問題。 主程序需要與用MT建立的共享庫鏈接。 當在主程序中打開的文件處理程序傳遞給共享庫的函數時,CRT的setmode.c中的_VALIDATE_RETURN((__file(fh)& FOPEN),EBADF,-1)使程序崩潰。

調試彙編模式下的_osfile,表__pioinfo(01802EEDB0h)中的osfile查找文件處理程序。那麼它是靜態鏈接CRT的固定區域。主程序中的另一個__pioinfo是另一個地址01E619540h。 總之,如果兩個模塊需要共享全局數據,就不能用MT模型建立。

我只是想優化與靜態編譯共享庫,一些很難發現錯誤可能發生。 似乎GCC的力量共享或靜態在大多數情況下是有意義的。