vs ++でのC ++呼び出しC#DLLクラッシュの問題

問題

今日、奇妙な問題が発生しました。vs2015Debugがクライアントを開始し、結果はダウンしました。

クラッシュ

  • 積み重ね

スタック

ここに誤解があります。ここから、スクリプトに問題があるはずですが、クライアントが使用するdllが一致しないことを理解しています。

  • 環境

(1)C ++クライアントプロジェクト:vs2012

(2)c#スクリプトプロジェクト:vs2015

  • 変な

(1)ダウンタイムなしでClientD.exeを直接起動する

(2)vs2012でClientD.exeを起動してもクラッシュしません

vs2015に問題がありますか?

解決する

EEFileLoadException

出力情報は、この例外があることを示しているため、* EEFileLoadException *キーワードからいくつかの情報を検索しました

0x00007FFDB1C04008 处(位于 ClientD.exe 中)引发的异常: Microsoft C++ 异常: EEFileLoadException,位于内存位置 0x000000DF6E179560 处。
0x00007FFDB1C04008 处(位于 ClientD.exe 中)引发的异常: Microsoft C++ 异常: [rethrow],位于内存位置 0x0000000000000000 处。
0x00007FFDB1C04008 处(位于 ClientD.exe 中)引发的异常: Microsoft C++ 异常: EEFileLoadException,位于内存位置 0x000000DF6E179560 处。
0x00007FFDB1C04008 处(位于 ClientD.exe 中)引发的异常: Microsoft C++ 异常: [rethrow],位于内存位置 0x0000000000000000 处。
0x00007FFDB1C04008 处(位于 ClientD.exe 中)引发的异常: Microsoft C++ 异常: EEFileLoadException,位于内存位置 0x000000DF6E179560 处。
0x00007FFDB1C04008 (KernelBase.dll)处(位于 ClientD.exe 中)引发的异常: 0xE0434352 (参数: 0xFFFFFFFF80070002, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00007FFD77EB0000)。
0x00007FFDB1C04008 处(位于 ClientD.exe 中)引发的异常: Microsoft C++ 异常: EEFileLoadException,位于内存位置 0x000000DF6E179560 处。

唯一の有用な情報は、C ++がUnmanagd dllに属するC#dllにあることです。

[3]:いくつかの概念が言及されています、マネージド.dll(マネージドdll)、c#のdllがc ++に対してunmanaged.dllであることを簡単に思い出してください

画期的な

コードにはまだスクリプト側の問題があるはずだと思ったが、壊れていないというだけだったので、出力ログを確認したところ、コンソールログの2つの問題が解決されたか、エラーが報告されました。

  • 見つかった

実行時に、Outputは次のログを出力し続け、GameObject.dllがどこかでnull参照を使用することを示します

引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
引发的异常:“System.NullReferenceException”(位于 GameObject.dll 中)
  • キャッチ

私はc#でより強力な同僚に尋ね、この場所をすばやく配置できるかどうかを尋ねました。彼はそれがキャッチされたかもしれないと言ったので、174を* catch(Exception ex)*で検索しました。以下の書き方

catch (Exception ex)
            {
                Debug.Output(ex.ToString());
                return null;
            }

主にDebug.Output出力、およびDebug.Errorおよびその他の関数。Debug.Output関数でブレークポイントが選択されておらず、他の出力関数も壊れていないため、このキャッチが原因ではないはずです。

  • 手動でバグを確認する

デバッグはスクリプトプロジェクトを開始し、下部のロジックから継続的に中断します。最後に、問題の関数を見つけました:

 public State GetTeamState()
        {
            // 省略...
            List<Npc> npcList = NpcMgr.GetInstance().GetNpcList();
            // 问题出在这里的teamList是null
            foreach (Npc npc in teamList)
            {
                    // 省略...
            }
            return state;
        }

まとめ

  • そのようなエラーの問題は、最終的にはvsの問題ではなく、独自のコードの問題です。しかし、vs2015の検査はvs2012の検査よりも厳格であるべきだと推測できます(同じプロジェクト)
  • この問題の最後の理由は、私が作成した関数GetTeamStateにキャッチ例外がなく、例外が上位層でキャッチされますが、何も行われないためです。キャッチの内容は空であるため、有用な情報は出力されません。

参考資料

[1] C ++マネージdllからスローされたC#例外-EEFileLoadException * __ptr64

[2]解決済み:デバッガーでC ++がManaged C ++ Dll-> EEFileLoadExceptionを呼び出すが、Windowsから直接実行した場合は正しく動作する。

[3] C ++(win32アプリ)でC#クラスを使用するとEEFileLoadException

41件のオリジナル記事を公開 賞賛7 20,000回以上の閲覧

おすすめ

転載: blog.csdn.net/pkxpp/article/details/87914984