(OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—2—段错误
来源:互联网 发布:php warning 编辑:程序博客网 时间:2024/05/13 21:30
具体代码差异,参考:http://blog.chinaunix.net/uid-14735472-id-5212202.html
----------------------接着调试,调试到此处,出现如下问题 (段错误)
at /opt/cBPM-android/criteria-lin/src/Criteria/Criteria.WorkflowEngine/DataBase/DataBaseHelper.cpp:236236 CM_TRACE_CODEPATH("Process [" << acWorkflowName << "] retrieved. [" << workflow->getProcessId() << "]")
Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
(gdb)
是因为Connection Nr[0]
具体错误(在Executor-7033-20150407-163826.trace文件中)
10:39:39.550-1073824092- DataBaseHelper::open-INFO-DataBaseHelper.cpp[106]-Connection Nr[0]
应该为
16:38:26.424--134334400- DataBaseHelper::open-INFO-DataBaseHelper.cpp[106]-Connection Nr[1]
0:45:44.772--134334400- DataBaseHelper::open-INFO-DataBaseHelper.cpp[106]-Connection Nr[1]
20:45:44.772--134334400- DataBaseHelper::open-INFO-DataBaseHelper.cpp[171]-Analysing FileSsystem Connection
因为[106]出了问题,所以[171]没有执行,即,[111]行的 for 循环的 循环体 没有执行。
下面调试,找问题
(gdb) break DataBaseHelper.cpp:236
(gdb) break DataBaseHelper.cpp:109
--------------使用如下断点找问题
break DataBaseHelper.cpp:102
break bOSXMLFile.cpp:52
break bOSCollection.cpp:37
break bOSCollection.cpp:44
break bOSXMLFile.cpp:59
break DataBaseHelper.cpp:104
break bOSXMLObject.cpp:73 //初始化 vConnections 的 地方
break bOSXMLObject.cpp:89 //初始化 vConnections 的 地方,是虚函数,因此,执行时 定位 实际函数
// at /opt/cBPM-android/criteria-lin/src/Criteria/Criteria.WorkflowEngine/DataBase/DataBase.cpp:27
-----------------------找到了故障点 DataBase.cpp:27
if ( strcmp(node->getName(),XMLConnections::MAIN_NODE.c_str()) == 0 )
----------函数strcmp的 两个 参数 不同:"C" 和 "Connections"
_M_data = 0x5f6510 "C"
_M_data = 0x5813f8 <DataManager::Panorama::DataBase::XMLConnections::MAIN_NODE> "Connections"}
----------下面查找,第一个参数 为什么 是"C"
break bOSXMLNode.cpp:223 //void XMLNode::setName( const char* acName )
break setName
break bOSXMLHelper.cpp:157
break bOSXMLHelper.cpp:170
break XMLString.cpp:600
break IconvTransService.cpp:451
先设置断点
break bOSXMLHelper.cpp:170
执行后,再设置断点
break IconvTransService.cpp:529
break IconvTransService.cpp:569
//终于找到故障点: 文件 IconvTransService.cpp:451
size_t len = ::wcsrtombs(resultString + dstCursor, &src, resultSize - dstCursor, &st);
//Android中,wcsrtombs 有问题,所以 替换之
//修改如下文件:
/opt/cBPM-android/xerces-c-3.1.2/src/xercesc/util/Transcoders/Iconv/IconvTransService.cpp
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *//* * $Id: IconvTransService.cpp 695885 2008-09-16 14:00:19Z borisk $ */// ---------------------------------------------------------------------------// Includes// ---------------------------------------------------------------------------#if HAVE_CONFIG_H# include <config.h>#endif#if HAVE_WCHAR_H# include <wchar.h>#endif#if HAVE_WCTYPE_H# include <wctype.h>#endif// Fill in for broken or missing wctype functions on some platforms#if !HAVE_TOWUPPER# include <towupper.h>#endif#if !HAVE_TOWLOWER# include <towlower.h>#endif#include <string.h>#include <stdlib.h>#include <stdio.h>#include "IconvTransService.hpp"#include <xercesc/util/XMLUniDefs.hpp>#include <xercesc/util/XMLUni.hpp>#include <xercesc/framework/MemoryManager.hpp>#include <errno.h>XERCES_CPP_NAMESPACE_BEGIN// ---------------------------------------------------------------------------// Local, const data// ---------------------------------------------------------------------------static const int gTempBuffArraySize = 1024;static const XMLCh gMyServiceId[] ={ chLatin_I, chLatin_C, chLatin_o, chLatin_n, chLatin_v, chNull};// ---------------------------------------------------------------------------// the following is defined by 'man mbrtowc':// ---------------------------------------------------------------------------static const size_t TRANSCODING_ERROR = (size_t)(-1);// ---------------------------------------------------------------------------// Local methods// ---------------------------------------------------------------------------static unsigned int getWideCharLength(const XMLCh* const src){ if (!src) return 0; unsigned int len = 0; const XMLCh* pTmp = src; while (*pTmp++) len++; return len;}size_t l_wcrtomb(char *s, wchar_t wc, mbstate_t *ps){ if (!s) return 1; if ((unsigned)wc < 0x80) { *s = wc; return 1; } else if ((unsigned)wc < 0x800) { *s++ = 0xc0 | (wc>>6); *s = 0x80 | (wc&0x3f); return 2; } else if ((unsigned)wc < 0xd800 || (unsigned)wc-0xe000 < 0x2000) { *s++ = 0xe0 | (wc>>12); *s++ = 0x80 | ((wc>>6)&0x3f); *s = 0x80 | (wc&0x3f); return 3; } else if ((unsigned)wc-0x10000 < 0x100000) { *s++ = 0xf0 | (wc>>18); *s++ = 0x80 | ((wc>>12)&0x3f); *s++ = 0x80 | ((wc>>6)&0x3f); *s = 0x80 | (wc&0x3f); return 4; } errno = EILSEQ; return -1;}size_t l_wcsrtombs(char *s, const wchar_t **ws, size_t n, mbstate_t *st){ const wchar_t *ws2; char buf[4]; size_t N = n, l; if (!s) { for (n=0, ws2=*ws; *ws2; ws2++) { if (*ws2 >= 0x80u) { l = l_wcrtomb(buf, *ws2, 0); if (!(l+1)) return -1; n += l; } else n++; } return n; } while (n>=4) { if (**ws-1u >= 0x7fu) { if (!**ws) { *s = 0; *ws = 0; return N-n; } l = l_wcrtomb(s, **ws, 0); if (!(l+1)) return -1; s += l; n -= l; } else { *s++ = **ws; n--; } (*ws)++; } while (n) { if (**ws-1u >= 0x7fu) { if (!**ws) { *s = 0; *ws = 0; return N-n; } l = l_wcrtomb(buf, **ws, 0); if (!(l+1)) return -1; if (l>n) return N-n; l_wcrtomb(s, **ws, 0); s += l; n -= l; } else { *s++ = **ws; n--; } (*ws)++; } return N;}// ---------------------------------------------------------------------------// IconvTransService: Constructors and Destructor// ---------------------------------------------------------------------------IconvTransService::IconvTransService(MemoryManager* /* manager */){}IconvTransService::~IconvTransService(){}// ---------------------------------------------------------------------------// IconvTransService: The virtual transcoding service API// ---------------------------------------------------------------------------int IconvTransService::compareIString( const XMLCh* const comp1 , const XMLCh* const comp2){ const XMLCh* cptr1 = comp1; const XMLCh* cptr2 = comp2; while ( (*cptr1 != 0) && (*cptr2 != 0) ) { wint_t wch1 = towupper(*cptr1); wint_t wch2 = towupper(*cptr2); if (wch1 != wch2) break; cptr1++; cptr2++; } return (int) ( towupper(*cptr1) - towupper(*cptr2) );}int IconvTransService::compareNIString( const XMLCh* const comp1 , const XMLCh* const comp2 , const XMLSize_t maxChars){ unsigned int n = 0; const XMLCh* cptr1 = comp1; const XMLCh* cptr2 = comp2; while (true && maxChars) { wint_t wch1 = towupper(*cptr1); wint_t wch2 = towupper(*cptr2); if (wch1 != wch2) return (int) (wch1 - wch2); // If either ended, then both ended, so equal if (!*cptr1 || !*cptr2) break; cptr1++; cptr2++; // Bump the count of chars done. If it equals the count then we // are equal for the requested count, so break out and return // equal. n++; if (n == maxChars) break; } return 0;}const XMLCh* IconvTransService::getId() const{ return gMyServiceId;}XMLLCPTranscoder* IconvTransService::makeNewLCPTranscoder(MemoryManager* manager){ // Just allocate a new transcoder of our type return new (manager) IconvLCPTranscoder;}bool IconvTransService::supportsSrcOfs() const{ return true;}// ---------------------------------------------------------------------------// IconvTransService: The protected virtual transcoding service API// ---------------------------------------------------------------------------XMLTranscoder*IconvTransService::makeNewXMLTranscoder(const XMLCh* const , XMLTransService::Codes& resValue , const XMLSize_t , MemoryManager* const){ // // NOTE: We don't use the block size here // // This is a minimalist transcoding service, that only supports a local // default transcoder. All named encodings return zero as a failure, // which means that only the intrinsic encodings supported by the parser // itself will work for XML data. // resValue = XMLTransService::UnsupportedEncoding; return 0;}void IconvTransService::upperCase(XMLCh* const toUpperCase){ XMLCh* outPtr = toUpperCase; while (*outPtr) { *outPtr = towupper(*outPtr); outPtr++; }}void IconvTransService::lowerCase(XMLCh* const toLowerCase){ XMLCh* outPtr = toLowerCase; while (*outPtr) { *outPtr = towlower(*outPtr); outPtr++; }}// ---------------------------------------------------------------------------// IconvLCPTranscoder: The virtual transcoder API// ---------------------------------------------------------------------------XMLSize_t IconvLCPTranscoder::calcRequiredSize(const char* const srcText , MemoryManager* const){ if (!srcText) return 0; XMLSize_t len = 0; const char *src = srcText;#if HAVE_MBRLEN mbstate_t st; memset(&st, 0, sizeof(st));#endif for ( ; *src; ++len) {#if HAVE_MBRLEN int l=::mbrlen( src, MB_CUR_MAX, &st );#else int l=::mblen( src, MB_CUR_MAX );#endif if( l == TRANSCODING_ERROR ) return 0; src += l; } return len;}XMLSize_t IconvLCPTranscoder::calcRequiredSize(const XMLCh* const srcText , MemoryManager* const manager){ if (!srcText) return 0; XMLSize_t wLent = getWideCharLength(srcText); wchar_t tmpWideCharArr[gTempBuffArraySize]; wchar_t* allocatedArray = 0; wchar_t* wideCharBuf = 0; if (wLent >= gTempBuffArraySize) wideCharBuf = allocatedArray = (wchar_t*) manager->allocate ( (wLent + 1) * sizeof(wchar_t) );//new wchar_t[wLent + 1]; else wideCharBuf = tmpWideCharArr; for (XMLSize_t i = 0; i < wLent; i++) { wideCharBuf[i] = srcText[i]; } wideCharBuf[wLent] = 0x00; const XMLSize_t retVal = ::wcstombs(NULL, wideCharBuf, 0); if (allocatedArray) manager->deallocate(allocatedArray); if (retVal == ~0) return 0; return retVal;}bool IconvLCPTranscoder::transcode( const XMLCh* const toTranscode , char* const toFill , const XMLSize_t maxBytes , MemoryManager* const manager){ // Watch for a couple of pyscho corner cases if (!toTranscode || !maxBytes) { toFill[0] = 0; return true; } if (!*toTranscode) { toFill[0] = 0; return true; } unsigned int wLent = getWideCharLength(toTranscode); wchar_t tmpWideCharArr[gTempBuffArraySize]; wchar_t* allocatedArray = 0; wchar_t* wideCharBuf = 0; if (wLent > maxBytes) { wLent = maxBytes; } if (maxBytes >= gTempBuffArraySize) { wideCharBuf = allocatedArray = (wchar_t*) manager->allocate ( (maxBytes + 1) * sizeof(wchar_t) );//new wchar_t[maxBytes + 1]; } else wideCharBuf = tmpWideCharArr; for (unsigned int i = 0; i < wLent; i++) { wideCharBuf[i] = toTranscode[i]; } wideCharBuf[wLent] = 0x00; // Ok, go ahead and try the transcoding. If it fails, then ... size_t mblen = ::wcstombs(toFill, wideCharBuf, maxBytes); if (mblen == (size_t)-1) { if (allocatedArray) manager->deallocate(allocatedArray); return false; } // Cap it off just in case toFill[mblen] = 0; if (allocatedArray) manager->deallocate(allocatedArray); return true;}bool IconvLCPTranscoder::transcode( const char* const toTranscode , XMLCh* const toFill , const XMLSize_t maxChars , MemoryManager* const manager){ // Check for a couple of psycho corner cases if (!toTranscode || !maxChars) { toFill[0] = 0; return true; } if (!*toTranscode) { toFill[0] = 0; return true; } XMLSize_t len = calcRequiredSize(toTranscode); wchar_t tmpWideCharArr[gTempBuffArraySize]; wchar_t* allocatedArray = 0; wchar_t* wideCharBuf = 0; if (len > maxChars) { len = maxChars; } if (maxChars >= gTempBuffArraySize) wideCharBuf = allocatedArray = (wchar_t*) manager->allocate ( (maxChars + 1) * sizeof(wchar_t) );//new wchar_t[maxChars + 1]; else wideCharBuf = tmpWideCharArr; if (::mbstowcs(wideCharBuf, toTranscode, maxChars) == (size_t)-1) { if (allocatedArray) manager->deallocate(allocatedArray); return false; } for (XMLSize_t i = 0; i < len; i++) { toFill[i] = (XMLCh) wideCharBuf[i]; } toFill[len] = 0x00; if (allocatedArray) manager->deallocate(allocatedArray); return true;}template <typename T>void reallocString(T *&ref, size_t &size, MemoryManager* const manager, bool releaseOld){ T *tmp = (T*)manager->allocate(2 * size * sizeof(T)); memcpy(tmp, ref, size * sizeof(T)); if (releaseOld) manager->deallocate(ref); ref = tmp; size *= 2;}char* IconvLCPTranscoder::transcode(const XMLCh* const toTranscode, MemoryManager* const manager){ if (!toTranscode) return 0; size_t srcCursor = 0, dstCursor = 0; size_t resultSize = gTempBuffArraySize; char localBuffer[gTempBuffArraySize]; char* resultString = localBuffer;#if HAVE_WCSRTOMBS mbstate_t st; memset((void*)&st, 0, sizeof(st)); // Reset to initial shift state wchar_t srcBuffer[gTempBuffArraySize]; srcBuffer[gTempBuffArraySize - 1] = 0; const wchar_t *src = 0;// while (toTranscode[srcCursor] || src) while (toTranscode[srcCursor]) { if (src == 0) // copy a piece of the source string into a local // buffer, converted to wchar_t and NULL-terminated. // after that, src points to the beginning of the // local buffer and is used for the call to ::wcsrtombs { size_t i; for (i=0; i<gTempBuffArraySize-1; ++i) { srcBuffer[i] = toTranscode[srcCursor]; if (srcBuffer[i] == '\0') break; ++srcCursor; } src = srcBuffer; } size_t len = l_wcsrtombs(resultString + dstCursor, &src, resultSize - dstCursor, &st);// size_t len = ::wcsrtombs(resultString + dstCursor, &src, resultSize - dstCursor, &st); if (len == TRANSCODING_ERROR) { dstCursor = 0; break; } dstCursor += len;// if (src != 0) // conversion not finished. This *always* means there // was not enough room in the destination buffer. if (len == (resultSize - dstCursor)) { reallocString<char>(resultString, resultSize, manager, resultString != localBuffer); } }#else while (toTranscode[srcCursor]) { char mbBuf[16]; // MB_CUR_MAX is not defined as a constant on some platforms int len = wctomb(mbBuf, toTranscode[srcCursor++]); if (len < 0) { dstCursor = 0; break; } if (dstCursor + len >= resultSize - 1) reallocString<char>(resultString, resultSize, manager, resultString != localBuffer); for (int j=0; j<len; ++j) resultString[dstCursor++] = mbBuf[j]; }#endif if (resultString == localBuffer) { resultString = (char*)manager->allocate((dstCursor + 1) * sizeof(char)); memcpy(resultString, localBuffer, dstCursor * sizeof(char)); } resultString[dstCursor] = '\0'; return resultString;}XMLCh* IconvLCPTranscoder::transcode(const char* const toTranscode, MemoryManager* const manager){ if (!toTranscode) return 0; size_t resultSize = gTempBuffArraySize; size_t srcCursor = 0, dstCursor = 0;#if HAVE_MBSRTOWCS wchar_t localBuffer[gTempBuffArraySize]; wchar_t *tmpString = localBuffer; mbstate_t st; memset(&st, 0, sizeof(st)); const char *src = toTranscode; while(true) { size_t len = ::mbsrtowcs(tmpString + dstCursor, &src, resultSize - dstCursor, &st); if (len == TRANSCODING_ERROR) { dstCursor = 0; break; } dstCursor += len;// if (src == 0) // conversion finished if ((len >= 0) && (len < (resultSize - dstCursor))) break;// if (dstCursor >= resultSize - 1) if (len == (resultSize - dstCursor)) reallocString<wchar_t>(tmpString, resultSize, manager, tmpString != localBuffer); } // make a final copy, converting from wchar_t to XMLCh: XMLCh* resultString = (XMLCh*)manager->allocate((dstCursor + 1) * sizeof(XMLCh)); size_t i; for (i=0; i<dstCursor; ++i) resultString[i] = tmpString[i]; if (tmpString != localBuffer) // did we allocate something? manager->deallocate(tmpString);#else XMLCh localBuffer[gTempBuffArraySize]; XMLCh* resultString = localBuffer; size_t srcLen = strlen(toTranscode); while(srcLen > srcCursor) { wchar_t wcBuf[1]; int len = mbtowc(wcBuf, toTranscode + srcCursor, srcLen - srcCursor); if (len <= 0) { if (len < 0) dstCursor = 0; break; } srcCursor += len; if (dstCursor + 1 >= resultSize - 1) reallocString<XMLCh>(resultString, resultSize, manager, resultString != localBuffer); resultString[dstCursor++] = wcBuf[0]; } if (resultString == localBuffer) { resultString = (XMLCh*)manager->allocate((dstCursor + 1) * sizeof(XMLCh)); memcpy(resultString, localBuffer, dstCursor * sizeof(XMLCh)); }#endif resultString[dstCursor] = L'\0'; return resultString;}// ---------------------------------------------------------------------------// IconvLCPTranscoder: Constructors and Destructor// ---------------------------------------------------------------------------IconvLCPTranscoder::IconvLCPTranscoder(){}IconvLCPTranscoder::~IconvLCPTranscoder(){}XERCES_CPP_NAMESPACE_END
0 0
- (OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—2—段错误
- (OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—2—段错误
- (OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—3—段错误
- (OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—4—段错误
- (OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—3—段错误
- (OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—4—段错误
- (OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—5—process指向错误地址
- OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—5—process指向错误地址
- (OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—完整的调试过程—成功
- (OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—完整的调试过程—成功
- (OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—1—手机死机
- (OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—1—手机死机
- (OK) 编译cBPM—CentOS7—gdb—gdbserver—成功—调试
- (OK) 编译cBPM—CentOS7—gdb—gdbserver—成功—调试
- (OK) 运行cBPM—CentOS7
- (OK) 运行cBPM—CentOS7
- (OK) 运行cBPM—Fedora23
- (OK) 运行cBPM—Fedora23
- C Primer Plus 第12章 存储类、链接和内存管理
- HDOJ 1005-Number Sequence【规律】
- multimap自定义结构体
- Android ProgressDialog进度条 等待条
- Java四种线程池的使用
- (OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—2—段错误
- python中文乱码
- OSI七层网络模型极其协议
- 各种排序算法总结(C++实现)
- Date类型
- Android 开发Ubuntu下 adt 手机连接开发
- 继承与this关键字
- gcc、make、makefile、cmake、cmakelists区别
- 【技巧】UITableView 在UITableViewStylePlain模型下,取消headerView的黏结性,不浮动