2

コードは次のとおりです。

foo.h

extern "C" {
    int  sdq_init_connector(const SSchar* path);
}

foo.cxx

int sdq_init_connector(const SSchar* path)
{
    Logger log(LOG_DEBUG, "sdq_init_connector");

    /*
    here goes some not so relevant code
    */

    log.write("Here be dragons");

    return 0;
 }

そして、foo で使用されている Logger クラスがありますが、興味深いものはありません。constructor(char * message)、destructor()、および write(char * message)。

問題の概要:

テストアプライアンスからlibfoo.soを呼び出すと問題なく動作しますが、関数sdq_init_connectorがそれを返した後に本番システムから呼び出されると、以下のSEGFAULTバックトレースが返されます

#10 <signal handler called>
#11 0x583d7fee in Node::~Node() () from /opt/siebel/sba81/siebsrvr/mw/lib/libtl.so
#12 0x583de09a in Logger::~Logger() () from /opt/siebel/sba81/siebsrvr/mw/lib/libtl.so
#13 0x6c86e001 in sdq_init_connector () from /opt/siebel/sba81/siebsrvr/lib/libfoo.so

#12 同じオブジェクト名の別のライブラリがあることに注意してください。外部ライブラリのデストラクタが内部オブジェクトに対して呼び出されるのはなぜですか?

4

1 に答える 1

1

Logger オブジェクトのデストラクタのシグネチャはまったく同じでした。

どうだった:

[root@baz ~]# nm -aC /opt/siebel/sba81/siebsrvr/mw/lib/libtl.so| grep Logger
0001a0b0 W Logger::~Logger()
0001a070 W Logger::~Logger()

[root@baz ~]# nm -aC /opt/siebel/sba81/siebsrvr/lib/libfoo.so| grep Logger
000251b8 T Logger::~Logger()
000257ac T Logger::~Logger()
00025d90 T Logger::~Logger()

どのように今:

[root@baz ~]# nm -aC /opt/siebel/sba81/siebsrvr/lib/libfoo.so| grep Logger
00025288 T Foo::Logger::~Logger()
0002587c T Foo::Logger::~Logger()
00025e60 T Foo::Logger::~Logger()

ライブラリに名前空間を追加したところ、この問題は解決しました。

于 2012-11-16T11:42:51.997 に答える