#c #stl #windbg
#c #stl #windbg
Вопрос:
Я получаю сбой приложения в двух местах моего приложения. Одним из местоположений является следующая инструкция метода, приведенная ниже. Сбой приложения при создании объекта stl string для передачи строки в метод LogMessage.
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 для обнаружения повреждения кучи. Я также включил проверки ошибок во время выполнения / 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;
}
Комментарии:
1. @unapersson: Это значение перечисления.
2. Было бы лучше, если бы вы вставили дамп стека в виде текста.
3. Что такое сигнатура
LogMessage
?4. Выполнили ли вы полную перестройку (clean / rebuild) после включения вышеуказанных функций?
5. Сигнатурой LogMessage является void LogMessage (const string amp;crstrLogMessage, const string amp;crstrSource, LogMessageType logMessageType).;
Ответ №1:
Я думаю, вам следует начать с отказа от всех своих убеждений.
Далее, загляните в стек вызовов: вызова функции, который вы обвиняете, там даже нет. Кажется, все идет хорошо вплоть до memcpy_s
. Затем пройдите обратный путь, задавая вопросы типа: откуда вы memcpy_s
берете его параметры? Кто их заполнил? Почему они были заполнены таким образом?…
При устранении неполадок вы становитесь детективом. Подозревайте всех (но начните со своего собственного кода :)). Остерегайтесь предрассудков и таких слов, как «должен», «думаю, что …», «никогда, никогда, никогда …» и т.д… Используйте только неопровержимые факты.
Попытайтесь уменьшить количество подозреваемых путем рассуждений, основанных на ваших знаниях о системе и на фактах, которые вы собираете в процессе отладки.
(кстати, стек вызовов может стать более полезным после загрузки символов для некоторых библиотек DLL ядра, следуя советам из этой статьи Visual Studio)
И если все это не поможет, спросите кого-нибудь в StackOverflow 🙂
Комментарии:
1. Осторожно. И 1 для этого космического первого абзаца.
Ответ №2:
Вы пробовали использовать эту форму в вызове:
EMCoreLogger::GetLoggerInstance()->LogMessage( строка ("Отправка сообщения успешно завершена"), строка ("CGEMCustomMessageService"), Информация);