2011-08-16 108 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

你不檢查失敗,你不初始化你的指針爲空 - 我認爲完整版本的代碼檢查錯誤? – Justin

+0

是的,因此我使用HRESULT,這是在我的摘錄中定義但未使用的。沒有錯誤我只想盡量縮短我的問題。我會注意到在我的問題thx。 –

+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主機工作正常,無論這些錯誤。 –