2011-08-16 12 views
2

私は数週間、ネイティブCLRホスティングに取り組んでいます。最初はかなりうまくいった。しかし、後で、私のアプリケーションで何かがヒープの破損を引き起こすことに気づいた。私はこれがCLR起動によって引き起こされたことを理解しました。 (次のコードのショートバージョンを参照してください。)CLR4ホスティングインターフェイスがヒープ破損を引き起こしていますか?

#pragma comment(lib, "mscoree.lib") 
#include <mscoree.h> 
#include <metahost.h> 
#include <comdef.h> 
#import "mscorlib.tlb" raw_interfaces_only   \ 
    high_property_prefixes("_get","_put","_putref")  \ 
    rename("ReportEvent", "InteropServices_ReportEvent") 

using namespace mscorlib; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    HRESULT hr; // In fullversion used for error detection - but here unused. 
    PCWSTR pszVersion = L"v4.0.30319"; 
    ICLRMetaHost* lpMetaHost = NULL; 
    ICLRRuntimeInfo* lpRuntimeInfo = NULL; 
    ICorRuntimeHost* lpRuntimeHost = NULL; 
    _AppDomainPtr spAppDomain = NULL; 
    BOOL bLoadable = false; 
    IUnknownPtr spAppDomainThunk = NULL; 

    CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID *)&lpMetaHost); 
    // After this line i can "late detect" 6 array bound heap corruptions in process memory. 

    lpMetaHost->GetRuntime(pszVersion, IID_ICLRRuntimeInfo, (LPVOID *)&lpRuntimeInfo);  
    lpRuntimeInfo->IsLoadable(&bLoadable); 
    lpRuntimeInfo->GetInterface(CLSID_CorRuntimeHost, IID_PPV_ARGS(&lpRuntimeHost)); 
    lpRuntimeHost->Start(); 
    lpRuntimeHost->GetDefaultDomain(&spAppDomainThunk); 
    spAppDomainThunk->QueryInterface(IID_PPV_ARGS(&spAppDomain)); 
    spAppDomainThunk->Release(); 
    // Now I can "late detect" up to 9 array bound heap corruptions in process memory. 

    return 0; 
} 

Rational Purify Exception

これを回避する方法上の任意のアイデアを?現時点ではまだ動作している場合もありますが、アプリケーションが大きくなるにつれてエラーが発生する確率は急激に増加します。

+0

あなたはエラーをチェックしておらず、NULLへのポインタを初期化していません - 完全なバージョンのコードでエラーをチェックしますか? – Justin

+0

はい、私はHRESULTを使用していますが、私の抜粋では定義されていますが未使用です。私はちょうど私の質問を可能な限り短くしておきたいというエラーはありません。私は私の質問ではそれが注目されます。 –

+0

ここにコードに間違いはないと思われます。 spAppDomainThunk-> Release()の直後に戻ると整流エラーが発生しますか? – elevener

答えて

0

上記のコードを視覚的に調べても、ヒープの破損の原因が明らかではありませんが、AppVerifier + Windbgを使用して検出してください。ここでそれを行う方法に関するいくつかの情報があります http://blogs.msdn.com/b/lagdas/archive/2008/06/24/debugging-heap-corruption-with-application-verifier-and-debugdiag.aspx。 AppVerifierは実際にスタック(フレーム、コール)上のどこがヒープを破損しているかを特定します。

+0

AppVerifierとwindbgは、合理的なpuritfyとまったく同じものです。私は上記のエラーを示しています。それに対する私の研究の結論は、これらのエラーはCLR内部でハードコードされているように見え、システム固有の変数などを検出するために使用される可能性があるということです。言い換えれば、マイクロソフトが問題を解決するためにちょっとしたハックをしたように見えますが、これはこれらの9つのエラーに現れます。 BTW。 CLRホストはこれらのエラーに関係なく正常に動作します。 –

関連する問題