一个服务,临近发布时突然发现在启动时会core dump, 通过调低线程数可以解决, 仔细调试后发现程序在调用mysql_options时触发了Segmentation fault.
服务有多个线程,每个线程一个mysql 连接, 在每个线程调用所有mysql_* 函数之前先调用了mysql_init.
查阅了官方文档: https://dev.mysql.com/doc/refman/5.7/en/c-api-threaded-clients.html 按照这个多线程编程指引,我的程序并没有问题.
查询自己的mysql库 的版本号,是 ubuntu16.04 软件库默认的版本:
$ dpkg -l | grep mysqlclient
ii libmysqlclient-dev 5.7.19-0ubuntu0.16.04.1 amd64 MySQL database development files
ii libmysqlclient20:amd64 5.7.19-0ubuntu0.16.04.1 amd64 MySQL database client library
怀疑是不是这个版本的库有bug, 上google查了一下没找到什么资料.于是自己动手,丰衣足食,上mysql官网下载了一个最新的c_connector 替换掉之前的库,开200个线程测试,一切ok.
下载连接:
https://cdn.mysql.com//Downloads/Connector-C/mysql-connector-c-6.1.11-linux-glibc2.12-x86_64.tar.gz
没想到作为LTS版本的ubuntu官方软件库提供的库会有这么严重的bug, 看样子以后所有的库要尽量用官方发布的版本.
2017-08-31 增加:
后面发现通过更换libmysqlclient版本并不能解决问题,只是让问题的表现形式变得不同了, 彻底解决这个问题请看这里.