最近在系统里遇到一个程序,总会莫名其妙的segmentation fault,而且每次出现的问题都不相同。考虑到有多线程,可能会跟这个有关系。但是一直没有找出到底哪里出的问题,这个程序使用libpcap的一些function来进行抓包分析,每个网卡对应一个线程。
function里面没有显式的全局变量。
然后就想到,通过function back trace来看看。找到
======= Backtrace: =========
/lib64/libc.so.6[0x3e4ca76166]
/lib64/libc.so.6[0x3e4ca78c93]
/lib64/libc.so.6[0x3e4ca7bb60]
/lib64/libc.so.6(realloc+0xe5)[0x3e4ca7bdd5]
./dnsaudit[0x41a413]
./dnsaudit[0x41a639]
./dnsaudit[0x41a770]
./dnsaudit[0x41a7f9]
./dnsaudit[0x41a879]
./dnsaudit[0x40b218]
./dnsaudit[0x407a58]
/lib64/libpthread.so.0[0x3e4d2079d1]
/lib64/libc.so.6(clone+0x6d)[0x3e4cae8b6d]
通过objdump -S dnsaudit >tmp
找到出事的问题点,果然是在库函数里面,pcap_ensure_buffer_stack
看了一下出事的行:if (!(yy_buffer_stack)) {
这个yy_buffer_stack
static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
静态变量啊。。。多线程的使用肯定是有问题的
解决方案下一篇再写