linux多进程 段错误,关于段错误
一個月的時間,就為了解決一個問題,段錯誤
運行環境: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
不想推卸責任,可這畢竟是以前同事寫的代碼。
問題解決了,我沒有一絲的喜悅。我知道,我已疲倦。
總結
以上是生活随笔為你收集整理的linux多进程 段错误,关于段错误的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 权限提示信息,命令行快速提示
- 下一篇: linux中服务器之间的跳转,linux