SIGSEGV問題の位置決め例

2099 ワード

C++開発時、プログラムがクラッシュすることがありますが、今日はSIGSEGVクラッシュの問題を共有します.
SIGSEVGの問題は、一般的に不正なメモリへのアクセスによるものです.
問題シーンの復元
2つのso,a.soおよびb.so,b.soはa.soに依存する
aモジュールには3つのファイルがあります.
  • 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 vec_;
        #endif
                string name_;
        };
        
        // Net.cpp
        Net::PrintName(){
                //       name_
                cout<name_<

    bモジュールには3つのファイルがあります.
  • 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 
    

    2つのモジュール(so)の1つがマクロMACROを定義しているため、1つが定義されていない場合、class Netは2つのモジュールの宣言に違いがあります.a.soではb.soのclass Netより多くなります.
    #ifdef MACRO
    ...
    #endif
    

    と入力します.
    違いは、a.soでのNetの定義です.
        class Net{
        public:
                Net(){}
                void PrintName(){
                        //       name_
                        cout<name_< vec_;
        #endif
                string name_;
        };
    

    b.soでのNetの定義は次のとおりです.
        class Net{
        public:
                Net(){}
                void PrintName(){
                        //       name_
                        cout<name_<

    したがって、b.soで作成するNetオブジェクトは、a.soでNetを呼び出す.cppのPrintName()アクセスメンバー変数name_すると崩れてしまいます.メモリアドレスが対応していないためです.