【问题标题】:C++ Segmentation Fault - tinyXMLC++ 分段错误 - tinyXML
【发布时间】:2014-10-15 12:15:51
【问题描述】:

当我尝试执行我的代码时遇到分段错误,它编译时没有错误/警告,但在执行时给出错误Segmentation fault。下面是sn-p的代码。

XMLElement *pStartTimeStamp = pRoot->FirstChildElement("mobileDevice")->FirstChildElement("RealTimeInformation");
XMLElement *pRealtimeStore = nullptr;
XMLElement *pIter0 = pStartTimeStamp->FirstChildElement("RunID");
while (pIter0 != nullptr) {
    pRealtimeStore = pIter0;
    pIter0 = pIter0->NextSiblingElement("startTimeStamp");
}

if (pRealtimeStore != nullptr) {
    XMLElement *pNewStartTimeStamp = doc.NewElement("startTimeStamp");
    pNewStartTimeStamp->SetText("pNewTimeStamp");
    pStartTimeStamp->InsertAfterChild(pRealtimeStore, pNewStartTimeStamp);

}

编辑: 我尝试运行gdb,但结果是

Program received signal SIGSEGV, Segmentation fault.
0x0000000000402ada in tinyxml2::XMLNode::FirstChildElement (this=0x0, value=0x408dd8 "RunID") at tinyxml2.cpp:745
745     for( XMLNode* node=_firstChild; node; node=node->_next ) {

当单步执行代码时,它在这一行失败:

20      XMLElement *pIter0 = pStartTimeStamp->FirstChildElement("runID");
(gdb) next

Program received signal SIGSEGV, Segmentation fault.
0x0000000000402ada in tinyxml2::XMLNode::FirstChildElement (this=0x0, value=0x408dd8 "runID") at tinyxml2.cpp:745
745     for( XMLNode* node=_firstChild; node; node=node->_next ) {

XML sn-p

<mobileDevice>
        <mDeviceID></mDeviceID>
        <deviceDescription></deviceDescription>
        <units></units>
        <devicePlacement></devicePlacement>
        <quantisationResolution></quantisationResolution>
        <realTimeInformation>
            <runID/>
            <sampleRate/>
            <startTimeStamp/>
            <endTimeStamp/>
            <data/>
        </realTimeInformation>
        <event>
            <mEventID/>
            <timeStamp/>
            <data/>
            <support/>
        </event>
    </mobileDevice>

【问题讨论】:

  • 哪一行导致分段错误?使用调试器找到它
  • 我尝试运行gdb,但导致错误no debugging symbols found
  • 那么你可能已经构建了没有-g标志的代码,这是gdb所必需的
  • 使用-g 重建输出存在问题。
  • 然后测试每个指针是否为 nullptr。但它很可能是 pStartTimeStamp。

标签: c++ linux segmentation-fault tinyxml


【解决方案1】:

下面这行好像返回了一个null

XMLElement *pStartTimeStamp = pRoot->FirstChildElement("mobileDevice")->FirstChildElement("RealTimeInformation");

gdb 输出表明“this”指针为空,这一点很明显。

【讨论】:

  • this=0x0 指的是这个吗?
  • 是的,该方法被调用,但只要该方法尝试访问成员,它就会遇到段冲突。
  • 另外,如果您添加要解析的 XML 文件 sn-p 可能会有所帮助。
  • ("realTimeInformation") 中有一个拼写错误,rR... 抱歉。
  • 好的,我认为问题在于您的 XML 中有“realTimeInformation”,它以小写字母开头,而您的代码中有“RealTimeInformation”,它以大写字母开头。
【解决方案2】:

我敢打赌其中一个是空的:

 pRoot
 pRoot->FirstChildElement("mobileDevice")
 pStartTimeStamp
 pNewStartTimeStamp

那么,如果你追踪一些东西来找出是哪一个呢。

【讨论】:

  • gdb 输出更新问题
  • 所以 pStartTime 为空,因为在 mobileDevice 下找不到 RealTimeInformation。我想?
  • ("realTimeInformation") r 是 R 中有一个拼写错误...抱歉。
  • 但真正幸福的结局是,现在您正在使用调试器。
  • 确实,我是第一次使用gdb,以后会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多