Интерфейс хостинга CLR4 вызывает повреждение кучи? - PullRequest
2 голосов
/ 16 августа 2011

Я работаю с собственным CLR-хостингом уже несколько недель.В начале это работало довольно хорошо.Но позже я заметил, что что-то в моем приложении вызывает повреждение кучи.Я понял, что это вызвано запуском CLR.(См. Следующую короткую версию кода.)

#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

Есть идеи, как этого избежать?В настоящее время в некоторых случаях это все еще работает, но поскольку мои приложения становятся больше, вероятность ошибки увеличивается в геометрической прогрессии.

1 Ответ

0 голосов
/ 29 февраля 2012

Хотя визуальный анализ приведенного выше кода не позволяет определить причину повреждения кучи, попробуйте AppVerifier + Windbg, чтобы обнаружить его.Вот некоторая информация о том, как это сделать http://blogs.msdn.com/b/lagdas/archive/2008/06/24/debugging-heap-corruption-with-application-verifier-and-debugdiag.aspx. AppVerifier фактически определяет, где в стеке (frame, call) портится куча.

...