简体   繁体   English

0xC0000005:访问冲突读取位置0xffffffffffffffffff

[英]0xC0000005: Access violation reading location 0xffffffffffffffff

I have: 我有:

  • An unmanaged C++ app 不受管理的C ++应用
  • A C++/CLI Wrapper C ++ / CLI包装器
  • AC# GUI AC#GUI

I am seeing this crash occur only in Release and not debug. 我看到此崩溃仅发生在Release中,而不发生在调试中。 The crash also does not occur on neither debug or release when the unmanaged C++ app is run by itself. 当非托管C ++应用程序本身运行时,在调试或发布时也不会发生崩溃。

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];
            }

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. 尽管我看不到vstrEEDRRMachines和vstrRRRHMachines里面的内容(因为我们已经发布了),但是我可以看到在原始C ++ / CLI包装器中何时在向量中存在有效的字符串条目。

The stack trace is as follows: 堆栈跟踪如下:

msvcr100.dll!0000000069abbdc0() [Frames below may be incorrect and/or missing, no symbols loaded for msvcr100.dll] msvcr100.dll!0000000069abbdc0()[下面的帧可能不正确和/或丢失,没有为msvcr100.dll加载符号]
DataVerifier.exe!std::_Find,std::allocator DataVerifier.exe!的std :: _查找,性病::分配器

  • __ptr64,std::basic_string,std::allocator __ptr64,性病:: basic_string的,性病::分配器

    (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 (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(const char * szFileName,std :: vector&vSFramesRWF1Messages,std :: vector,std :: allocator,std :: allocator,std :: allocator

    • vstrEEDRRMachines, std::vector,std::allocator ,std::allocator,std::allocator vstrEEDRRMachines,std :: vector,std :: allocator,std :: allocator,std :: allocator
    • vstrRRRHMachines, RsslDataDictionary & rsslDataDictionary) Line 178 + 0x19 bytes C++ [External Code] vstrRRRHMachines,RsslDataDictionary和rsslDataDictionary)第178行+ 0x19字节C ++ [外部代码]
      DataVerifierLib.dll!DataVerifierLib::PCAPParserWrapper::ParseWrapper(System::String^ strInputFileNames) Line 136 + 0xf6 bytes C++ DataVerifierGUI.exe!DataVerifierGUI.Form1.button1_Click(object sender, System.EventArgs e) Line 42 + 0x30 bytes C# user32.dll!00007fff7a8c250d() user32.dll!00007fff7a8c2367() DataVerifierLib.dll!DataVerifierLib :: PCAPParserWrapper :: ParseWrapper(System :: String ^ strInputFileNames)行136 + 0xf6字节C ++ DataVerifierGUI.exe!DataVerifierGUI.Form1.button1_Click(对象发送方,System.EventArgs e)行42 + 0x30字节C#user32 .dll!00007fff7a8c250d()user32.dll!00007fff7a8c2367()
      System.Windows.Forms.ni.dll!00007fff535368c0() System.Windows.Forms.ni.dll!00007fff535368c0()

The crash specifically occurs in c:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\include\\algorithm in this part of the code: 该崩溃专门发生在以下部分的c:\\ Program Files(x86)\\ Microsoft Visual Studio 10.0 \\ VC \\ include \\ algorithm中:

        // 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);
    }

I have no idea what's going on, since release mode with C# + C++/CLI + C++ apps is where the crash is occurring. 我不知道发生了什么,因为崩溃发生的地方是C#+ C ++ / CLI + C ++应用程序的发布模式。 Is there any way I can easily fix this? 有什么办法可以轻松解决此问题?

EDIT 编辑

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). 似乎这发生了10次中的9次,但是我注意到它确实起作用了,当我检查Parse函数的参数时,就像它进入函数一样(还没有执行任何行),所有3个向量都有正常值(第一个为0,第二个和第三个包含预期的IP地址)。 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. 但是,大多数时候,一旦我们进入Parse函数,所有3个向量的大小和容量都为负...使用它们时,一切都会繁荣起来。 I'm going to past the entrance of the Parse function and also the C++/CLI wrapper before it. 我要经过Parse函数的入口以及它之前的C ++ / CLI包装器。

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
{

This is the C++/CLI Wrapper: 这是C ++ / CLI包装器:

// 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();
}

And its appropriate header file: 及其相应的头文件:

// 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++
    };
}

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. 不知道为什么我对此表示反对,因为该解决方案对于混合使用C#和C ++ / CLI包装器的人们可能非常有用。

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);

I've obviously changed it so that it is using this new "marshalString" function. 我显然已经对其进行了更改,以便它使用此新的“ marshalString”函数。 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/ http://blog.nuclex-games.com/mono-dotnet/cxx-cli-string-marshaling/

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. 现在,我需要做的就是弄清楚为什么从包装器返回true并将其分配给C#中的布尔值会返回false……但是希望这会对某些人有所帮助。

UPDATE UPDATE

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. 这解释了为什么在包装器中将false或true返回给C#将不起作用,并且我们要么需要使用函数的编组(不想做),要么为false返回0,为true返回1。

C# DllImport with C++ boolean function not returning correctly 具有C ++布尔函数的C#DllImport无法正确返回

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 尝试从 memory 位置 0x00000000 读取时访问冲突异常 (0xC0000005) - Access violation exception (0xC0000005) when trying to read from memory location 0x00000000 获取IDropTarget并抛出HWND引发0xC0000005访问冲突 - Get IDropTarget with HWND throw 0xC0000005 access violation 访问冲突错误崩溃程序(0xc0000005) - Access Violation error crashing program (0xc0000005) 程序退出,代码为1073741819(0xc0000005)“访问冲突” - The program exited with code-1073741819 (0xc0000005) 'Access violation' 当我尝试启动程序时:(0xc0000005) &#39;访问冲突&#39; 错误 - When i'm trying to start the program: (0xc0000005) 'Access violation' error 从C#调用非托管C ++库(dll)会产生访问冲突错误(0xc0000005) - Calling unmanaged C++ library (dll) from C# creates an access violation error (0xc0000005) xxx.exe中0x782260ec处的首次机会异常:0xC0000005:访问冲突 - First-chance exception at 0x782260ec in xxx.exe: 0xC0000005: Access violation NullReference异常后收到访问冲突异常(0xc0000005)是否正常 - Is it normal to receive access violation exception (0xc0000005) after NullReference exception C# 应用程序“已退出,代码为 -1073741819 (0xc0000005)‘访问冲突’”VS - C# app "has exited with code -1073741819 (0xc0000005) 'Access violation'" VS iisexpress 崩溃由客户端 web 浏览器触发。 错误是“程序 iisexpress exe 已退出,代码为 0xc0000005 访问冲突” - iisexpress crash triggered by the client web browser. The error is "the program iisexpress exe has exited with code 0xc0000005 access violation"
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM