qingyin2009 发表于 2018-2-13 09:40:09

linux编译一个xml应用的时候,总是Segmentation fault

原来有xml读取功能,是可以编译通过的
我把里面跟具体应用有关的删除了,只留下解析部分,这个时候也是可以编译通过的
但是我在里面只要加上代码,就莫名其妙的出现 段错误,甚至printf都不行,反反复复试了很多次,除了从原来代码删,不加任何东西,只要加就会出错

删后代码如下:

#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>


static void Useage(void)
{
    printf("command is not right, please try agin\n");
    printf("Useage: ./xml_prog_tool <xxx.xml>\n");
}

/* how to compile this xml resolver? useing command:
*arm-none-linux-gnueabi-gcc -o tool_xml tool_xml.c -lxml2 -I /usr/include/libxml2-L -lz -lm
*/
static int xml_parse(char *szDocName)
{
    xmlDocPtr doc;         //定义解析文档指针
    xmlNodePtr curNode;      //定义结点指针(你需要它为了在各个结点间移动)xmlNodePtr
    xmlChar *szKey;          //临时字符串变量
    xmlNodePtr propNodePtr;

    doc = xmlReadFile(szDocName,"UTF-8",        XML_PARSE_RECOVER); //以GB2312的编码方式读入解析文件
    //检查解析文档是否成功,如果不成功,libxml将指一个注册的错误并停止。
    //一个常见错误是不适当的编码。XML标准文档除了用UTF-8或UTF-16外还可用其它编码保存。
    //如果文档是这样,libxml将自动地为你转换到UTF-8。更多关于XML编码信息包含在XML标准中.
    if (NULL == doc)
    {
      fprintf(stderr,"xxx.xml is not parsed successfully. \n");
      return -1;
    }

    curNode = xmlDocGetRootElement(doc); //确定文档根元素
    /*检查确认当前文档中包含内容*/
    if(NULL == curNode)
    {
      fprintf(stderr,"the document is empty.\n");
      xmlFreeDoc(doc);
      return -1;
    }
    /* 我们需要确认文档是正确的类型。“PROG”是在这个烧写中使用文档的根类型。*/
    if (xmlStrcmp(curNode->name,BAD_CAST"PROG"))
    {
      fprintf(stderr,"document of the wrong type, root_node is not PROG\n");
      xmlFreeDoc(doc);
      return -1;
    }

    curNode = curNode->xmlChildrenNode;   // curNode目前等于根目录的第一个子目录
    propNodePtr = curNode;                                        // 由于空格,现在这个节点是名为text的节点

    while(curNode != NULL)
    {
      if(xmlStrcmp(curNode->name,(const xmlChar *)"text"))
      {
            //get_file_information(curNode);
            //printf("%s\n", curNode->name);
            //printf("get_file_information()\n");
      }

      curNode = curNode->next;
    }

    xmlFreeDoc(doc);
    xmlCleanupParser();
    return 0;
}

int main(int argc, char* argv[])
{
    char *szDocName;
    int ret,retval = 0;
    int val, flag = 0;
    int i;

    if (argc <= 1)
    {
      Useage();
      return-1;
    }

    /* 1. parse xml */
    szDocName = argv;
    ret = xml_parse(szDocName);   // 解析xml文件,并把结果保存到全局结构体中
    if(ret)
    {
      printf("parse xml file failed!!!\n");
      return -1;
    }

    return retval;
}

笑笑我笑了 发表于 2018-2-13 09:56:59

Segmentation fault 一般都是和内存有关的错误
用 valgrind 跑一下应该就知道哪里出错了

qingyin2009 发表于 2018-2-13 11:10:34

笑笑我笑了 发表于 2018-2-13 09:56
Segmentation fault 一般都是和内存有关的错误
用 valgrind 跑一下应该就知道哪里出错了
...

gdb可以嘛

kelp 发表于 2018-2-13 11:53:57

gdb调试下看看

笑笑我笑了 发表于 2018-2-13 12:22:33

qingyin2009 发表于 2018-2-13 11:10
gdb可以嘛

也可以的, gdb会在出错的地方停下来,然后看一下call stack应该就知道原因了。

wye11083 发表于 2018-2-13 13:55:21

笑笑我笑了 发表于 2018-2-13 12:22
也可以的, gdb会在出错的地方停下来,然后看一下call stack应该就知道原因了。 ...

lz指的应该是gcc编译时崩了。。找个蛋啊。只有称gcc版本继续试验。

qingyin2009 发表于 2018-2-19 22:55:08

wye11083 发表于 2018-2-13 13:55
lz指的应该是gcc编译时崩了。。找个蛋啊。只有称gcc版本继续试验。

不是gcc,是嵌入式交叉编译器,编译没有问题,运行出的问题,跟进去没用

qingyin2009 发表于 2018-2-24 15:18:18

在ubuntu上使用以上代码是没有问题的,i.mx6核心板上跑不行

ALUMEI 发表于 2018-2-24 16:04:23

qingyin2009 发表于 2018-2-24 15:18
在ubuntu上使用以上代码是没有问题的,i.mx6核心板上跑不行

跟平台有关系,那gdb 应该可以捕捉到一些信息的啊

ALUMEI 发表于 2018-2-24 16:05:12

笑笑我笑了 发表于 2018-2-13 09:56
Segmentation fault 一般都是和内存有关的错误
用 valgrind 跑一下应该就知道哪里出错了
...

老哥,跑valgrind最小需要多大的内存?

笑笑我笑了 发表于 2018-2-24 18:59:58

ALUMEI 发表于 2018-2-24 16:05
老哥,跑valgrind最小需要多大的内存?

我以为是在PC上啊,没想到在i.mx6上啊
页: [1]
查看完整版本: linux编译一个xml应用的时候,总是Segmentation fault