一个月的时间,就为了解决一个问题,段错误
运行环境: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) |