Chinaunix首页 | 论坛 | 博客
  • 博客访问: 514736
  • 博文数量: 13
  • 博客积分: 6011
  • 博客等级: 准将
  • 技术积分: 990
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-09 09:57
文章分类

全部博文(13)

文章存档

2009年(10)

2008年(3)

我的朋友

分类: LINUX

2009-05-05 09:58:55

一个月的时间,就为了解决一个问题,段错误
 
 
运行环境:arm-linux
模块:XML,为多线程,多socket的网络通信协议程序
现象:XML在运行一段时间以后,出现段错误,运行的时间和出现问题的地方都不一样;
 
解决的过程:
1、仔细检查了所有的动态申请内存和释放的地方;
2、将所有的strcpy改为strncpy,sprintf改为snprintf;
3、检查了所有的数组的边界问题;
4、将所有多线程互用的全局变量用互斥保护起来;
5、检查所有的多线程互用的函数,发现了三个不安全的函数,将strerrno改为strerror_r,gmtime改为gmtime_r, gethostbyname改为gethostbyname_r;
至此,还是崩掉。欲哭无泪
6、最后的原因:XML为一个多线程进程,多线程都会调用一个共享库函数,该函数是一个线程不安全的函数,他会调用malloc和free,
 

/// 行

struct LineIni
{
    char line[MAX_LINE_LEN] ;    ///< 行的原来

    int nPosEqual ;
    struct LineIni * next ;    ///< 下一行

};

static struct LineIni LineHead ;

 

由于共享库函数中有static变量,而该变量中又是一个动态的指针链,导致多线程调用时,该变量被破坏,malloc和free就会出错。

这就是为什么我用gdb跟踪,始终无法地位,只是弹出

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 131081 (LWP 568)]
0x403f8784 in mallopt () from /lib/libc.so.6

不想推卸责任,可这毕竟是以前同事写的代码。

问题解决了,我没有一丝的喜悦。我知道,我已疲倦。

阅读(1431) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~