を追加した後、一つの試験では、コードの特定の行あれば種類を取得することができません、失敗、とにFileNotFoundException fmod
を使用し始め、リンカーがスタティックライブラリを持ち込んで実行する方法と何か関係があり、.dll
のものが必要です。テスト中の私のコードは静的なlibです。それはfmodex_vc
を参照しています。別の静的なlibです.にロードすることを決めています。 (これは他のものと同じディレクトリにあるので、なぜそれが見つからないのか分かりません)。私が知る限り、テスト対象のコードはfmod初期化関数を絶対に呼び出さないが、fmodには自分自身を初期化してdllでロードする静的なグローバル初期化子?そのコードは、それを使用するモジュールのコードが使用される場合にのみ取得されます。すべてのテストは、私は、問題の原因を考え出したが、なぜ私はまだ知らないFMODのVisual C++テスト
私はVisual Studioのテストフレームワークを使用して管理されていないC++のコードをテストしていると私はFMODを使用し始めたとき、それは動作を停止:すべてのテスト、何もしないでも、「テスト」のテストは、(読みやすいように改行)報告する:
Unable to get type SlidersTest.UnitTest1, SlidersTest.
Error: System.IO.FileNotFoundException:
The specified module could not be found.
(Exception from HRESULT: 0x8007007E)
多くの試行錯誤の末、.cpp
個のファイルを除き、それらを再追加したところ、テストファイルのうちの1つのみが問題を引き起こすことが判明しました。この行が呼び出された場合、それが唯一ん:
EntityMgr::Init();
その行がコード内にある場合、すべてのテストは、そのメッセージで失敗し始めます。 、
EntityMgr* EntityMgr::instG = null;
と
void EntityMgr::Init()
{
instG = new EntityMgr;
}
と
class EntityMgr
{
private:
static EntityMgr* instG;
public:
EntityMgr() // does nothing beyond the default
{
}
static void Init();
static EntityMgr* Inst() { return instG; }
...
vector<Entity> entitiesG;
};
Entity
FWIW、float
のためだけの様々な、ないポインタとはかなりバニラクラスです:EntityMgr::Init()
は非常に少ないん機能ですそのフィールド。
- どのようにテストを実行しても(テストビューから、選択して実行し、すべて実行し、コマンドラインからテストメニューから実行しても)エラーが発生します。
- デバッガでテストにステップインしようとすると失敗します。デバッガがステップインする前にテストは失敗します。システム例外でブレークするようにデバッガを設定しても何も起こりません。
- テスト中のコードは静的な.libです。 CLRのサポートは
/clr
です。 - ああ、これはちょうど:静的なEntityメンバ関数を呼び出すと、同じことが起こります。静的関数をクラス外に移動すると、同じことが起こります。しかし、私がその機能を別のモジュールに移しても、それは問題ありません。
私はすべての例外でブレークし、デバッガを設定した場合、私が面白い何かを得るか:
First-chance exception at 0x7c812aeb in vstesthost.exe: Microsoft C++ exception: HRException at memory location 0x05129890..
もちろんのその位置に何のソースコードは、ありません。コールスタックは次のとおりです。
kernel32.dll!7c812aeb()
[Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]
kernel32.dll!7c812aeb()
[External Code]
msvcr80.dll!78158ed7()
msvcr80.dll!78158e34()
msvcr80.dll!78158047()
msvcr80.dll!7815850e()
msvcr80.dll!78158872()
msvcr80.dll!78158a57()
msvcr80.dll!78158b11()
ntdll.dll!7c9032a8()
ntdll.dll!7c90327a()
ntdll.dll!7c92a9ef()
ntdll.dll!7c90e46a()
kernel32.dll!7c812aeb()
kernel32.dll!7c812aeb()
kernel32.dll!7c812aeb()
msvcr80.dll!78139c4d()
msvcr80.dll!781323ff()
msctf.dll!74755764()
msctf.dll!74721557()
ws2_32.dll!71ab12bb()
ntdll.dll!7c90118a()
ntdll.dll!7c91b084()
ntdll.dll!7c90de7c()
ntdll.dll!7c90d04c()
ntdll.dll!7c90e43f()
kernel32.dll!7c80b713()
ここでは、mstestがレポートしたスタックトレースがあります。私はそれから何も役に立たないと思います。
Unable to get type SlidersTest.game_EntityMgr_test, SlidersTest. Error: System.IO.FileNotFoundException: The specified module could not be found. (Exception from HRESULT: 0x8007007E)
at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, StackCrawlMark& stackMark)
at System.Reflection.Assembly.LoadFrom(String assemblyFile)
at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter.GetType(UnitTestElement unitTest, String type)
at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter.ResolveMethods().
なぜfmodがこれを行うのですか?
問題を再現できるようなコードがあるとは思いませんか? 同じコードを含む通常のコンソールアプリケーション(MSTestではなく)を作成するとどうなりますか? – jalf
このコンテキストで役立つかもしれませんが、MS DLLでいっぱいにスタックトレースが表示されるたびに、MSシンボルサーバーを使用するようVisual Studioを構成する利点を指摘できません。 基本設定の最初のGoogleの結果の1つだけ: http://geekswithblogs.net/mskoolaid/archive/2005/12/17/63418.aspx 少なくとも、多くの関数名が表示されますそのスタックトレースでは、問題の診断に役立つかもしれません。 – imaginaryboy