6

長い間機能している C++ コード ベースがあります。コード ベースは、私が最近 VS 2008 に移行した従来の VS 2003 プロジェクト セットでした。結果のプログラムがビルドされ、実行されるという点で、移行は成功したように見えました。

OS とすべてのアプリケーションを新しいドライブに再インストールしましたが、デバッガー内でプログラムをデバッグしようとすると、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 8.0 が必要なため、新しいシステム (VS 2008 のみ) に古いバージョンの VS がインストールされていないことが原因で問題が発生する可能性があると考えました。 VS 2008を使用しても問題ありません。したがって、VS 2005をインストールしました(2003ではありません)。ただし、問題は引き続き発生します。

どんな提案でも大歓迎です。

*更新 - この問題は とは無関係chsizeです。以下の私の答えを見てください。

4

2 に答える 2

7

問題は解決されました - とは無関係chsizeです。コード生成用に選択された C ランタイム ライブラリへのリンク モデルは、メイン プロジェクトではマルチスレッド デバッグ (/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 をアセンブリ モードでデバッグし、テーブル __pioinfo (01802EEDB0h) の osfile ルックアップ ファイル ハンドラをデバッグします。静的にリンクされた CRT の固定領域です。また、メイン プログラムの別の __pioinfo は別のアドレス 01E619540h です。つまり、2 つのモジュールがグローバル データを共有する必要がある場合、MT モデルでは構築できません。

共有ライブラリを静的コンパイルで最適化したいだけで、気づきにくいバグが発生する可能性があります。GCC の force shared または static は、ほとんどの状況で理にかなっているようです。

于 2013-06-30T17:07:10.210 に答える