动态共享库引发的double free错误的分析

问题背景

项目中遇到了这么个场景:项目中,所有文件可以生成一个动态链接库A.so

场景1:

A.so 假设由N个.o生成,不妨假设由a.o,b.o生成。

如果将main.cpp -> main.o

main.o, a.o, b.o  -> main_bin,运行./main_bin,运行正常。

 

场景2:

将A.so、main.cpp,两个一起生成一个可执行程序

即是main.cpp -> main.o

A.so , main.o -> main_bin,运行./main_bin,出现在double free问题。真实的现场长这个样子

glibc detected ***  double free or corruption(fasttop)

问题初步分析

直接原因,肯定是因为某个变量被重复释放了。可是,这可能是什么原因导致呢?直接换一种编绎方式去生成目标可执行程序,就不会出现问题,真是太奇怪了!

这时候,自己确实没有什么思路,一般常用手段,就是求助百度君,谷歌君了,看看有没有前人一些经验可以借鉴。

在查找问题的过程中,自己发现理论知识上的几个盲区:

1、GCC对静态链接库的链接过程是怎么样?

2、对动态链接库的过程是怎么样?

3、项目代码比较庞大,想办法缩小问题,进行定位。

对于问题1,2,可以参考一本书籍《程序员的自我修养—链接、装载与库》,花了一个晚上时间把相关章节学习。

问题缩小

对于研究问题,找到网上一则示例代码,可以非常完美的重现项目中的错误。

foo.h
#ifndef _FOO_H
#define _FOO_H
#include <stdio.h>
#include <string>
class Foo {
     public :
         static Foo s_foo;
         Foo();
         ~Foo();
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值