4

C++ プロジェクトをデバッグするタスクを与えられました。このプロジェクトでは、コードを 1 行も書いていません!!

このプロジェクトは、約 5 分間問題なく実行されます。その後、「EITos.exe の (一部の .dll 名) で未処理の例外: 0xC0000005: アクセス違反の読み取り場所」という例外で終了します。

今、私はプログラムを実行するたびに. エラーは別の dll からのものです。他のプログラマーによって作成された dll である場合もあれば、QT に関連している場合もあります。したがって、これはコードの問題ではないと思います。これに影響するプロジェクト設定はありますか?

この問題をデバッグする方法について、いくつかの一般的なヒントとヒントを求めています。

4

1 に答える 1

0

DLL を操作する際の一般的な問題は、DLL でメモリを割り当て、別の場所 (別の DLL またはメインの実行可能ファイル) でメモリの割り当てを解除することです。あなたの問題はそのようなものから来るかもしれないと思います。

簡単な解決策の 1 つは、使用している/MDすべてのプロジェクトに対してコンパイラ フラグを使用することです。このオプションは、DLL 間で同じアロケーター/デアロケーターが使用されるように、ランタイム ライブラリを実行可能ファイルに動的にリンクする必要があることを指定します。詳細については、こちらをご覧ください。

また、次の点に注意してください。

ランタイム ライブラリの静的バージョンと動的バージョンを混在させないでください。1 つのプロセスに複数のランタイム ライブラリのコピーがあると、問題が発生する可能性があります。これは、1 つのコピーの静的データが他のコピーと共有されないためです。リンカーを使用すると、1 つの .exe ファイル内で静的バージョンと動的バージョンの両方をリンクできなくなりますが、ランタイム ライブラリの 2 つ (またはそれ以上) のコピーが残る可能性があります。たとえば、ランタイム ライブラリの静的 (非 DLL) バージョンにリンクされたダイナミック リンク ライブラリは、動的 (DLL) バージョンのランタイム ライブラリにリンクされた .exe ファイルと一緒に使用すると、問題を引き起こす可能性があります。 . (また、1 つのプロセスでライブラリのデバッグ バージョンと非デバッグ バージョンを混在させることも避ける必要があります。)

もう 1 つの方法は、ある dll でメモリを割り当てず、別の dll で割り当てを解除することです。したがって、コードを確認して、最終的に書き直すことができます。しかし、これはより時間がかかります。

于 2012-12-21T13:40:30.600 に答える