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;
}
Segmentation fault 一般都是和内存有关的错误
用 valgrind 跑一下应该就知道哪里出错了
笑笑我笑了 发表于 2018-2-13 09:56
Segmentation fault 一般都是和内存有关的错误
用 valgrind 跑一下应该就知道哪里出错了
...
gdb可以嘛 gdb调试下看看 qingyin2009 发表于 2018-2-13 11:10
gdb可以嘛
也可以的, gdb会在出错的地方停下来,然后看一下call stack应该就知道原因了。 笑笑我笑了 发表于 2018-2-13 12:22
也可以的, gdb会在出错的地方停下来,然后看一下call stack应该就知道原因了。 ...
lz指的应该是gcc编译时崩了。。找个蛋啊。只有称gcc版本继续试验。 wye11083 发表于 2018-2-13 13:55
lz指的应该是gcc编译时崩了。。找个蛋啊。只有称gcc版本继续试验。
不是gcc,是嵌入式交叉编译器,编译没有问题,运行出的问题,跟进去没用 在ubuntu上使用以上代码是没有问题的,i.mx6核心板上跑不行 qingyin2009 发表于 2018-2-24 15:18
在ubuntu上使用以上代码是没有问题的,i.mx6核心板上跑不行
跟平台有关系,那gdb 应该可以捕捉到一些信息的啊 笑笑我笑了 发表于 2018-2-13 09:56
Segmentation fault 一般都是和内存有关的错误
用 valgrind 跑一下应该就知道哪里出错了
...
老哥,跑valgrind最小需要多大的内存? ALUMEI 发表于 2018-2-24 16:05
老哥,跑valgrind最小需要多大的内存?
我以为是在PC上啊,没想到在i.mx6上啊
页:
[1]