一个SIGSEGV问题定位实例

C++开发时,有时会遇到程序崩溃的情况,今天和大家分享一个SIGSEGV崩溃问题。

SIGSEVG问题一般是访问了非法内存导致。

问题场景还原

两个so,a.so和b.so,b.so依赖a.so

a模块有三个文件:

  • Net.h
  • Net.cpp
  • Android.mk
    // Net.h
    // 注意Net类的声明中有宏定义MACRO包含的成员
    

    class Net{
    public:
            Net(){}
            void PrintName();
    #ifdef MACRO
            void DoSthWithMACRO(){}
    #endif
    
    private:
            int id_;
    #ifdef MACRO
            vector<int> vec_;
    #endif
            string name_;
    };
    
    // Net.cpp
    Net::PrintName(){
            // 访问成员变量name_
            cout<<this->name_<<endl;
    }
    
    // Android.mk
    // 编译文件中定义了MACRO
    CFLAGS += -DMACRO

b模块有三个文件:

  • User.h
  • User.cpp
  • Android.mk
    // User.h
    // User类中有Net成员
    #include Net.h
    class User{
    public:
            void PrintNetName();
    private:
            // 拥有Net成员
            Net* net_;
    };
    
    // User.cpp
    User::PrintNetName(){
            net_ = new Net();
            net_->PrintName();
    }
    
    // Android.mk
    // 编译文件中并没有定义MACRO宏

由于两个模块(so)中一个定义了宏MACRO,一个没有定义,就会导致class Net在两个模块的声明有差异:a.so中比b.so中的class Net多了

#ifdef MACRO
...
#endif

之间的内容。

差异如下:
在a.so中Net的定义是:

    class Net{
    public:
            Net(){}
            void PrintName(){
                    // 访问成员变量name_
                    cout<<this->name_<<endl;
            }
    #ifdef MACRO
            void DoSthWithMACRO(){}
    #endif
    
    private:
            int id_;
    #ifdef MACRO
            vector<int> vec_;
    #endif
            string name_;
    };

在b.so中的Net的定义是:

    class Net{
    public:
            Net(){}
            void PrintName(){
                    // 访问成员变量name_
                    cout<<this->name_<<endl;
            }
    private:
            int id_;
            string name_;
    };

因此在b.so中创建的Net对象并调用a.so中Net.cpp的PrintName()访问成员变量name_时就会崩库。因为内存地址对应不上。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,735评论 0 3
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,701评论 0 17
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,199评论 19 139
  • 1:InputChannel提供函数创建底层的Pipe对象 2: 1)客户端需要新建窗口 2)new ViewRo...
    自由人是工程师阅读 5,448评论 0 18
  • 我是个泪腺特别浅的人,稍微一些感动的事情,一个新闻,一个短篇,看着看着就能哭掉好张纸,相公总说我,没长大;成年人是...
    Nona_li阅读 836评论 0 1