搜索
bottom↓
回复: 10

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

[复制链接]

出0入0汤圆

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

删后代码如下:

  1. #include <stdio.h>
  2. #include <libxml/parser.h>
  3. #include <libxml/tree.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #include <fcntl.h>
  9. #include <sys/wait.h>


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

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

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

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

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

  50.     while(curNode != NULL)
  51.     {
  52.         if(xmlStrcmp(curNode->name,(const xmlChar *)"text"))
  53.         {
  54.             //get_file_information(curNode);
  55.             //printf("%s\n", curNode->name);
  56.             //printf("get_file_information()\n");
  57.         }

  58.         curNode = curNode->next;
  59.     }

  60.     xmlFreeDoc(doc);
  61.     xmlCleanupParser();
  62.     return 0;
  63. }

  64. int main(int argc, char* argv[])
  65. {
  66.     char *szDocName;
  67.     int ret,retval = 0;
  68.     int val, flag = 0;
  69.     int i;

  70.     if (argc <= 1)
  71.     {
  72.         Useage();
  73.         return  -1;
  74.     }

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

  83.     return retval;
  84. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2018-2-13 09:56:59 | 显示全部楼层
Segmentation fault 一般都是和内存有关的错误
用 valgrind 跑一下应该就知道哪里出错了

出0入0汤圆

 楼主| 发表于 2018-2-13 11:10:34 | 显示全部楼层
笑笑我笑了 发表于 2018-2-13 09:56
Segmentation fault 一般都是和内存有关的错误
用 valgrind 跑一下应该就知道哪里出错了
...

gdb可以嘛

出0入0汤圆

发表于 2018-2-13 11:53:57 | 显示全部楼层
gdb调试下看看

出0入0汤圆

发表于 2018-2-13 12:22:33 | 显示全部楼层

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

出0入442汤圆

发表于 2018-2-13 13:55:21 来自手机 | 显示全部楼层
笑笑我笑了 发表于 2018-2-13 12:22
也可以的, gdb会在出错的地方停下来,然后看一下call stack应该就知道原因了。 ...

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

出0入0汤圆

 楼主| 发表于 2018-2-19 22:55:08 来自手机 | 显示全部楼层
wye11083 发表于 2018-2-13 13:55
lz指的应该是gcc编译时崩了。。找个蛋啊。只有称gcc版本继续试验。

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

出0入0汤圆

 楼主| 发表于 2018-2-24 15:18:18 | 显示全部楼层
在ubuntu上使用以上代码是没有问题的,i.mx6核心板上跑不行

出0入0汤圆

发表于 2018-2-24 16:04:23 | 显示全部楼层
qingyin2009 发表于 2018-2-24 15:18
在ubuntu上使用以上代码是没有问题的,i.mx6核心板上跑不行

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

出0入0汤圆

发表于 2018-2-24 16:05:12 | 显示全部楼层
笑笑我笑了 发表于 2018-2-13 09:56
Segmentation fault 一般都是和内存有关的错误
用 valgrind 跑一下应该就知道哪里出错了
...

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

出0入0汤圆

发表于 2018-2-24 18:59:58 | 显示全部楼层
ALUMEI 发表于 2018-2-24 16:05
老哥,跑valgrind  最小需要多大的内存?

我以为是在PC上啊,没想到在i.mx6上啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 08:53

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表