0xC0000005:访问冲突读取位置0xffffffffffffffff [英] 0xC0000005: Access violation reading location 0xffffffffffffffff

查看:1153
本文介绍了0xC0000005:访问冲突读取位置0xffffffffffffffff的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有:


  • 非托管C ++应用程式


  • AC#GUI

我看到此崩溃仅在发布且不调试时发生。当非托管C ++应用程序自己运行时,崩溃也不会发生在调试或发布时。

I am seeing this crash occur only in Release and not debug. The crash also does not occur on neither debug or release when the unmanaged C++ app is run by itself.

我可以说是崩溃发生在这行代码:

All I can say is the crash occurs in this line of code:

            if ((std::find(vstrEEDRRMachines.begin(), vstrEEDRRMachines.end(), m_sFrame.strSourceAddress) != vstrEEDRRMachines.end()
                && std::find(vstrEEDRRMachines.begin(), vstrEEDRRMachines.end(), m_sFrame.strDestAddress) != vstrEEDRRMachines.end())
                || (std::find(vstrRRRHMachines.begin(), vstrRRRHMachines.end(), m_sFrame.strSourceAddress) != vstrRRRHMachines.end()
                && std::find(vstrRRRHMachines.begin(), vstrRRRHMachines.end(), m_sFrame.strDestAddress) != vstrRRRHMachines.end())) 
            {
                // Create appropriate buffer size for raw message (i.e. size of payload along with the extra padding
                // for decoding)
                m_sFrame.iMessageSize = m_sFrame.iPayloadLength;
                m_sFrame.iOriginalMessageSize = m_sFrame.iPayloadLength;
                m_sFrame.pszMessage = new unsigned char[m_sFrame.iPayloadLength + Constants::RSSL_DECODE_PADDING];
                m_sFrame.pszOriginalMessage = new unsigned char[m_sFrame.iPayloadLength + Constants::RSSL_DECODE_PADDING];
            }

虽然我看不到vstrEEDRRMachines和vstrRRRHMachines发布),我可以看到,当在原来的C ++ / CLI包装中有向量中有有效的字符串条目。

Although I can't see what's inside vstrEEDRRMachines and vstrRRRHMachines (because we are in release), I can see when in the original C++/CLI wrapper that there are valid string entries in the vector.

堆栈跟踪如下:


msvcr100.dll!0000000069abbdc0()[下面的框架可能不正确
和/或缺少,没有为msvcr100.dll加载符号]

DataVerifier.exe!std :: _ Find,std :: allocator

msvcr100.dll!0000000069abbdc0() [Frames below may be incorrect and/or missing, no symbols loaded for msvcr100.dll]
DataVerifier.exe!std::_Find,std::allocator



  • __ ptr64,std :: basic_string,std :: allocator

  • __ptr64,std::basic_string,std::allocator

(std :: basic_string,std :: allocator> * _First,std :: basic_string,std :: allocator> *
_Last,const std :: basic_string,std :: allocator>&
_Val)第41行+ 0x4a字节C ++
DataVerifier.exe!DataVerifier :: CPCAPParser :: Parse * szFileName,
std :: vector
& vSFramesRWF1Messages,std :: vector,std :: allocator
,std :: allocator,std :: allocator

(std::basic_string,std::allocator > * _First, std::basic_string,std::allocator > * _Last, const std::basic_string,std::allocator > & _Val) Line 41 + 0x4a bytes C++ DataVerifier.exe!DataVerifier::CPCAPParser::Parse(const char * szFileName, std::vector & vSFramesRWF1Messages, std::vector,std::allocator ,std::allocator,std::allocator



  • vstrEEDRRMachines,std :: vector,std :: allocator
    ,std :: allocator,std :: allocator

  • vstrRRRHMachines,RsslDataDictionary& rsslDataDictionary)行178 + 0x19字节C ++ [外部代码]

    DataVerifierLib.dll!DataVerifierLib :: PCAPParserWrapper :: ParseWrapper(System :: String ^
    strInputFileNames)行136 + 0xf6字节C ++
    DataVerifierGUI.exe!DataVerifierGUI.Form1.button1_Click(object
    sender,System.EventArgs e)第42行+ 0x30字节C#
    user32.dll!00007fff7a8c250d()user32.dll!00007fff7a8c2367 >
    System.Windows.Forms.ni.dll!00007fff535368c0()




崩溃具体发生在c:\Program Files(x86)\\ \\ Microsoft Visual Studio 10.0 \VC\include\algorithm在这部分代码中:

The crash specifically occurs in c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\algorithm in this part of the code:

        // TEMPLATE FUNCTION find
template<class _InIt,
    class _Ty> inline
    _InIt _Find(_InIt _First, _InIt _Last, const _Ty& _Val)
    {   // find first matching _Val
    for (; _First != _Last; ++_First)
        if (*_First == _Val) <-- CRASH OCCURS HERE
            break;
    return (_First);
    }



我不知道发生了什么,因为发布模式与C#+ C ++ / CLI + C ++应用程序是崩溃发生的地方。有任何方法可以轻松解决这个问题吗?

I have no idea what's going on, since release mode with C# + C++/CLI + C++ apps is where the crash is occurring. Is there any way I can easily fix this?

EDIT

像这样发生9次出10,但我注意到它的工作时间,当我检查Parse函数的参数,因为它进入函数(没有行执行),所有3个矢量具有正常值(第一个为0,第二个和第三个包含预期的IP地址)。但是,大多数时候,只要我们进入Parse函数,所有3个向量都具有负的大小和容量...,当它们被使用时,一切都进入繁荣。我要经过Parse函数的入口,并且在它之前的C ++ / CLI包装器。

It seems like this occurs 9 times out of 10, but i've noticed the times it does work, when I check the parameters of the Parse function just as it goes into the function (no lines are executed yet), all 3 vectors have normal values (the 1st one is 0, the second and third contain IP addresses as expected). However, most of the time, as soon as we get into the Parse function, all 3 vectors have negative size and capacities... and when they are used, everything goes boom. I'm going to past the entrance of the Parse function and also the C++/CLI wrapper before it.

bool CPCAPParser::Parse(const char* szFileName, std::vector<CRWFCapsule> &vSFramesRWF1Messages, std::vector<std::string> vstrEEDRRMachines, std::vector<std::string> vstrRRRHMachines, RsslDataDictionary &rsslDataDictionary) // change to a vector of rwf1capsules
{

这是C ++ / CLI包装:

This is the C++/CLI Wrapper:

// This is the main DLL file.

#include "stdafx.h"

#include "DataVerifierLib.h"

// Constructor Implementation
DataVerifierLib::PCAPParserWrapper::PCAPParserWrapper()
{
}

std::vector<std::string> DataVerifierLib::PCAPParserWrapper::CreateNewMachineCollection(std::vector<std::string> vstrNewMachines, std::vector<std::string> vstrMachine1, std::vector<std::string> vstrMachine2)
{
    vstrNewMachines.reserve(vstrMachine1.size() + vstrMachine2.size()); // preallocate memory
    vstrNewMachines.insert(vstrNewMachines.end(), vstrMachine1.begin(), vstrMachine1.end());
    vstrNewMachines.insert(vstrNewMachines.end(), vstrMachine2.begin(), vstrMachine2.end());
    return vstrNewMachines;
}

bool DataVerifierLib::PCAPParserWrapper::ParseWrapper(String^ managedString)
{
    // String conversion from c# to c++
    String^ managedStringTmp = managedString;
    std::string strInputFileNames = msclr::interop::marshal_as<std::string>(managedStringTmp);

    std::vector<std::string> vRRMachines;
    std::vector<std::string> vRHMachines;
    std::vector<std::string> vEEDMachines;
    std::vector<std::string> vPorts; // decide on what checks are to be made. Should frame have matching src/dest ports? or just one of them.
    std::vector<std::string> vEEDRRMachines;
    std::vector<std::string> vRRRHMachines;
    std::vector<std::string> vstrLines;

    std::string strTxtFile = "ServerIPList.txt"; //argv[2]; // ServerIPList.txt
    std::string strLine;
    std::ifstream in(strTxtFile);

    if (!in)
    {
        std::cout << "There was a problem opening the file." << std::endl;
        std::cerr << "Error: " << strerror(errno) << std::endl;
        return -1;
    }

    while (std::getline(in, strLine))
    {
        vstrLines.push_back(strLine);
    }

    for (int i = 0; i < vstrLines.size(); ++i)
    {
        if (vstrLines[i].substr(0, 2) == "rr")
        {
            boost::split(vRRMachines, vstrLines[i], boost::is_any_of(","));
            if (vRRMachines.size() < 2)
                return -1;
            else
                vRRMachines.erase(vRRMachines.begin());
        }
        else if (vstrLines[i].substr(0, 2) == "rh")
        {
            boost::split(vRHMachines, vstrLines[i], boost::is_any_of(","));
            if (vRHMachines.size() < 2)
                return -1;
            else
                vRHMachines.erase(vRHMachines.begin());
        }
        else if (vstrLines[i].substr(0, 3) == "eed")
        {
            boost::split(vEEDMachines, vstrLines[i], boost::is_any_of(","));
            if (vEEDMachines.size() < 2)
                return -1;
            else
                vEEDMachines.erase(vEEDMachines.begin());
        }
        else if (vstrLines[i].substr(0, 5) == "ports")
        {
            boost::split(vPorts, vstrLines[i], boost::is_any_of(","));
            if (vPorts.size() < 2)
                return -1;
            else
                vPorts.erase(vPorts.begin());
        }
    }

    // Create a vector with EED/RR and RR/RH combined addresses
    vEEDRRMachines = CreateNewMachineCollection(vEEDRRMachines, vEEDMachines, vRRMachines);
    vRRRHMachines = CreateNewMachineCollection(vRRRHMachines, vRRMachines, vRHMachines);

    // Initialise Rssl
    RsslRet rsslRet;
    RsslError rsslError;
    rsslRet = rsslInitialize(RSSL_LOCK_NONE, &rsslError);

    if (rsslRet != RSSL_RET_SUCCESS)
        return -1;

    // Initialise Field Dictionary
    // To prevent memory issues, we need to use "malloc" for the data dictionary in order to load RWF.dat and enumtype.def
    RsslDataDictionary *rsslDataDictionary = (RsslDataDictionary*)malloc(sizeof(RsslDataDictionary));
    RsslBuffer rsslBufferError;
    rsslClearDataDictionary(rsslDataDictionary);
    if (rsslRet = rsslLoadFieldDictionary("RWF.DAT", rsslDataDictionary, &rsslBufferError) != RSSL_RET_SUCCESS)
    {
        // Ensure we free the data dictionary memory when finished
        free(rsslDataDictionary);
        //if (iDisplayType != DISPLAY)
        //  std::cout << "Could not load RDM Field Dictionary file." << std::endl;
        return -1;
    }

    // Load enum dictionary
    if (rsslLoadEnumTypeDictionary("enumtype.def", rsslDataDictionary, &rsslBufferError) != RSSL_RET_SUCCESS)
    {
        // Ensure we free the data dictionary memory when finished
        free(rsslDataDictionary);
        //if (iDisplayType != DISPLAY)
        //  std::cout << "Could not load Enum Type Dictionary file." << std::endl;
        return -1;
    }

    std::string strCombinedFileName;
    std::vector<CRWFCapsule> vRWFCapsules;
    std::vector<std::string> vstrInputFileNames;
    pPcapParser = new CPCAPParser(1,1); // Initiate C++ class instance
    boost::algorithm::split_regex(vstrInputFileNames, strInputFileNames, boost::regex(","));

    // Let's iterate through each PCAP file and parse it.
    for (int i = 0; i < vstrInputFileNames.size(); ++i)
    {
        if (false == strCombinedFileName.empty())
        {
            strCombinedFileName.append("-");
        }

        if (false == pPcapParser->Parse(vstrInputFileNames[i].c_str(), vRWFCapsules, vEEDRRMachines, vRRRHMachines, *rsslDataDictionary))
        {
            delete pPcapParser;
            // Ensure we free the data dictionary memory when finished
            free(rsslDataDictionary);
            vRWFCapsules.clear();
            return -1;
        }

        strCombinedFileName = strCombinedFileName.append(pPcapParser->GetFileName());
    }

    //if (iDisplayType != NO_DISPLAY)
    //  std::cout << "Clearing up..." << std::endl;
    delete pPcapParser;

    if (rsslRet = rsslDeleteDataDictionary(rsslDataDictionary) != RSSL_RET_SUCCESS)
    {
        // Ensure we free the data dictionary memory when finished
        free(rsslDataDictionary);
        //if (iDisplayType != NO_DISPLAY)
        //  std::cout << "Problem deleting dictionary." << std::endl;
        return -1;
    }

    // Ensure we free the data dictionary memory when finished
    free(rsslDataDictionary);

    if (vRWFCapsules.empty())
        return -1;

    CMessageSorter msgSorter(vEEDMachines, vRRMachines);
    std::map<std::string, SMessageInfo> m_msMessageInfo;
    std::map<std::string, SSystemInfo> m_msSystemInfo = msgSorter.SortMessages(vRWFCapsules, 1, m_msMessageInfo);
    if (m_msSystemInfo.empty())
        return -1;

    CDataVerifier dataVerifier(strCombinedFileName, 1, 1);
    dataVerifier.CreateOutputForAllMessages(m_msMessageInfo);
    dataVerifier.Process(m_msSystemInfo);

    // When clearing the vector, we have to make sure that the destructor of the RWF message is being called... so everything destroys itself correctly.
    // Will need to check if destruction is down properly. However, how can we delete RWF Capsules encapsulated in eachother?...

    vRWFCapsules.clear();
}

及其相应的头文件:

// DataVerifierLib.h

#pragma once
#include "../DataVerifier/CRWFCapsule.h"
#include "../DataVerifier/ISystem.h"
#include "../DataVerifier/CFrameAnalyser.h"
#include "../DataVerifier/CPCAPParser.h"
#include "../DataVerifier/CMessageSorter.h"
#include "../DataVerifier/CDataVerifier.h"
#include "../DataVerifier/CSourceDirectoryResponse.h"
#include "../DataVerifier/CDataVerifierConstants.h"
#include <vector>
#include <fstream>
#include <sstream>
#include <stdexcept>
#include <boost/algorithm/string.hpp>
#include <msclr/marshal_cppstd.h>

using namespace System;
using namespace DataVerifier;

namespace DataVerifierLib {

    public ref class PCAPParserWrapper
    {
        // TODO: Add your methods for this class here.
    public:
        // Constructor
        PCAPParserWrapper();

        // Wrapper Methods
        bool ParseWrapper(String^ strInputFileNames);

        // Fill vectors with appropriate RR/EED/RH addresses
        std::vector<std::string> CreateNewMachineCollection(std::vector<std::string> vstrNewMachines, std::vector<std::string> vstrMachine1, std::vector<std::string> vstrMachine2);

        // Public Variable
        double initVal;

    private:
        CPCAPParser *pPcapParser; // an instance of class in C++
    };
}


推荐答案

不知道为什么我因为解决方案对于混合C#和C ++ / CLI包装器的人非常有用。

Don't know why I have received down votes for this, as the solution could be quite useful to people mixing C# and a C++/CLI wrapper.

我意识到可疑行实际上是这行:

I realized that the suspect line was actually this line:

//String^ managedStringTmp = managedString;
//std::string strInputFileNames = msclr::interop::marshal_as<std::string>(managedStringTmp);
std::string strInputFileNames = marshalString<E_UTF8>(managedString);



我显然改变了它,以便它使用这个新的marshalString函数。我在这里的链接中使用了一个元素字符串模板类,因为它似乎解决了性能问题。

I've obviously changed it so that it is using this new "marshalString" function. I used a marshal string template class from the link here, as it seems to address performance issues.

http://blog.nuclex-games.com/mono-dotnet/cxx-cli-string-marshaling/

现在我需要做的是找出为什么从包装器返回true并将它分配给一个布尔在C#返回false ...但希望这将帮助一些人。

Now all I need to do is figure out why returning true from the wrapper and assigning it to a boolean in C# returns false... but hopefully this will help some people out.


$ b

UPDATE

这解释了为什么在包装器中返回false或true到C#将不工作,我们需要使用编组的函数(不想做)或返回0为假和1为真。

This explains why returning false or true in the wrapper back to C# won't work, and that we either need to use marshalling of the function (didn't want to do) or return 0 for false and 1 for true.

C#DllImport与C ++布尔函数无法正确返回 a>

这篇关于0xC0000005:访问冲突读取位置0xffffffffffffffff的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆