这几天在用minilzo测试压缩算法的使用,结果出现了一大堆问题。在讲这些问题之前我先说下minilzo。minilzo是一个轻量级的LZO库的子集。minilzo是一个可靠的用于数据实时解压缩的程序库。miniLZO实现了LZO1X压缩和两个标准和安全LZO1X的解压缩。除了您要使用的预压缩的数据文件的情况下,它也可用于快速压缩。具体的使用可以访问http://edsionte.com/techblog/archives/4073或者 下载minilzo包后参考README,那里有使用指南。
接下来进入主题。代码写好运行后出现了段错误。大家都知道,段错误的出现是因为地址访问出现了错误,这里可以使用GDB进行调试。linux里面有个core文件,专门记录了程序出错时的相关记录。这时你就可以进行gdb调试,调试的时候注意gcc时一定要加-g选项,然后gdb xxx(编译的可执行文件) core,这个执行之后可能没有相关错误记录,因为在linux里面对于core默认没有分配空间,以免增加内存耗费,这时你就需要$ulimit -c 100给其分配空间,然后要产生core,运行$./xxx就产生了core。再接着执行$gcc -g -o xxx xxx.x $gdb xxx core.比如gdb compress core
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<
Reading symbols from /home/yuyunchao/code/compress/compress...done.
warning: exec file is newer than core file.
[New Thread 7709]
warning: Can't read pathname for load map: 输入/输出错误.
Reading symbols from /lib/i386-linux-gnu/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/i386-linux-gnu/libc.so.6
Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/ld-linux.so.2
Core was generated by `./compress'.
Program terminated with signal 11, Segmentation fault.
#0 0x08049253 in lzo1x_1_compress_core (in=0x9427008 "", in_len=13824,
out=0x0, out_len=0xbfdde830, ti=0, wrkmem=0x804c080) at minilzo.c:3260
3260 *op++ = LZO_BYTE(t - 3);
(gdb)
通过上面就可以定位到错误,这里的错误发生在 lzo1x_1_compress()这个函数这里。我又仔细看了下 lzo1x_1_compress(),它里面的第一和第三个参数要预先分配空间,这个我没有分配空间所以就出现了段错误。
以上问题解决后我又遇到write:bad file descriptor这样的错误,我之前认为write很简单了,怎么会出错?使用write前要open()一下,问题就出现在open,我open时没有赋值执行权限,所以就造成以上问题。
注意:open是要注意两个权限,一个是你使用open创建文件时的第三个参数,这个权限仅仅是创建文件的权限,真正执行的权限在第二个参数哪里。open使用情况可以man 2 open查看。
阅读(12862) | 评论(0) | 转发(0) |