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加载。


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


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

你可能感兴趣的:(Multi,Thread,Programming,C++,Programming,Language)