问题背景
项目中遇到了这么个场景:项目中,所有文件可以生成一个动态链接库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();
|