linux下由于线程局部存储未初始化导致加载动态链接库时程序崩溃的BUG

昨天碰到一个诡异的问题,第三方引擎给过来一个新的寻路库,原本的实现是一个静态链接库(.a),但是新版的改为了动态链接(.so),我没想那么多,直接在需要的地方dlopen打开该so,谁知道一跑到这句就程序就当。用gdb查看core文件,最上层的堆栈大致是:

#0 _dlerror_run()
#1 dlopen()

google了一番“_dlerror_run crash”、"_dlerror_run 崩溃"等关键字无果,于是我尝试在别的地方加载了该库,例如我在main函数的前几行就先载入这个库,发现可以成功,没有报错。

后来这个事情由于我这边还有别的事要做,就暂时交给了大拿牛哥去看了。牛哥用二分法确定了代码中哪一行调用之后再加载该库就会导致crash,最后确定在pthread_setspecific函数。从而发现在pthread_setspecific之前pthread_key_create没有调用,导致线程局部存储在没有初始化的情况下就使用了。而且,这样的操作会影响别的so加载。


后来跟牛哥讨论这种问题如何定位,牛哥说这种问题只能在代码中二分查找,不断地换地方插入可能导致宕机的代码,最终确定是哪一个函数调用后再调用该代码才会宕机。


这种问题很少碰到,但却让人十分抓狂。这种问题的解决经验十分可贵,特此记录。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值