Деструктор назвал форму неподходящей библиотекой

Вот код:

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;
}

И есть класс Logger, который используется в foo, ничего интересного, конструктор (char * message), destructor () и write (char * message).

Краткое описание проблемы:

Когда я вызываю libfoo.so из тестового устройства, он работает безупречно, но когда он вызывается из производственной системы после того, как функция sdq_init_connector вернет его, SEGFAULTs обратная трассировка ниже

#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 есть еще одна библиотека с тем же именем объекта. Почему для моего внутреннего объекта вызывается деструктор из какой-то иностранной библиотеки?

2

Решение

Подписи деструкторов для объекта 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()

Я добавил пространство имен в свою библиотеку, и это решило эту проблему.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]