【问题标题】:Application crash at stl string creation创建 stl 字符串时应用程序崩溃
【发布时间】:2011-05-09 22:28:31
【问题描述】:

我的应用程序的两个位置出现应用程序崩溃。其中一个位置是下面给出的方法的以下语句。应用程序在为传递给 LogMessage 方法的字符串创建 stl 字符串对象时崩溃。

EMCoreLogger::GetLoggerInstance()->LogMessage("Sending message completed successfully",
                            "CGEMCustomMessageService",Information);

调用栈如下所示

    msvcr90.dll!_crt_debugger_hook(int _Reserved=101180712)  Line 65    C
    msvcr90.dll!_invalid_parameter(const wchar_t * pszExpression=0x00000000, const wchar_t * pszFunction=0x00000000, const wchar_t * pszFile=0x00000000, unsigned int nLine=0, unsigned int pReserved=0)  Line 112 + 0x7 bytes  C++
    msvcr90.dll!memcpy_s(void * dst=0x0607e5d8, unsigned int sizeInBytes=0, const void * src=0x084beac8, unsigned int count=38)  Line 55 + 0x19 bytes   C
    msvcp90.dll!std::char_traits<char>::_Copy_s(char * _First1=0x0607e5d8, unsigned int _Size_in_bytes=0, const char * _First2=0x084beac8, unsigned int _Count=38)  Line 583    C++
    msvcp90.dll!std::_Traits_helper::copy_s<std::char_traits<char> >(char * _First1=0x0607e5d8, unsigned int _Size=0, const char * _First2=0x084beac8, unsigned int _Count=38, std::_Secure_char_traits_tag __formal={...})  Line 714 + 0x11 bytes  C++
    msvcp90.dll!std::_Traits_helper::copy_s<std::char_traits<char> >(char * _First1=0x0607e5d8, unsigned int _Size=0, const char * _First2=0x084beac8, unsigned int _Count=38)  Line 706 + 0x14 bytes   C++
    msvcp90.dll!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign(const char * _Ptr=0x084beac8, unsigned int _Count=38)  Line 1086 + 0x1b bytes  C++
    msvcp90.dll!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign(const char * _Ptr=0x084beac8)  Line 1095 + 0x16 bytes  C++
    msvcp90.dll!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> >(const char * _Ptr=0x084beac8)  Line 664   C++
>   GemCore.dll!CGEMCustomMessageService::SendProcessMessage(unsigned short tkt=167, SSECSMSG * mb=0x0607eafc, int nFuncID=4, int * pnClientIds=0x1bf5aff8, int nClientCount=1)  Line 566 + 0x34 bytes  C++
    GemCore.dll!CCustomMessageRouter::PA_ProcessPrimaryMessage(unsigned short tkt=167, SSECSMSG * mb=0x0607eafc, int nFuncID=4, int * pnClientIds=0x1bf5aff8, int nClientCount=1)  Line 54 + 0x1d bytes C++
    PAL.dll!CPALProtocolPlugin::PA_ProcessPrimaryMessage(unsigned short tkt=167, SSECSMSG * mb=0x0607eafc, int nFuncID=4, int * pnClientIds=0x1bf5aff8, int nClientCount=1)  Line 50 + 0x2c bytes   C++
    CustomSECSII_R.dll!CCustomMessageTransportPlugin::ProcessPrmryMsg(char * pBuffer=0x4794cfe0, unsigned long dwBufSize=31, bool bRepExpected=true, unsigned char byStream='', unsigned char byFunction='', unsigned short tkt=167, int nFuncID=4, int * pnClientIds=0x1bf5aff8, int nClientCount=1)  Line 85 + 0x20 bytes C++
    TAL.dll!CMessageHandler::HandleCustomMessage(char * pBuffer=0x4794cfe0, unsigned long dwBufSize=31, bool bRepExpected=true, unsigned long dwTransID=2839, unsigned long dwTransTwoID=0, unsigned char byStream='', unsigned char byFunction='', unsigned char * pHeader=0x478f8ff0, unsigned char byPType=0, int nScanFuncId=-1, int nProcessFuncId=4, std::vector<int,std::allocator<int> > pVecClientId=[1](1))  Line 2949 + 0x4b bytes   C++
    TAL.dll!CMessageHandler::ReceiveMessage(char * pBuffer=0x4794cfe0, unsigned long dwBufSize=31, bool bRepExpected=true, unsigned long dwTransID=2839, unsigned long dwTransTwoID=0, unsigned char byStream='', unsigned char byFunction='', unsigned char * pHeader=0x478f8ff0, unsigned char byPType=0)  Line 1220 + 0x6c bytes C++
    TAL.dll!CTALTransportObject::ReceiveMessage(char * szBuffer=0x4794cfe0, unsigned long dwBufSize=31, bool bRepExpected=true, unsigned long dwSECS1TRID=2839, unsigned long dwSECS2TRID=0, unsigned char byStream='', unsigned char byFunction='', unsigned char * pbyHeader=0x478f8ff0, unsigned char byPType=0)  Line 199 + 0x30 bytes  C++
    HSMS.dll!CDataMessageMngr::RespondToMessage(CMessage * pMessage=0x0607ff28)  Line 392   C++
    HSMS.dll!CLowerRouter::RecieveData()  Line 820  C++
    HSMS.dll!CLowerRouter::RecievingThread(void * pVoid=0x036f9fa0)  Line 566   C++
    kernel32.dll!7c80b729()     
    [Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]

我启用了 pageheap 来检测堆损坏。我还启用了 Run-Time Error Checks /RTCs 来检测堆栈损坏。我无法检测到根本原因。

我该如何继续找出问题的原因?

bool
CGEMCustomMessageService::SendProcessMessage(SECSTICKET tkt, PSECSMSG mb,int nFuncID, int* pnClientIds,int nClientCount)
{
    bool bRetCode = true;
    int nRetCode = 0;
    char chLog[1024] = {0};
    CEALCustomMessagePlugin *pCustomMessagePlugin = CEALCustomMessagePlugin::Instance();
    int nStream   = mb->nStream;
    int nFunction = mb->nFunction;
    int nTicket   = tkt;

        CGEMEqpmntService* pGEMEqpmntService = (CGEMEqpmntService *)CGEMEqpmntService::Instance();
        EQP_CTRL_STATE eControlState = STATE_HOSTOFFLINE;
        sprintf(chLog,"Sending S%d,F%d with ticket[%d]",mb->nStream, mb->nFunction,tkt);
        LogDataMessage(chLog,"CGEMCustomMessageService",Information);

        if (NULL != pCustomMessagePlugin)
        {  

                    GEMCoreLogger::GetLoggerInstance()->LogMessage("Control state is Online remote sending message to client",
                        "CGEMCustomMessageService",Debug);
                    nRetCode = pCustomMessagePlugin->GEMT_ProcessPrimaryMessage(tkt,mb,nFuncID,pnClientIds,nClientCount);

                    GEMCoreLogger::GetLoggerInstance()->LogMessage("Sending message completed successfully",
                        "CGEMCustomMessageService",Information);
        }

    return bRetCode;
}

【问题讨论】:

  • @unapersson:它是一个枚举值。
  • 如果您将堆栈转储粘贴为文本会更好。
  • LogMessage的签名是什么?
  • 启用上述功能后,您是否进行了完全重建(清理/重建)?
  • LogMessage的签名是void LogMessage(const string &crstrLogMessage, const string &crstrSource, LogMessageType logMessageType);

标签: c++ stl windbg


【解决方案1】:

我认为你应该从放弃所有信念开始。

接下来,看看调用堆栈:你所责备的函数调用甚至都不存在。在memcpy_s 之前,一切似乎都很顺利。然后通过询问以下问题返回您的方式:dit memcpy_s 从哪里获取它的参数?谁填的?为什么他们是这样填充的?...

在故障排除中,您将成为一名侦探。怀疑每个人(但从您自己的代码开始:))。谨防偏见,以及诸如“应该”、“认为……”、“永远、永远、永远……”等词语……只寻找确凿的事实。

根据您对系统的了解和通过调试收集的事实,尝试通过推理减少嫌疑人的数量。

(顺便说一下,按照this Visual Studio article 上的提示,加载某些内核 dll 的符号后调用堆栈会变得更有帮助)

如果所有这些都没有帮助,请在 StackOverflow 上询问某人 :)

【讨论】:

  • 小心。并为宇宙第一段 +1。
【解决方案2】:

您是否尝试过在通话中使用此表单:

EMCoreLogger::GetLoggerInstance()->LogMessage( string("发送消息成功完成"), string("CGEMCustomMessageService"), Information);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 2012-02-02
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多