SIGSEGV問題の位置決め例
2099 ワード
C++開発時、プログラムがクラッシュすることがありますが、今日はSIGSEGVクラッシュの問題を共有します.
SIGSEVGの問題は、一般的に不正なメモリへのアクセスによるものです.
問題シーンの復元
2つのso,a.soおよびb.so,b.soはa.soに依存する
aモジュールには3つのファイルがあります. Net.h Net.cpp Android.mk
bモジュールには3つのファイルがあります. User.h User.cpp Android.mk
2つのモジュール(so)の1つがマクロMACROを定義しているため、1つが定義されていない場合、class Netは2つのモジュールの宣言に違いがあります.a.soではb.soのclass Netより多くなります.
と入力します.
違いは、a.soでのNetの定義です.
b.soでのNetの定義は次のとおりです.
したがって、b.soで作成するNetオブジェクトは、a.soでNetを呼び出す.cppのPrintName()アクセスメンバー変数name_すると崩れてしまいます.メモリアドレスが対応していないためです.
SIGSEVGの問題は、一般的に不正なメモリへのアクセスによるものです.
問題シーンの復元
2つのso,a.soおよびb.so,b.soはa.soに依存する
aモジュールには3つのファイルがあります.
// 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 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_すると崩れてしまいます.メモリアドレスが対応していないためです.