Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CLR4宿主接口导致堆损坏?_C++_Native_Clr Hosting_Heap Corruption - Fatal编程技术网

C++ CLR4宿主接口导致堆损坏?

C++ CLR4宿主接口导致堆损坏?,c++,native,clr-hosting,heap-corruption,C++,Native,Clr Hosting,Heap Corruption,我现在和本地CLR主机一起工作了几个星期。一开始它运行得很好。但后来我注意到我的应用程序中的某些东西导致了堆损坏。我发现这是由CLR启动引起的。(请参阅以下代码的简短版本。) #pragma注释(lib,“mscoree.lib”) #包括 #包括 #包括 #仅导入“mscorlib.tlb”原始接口\ 高级属性前缀(“\u get”、“\u put”、“\u putref”)\ 重命名(“ReportEvent”、“InteropServices_ReportEvent”) 使用名称空间msc

我现在和本地CLR主机一起工作了几个星期。一开始它运行得很好。但后来我注意到我的应用程序中的某些东西导致了堆损坏。我发现这是由CLR启动引起的。(请参阅以下代码的简短版本。)

#pragma注释(lib,“mscoree.lib”)
#包括
#包括
#包括
#仅导入“mscorlib.tlb”原始接口\
高级属性前缀(“\u get”、“\u put”、“\u putref”)\
重命名(“ReportEvent”、“InteropServices_ReportEvent”)
使用名称空间mscorlib;
int _tmain(int argc,_TCHAR*argv[]
{
HRESULT hr;//在fullversion中用于错误检测-但此处未使用。
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_CLRMETHOST、IID_ICLRMetaHost、(LPVOID*)和lpMetaHost);
//在这一行之后,我可以“延迟检测”进程内存中的6个数组绑定堆损坏。
lpMetaHost->GetRuntime(pszVersion,IID_iclruntimeinfo,(LPVOID*)和lpRuntimeInfo);
lpRuntimeInfo->IsLoadable(&bLoadable);
lpRuntimeInfo->GetInterface(CLSID_CorRuntimeHost、IID_PPV_ARGS(&lpRuntimeHost));
lpRuntimeHost->Start();
lpRuntimeHost->GetDefaultDomain(&spapDomainInthunk);
spAppDomainThunk->QueryInterface(IID_PPV_ARGS(&spAppDomain));
spAppDomainThunk->Release();
//现在,我可以在进程内存中“延迟检测”多达9个数组绑定堆损坏。
返回0;
}


有没有办法避免这种情况?目前,在某些情况下,它仍然有效,但随着我的应用程序越来越大,出错的几率呈指数级增加。

尽管目视检查上述代码并不能揭示可能导致堆损坏的原因,但请尝试+Windbg来检测它。这里有一些关于如何做的信息
. AppVerifier实际上可以确定堆栈(帧、调用)上损坏堆的位置。

尽管目视检查上面的代码并不能揭示可能导致堆损坏的原因,但请尝试+Windbg检测它。这里有一些关于如何做的信息
. AppVerifier实际上可以确定堆栈(帧、调用)中损坏堆的位置。

您没有检查失败,也没有将指针初始化为NULL-我认为完整版本的代码确实检查错误?是的,因此我使用了HRESULT,它在我的摘录中定义但未使用。没有错误,我只是想让我的问题尽可能简短。我会注意到在我的问题thx中,这里的代码似乎没有任何错误。如果在spAppDomainThunk->Release()之后立即返回,是否会收到purify错误?如我已经得到的代码中所述!6.行后的purify错误:CLRCreateInstance。。。。后来通过运行应用程序,我注意到由于堆损坏而出现异常。您还没有回答这个问题。ABWL是“后期数组边界写入”。这意味着Purify会在稍后释放对象或启动泄漏扫描时检测错误。所以,如果您在下面的代码中有问题,特别是在托管部分,您很有可能在不相关的地方获得ABWL。创建一个只创建托管堆并退出的项目,然后查看是否看到了谁的错误。您没有检查失败,也没有将指针初始化为NULL-我认为完整版本的代码确实检查了错误?是的,因此我使用了HRESULT,它在我的摘录中定义但未使用。没有错误,我只是想让我的问题尽可能简短。我会注意到在我的问题thx中,这里的代码似乎没有任何错误。如果在spAppDomainThunk->Release()之后立即返回,是否会收到purify错误?如我已经得到的代码中所述!6.行后的purify错误:CLRCreateInstance。。。。后来通过运行应用程序,我注意到由于堆损坏而出现异常。您还没有回答这个问题。ABWL是“后期数组边界写入”。这意味着Purify会在稍后释放对象或启动泄漏扫描时检测错误。所以,如果您在下面的代码中有问题,特别是在托管部分,您很有可能在不相关的地方获得ABWL。创建一个只创建托管堆并退出的项目,看看是否看到了谁的错误。AppVerifier和windbg所做的与rational puritfy所做的完全相同,这显示了上面的错误。我的研究结论是,这些错误似乎是在CLR中硬编码的,可以用来检测系统特定的变量或类似的东西。换言之,微软似乎做了一点小改动来解决一个问题,这表现在这9个错误中。顺便说一句,CLR主机可以正常工作,不管这些错误。AppVerifier和windbg所做的与rational puritfy所做的完全相同,这向我展示了上面的错误。我的研究结论是,这些错误似乎是在CLR中硬编码的,可以用来检测系统特定的变量或类似的东西。换言之,微软似乎做了一点小改动来解决一个问题,这表现在这9个错误中。顺便说一句,不管出现这些错误,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;
}