兩種不同的dlopen & dlclose夫婦,在dlopen上被封鎖。dlopen/dlclose與夫婦如此,封鎖在dlopen上
掛在dlopen
,它不輸出任何內容,cpuidle降到0%,並且不能通過ctrl + c退出。
LOG_TRACE("attaching...");
handle = dlopen(plugin_path.c_str(), RTLD_LAZY);
LOG_DEBUG("dlopen called"); // this line did not output, after success couple of times;
然後我用GDB附加到程序:
(gdb) bt
#0 0x0000002a960dbe60 in tcmalloc::ThreadCache::InitTSD() at src/thread_cache.cc:321
#1 0x0000002a960d51bf in TCMallocGuard (this=Variable "this" is not available.) at src/tcmalloc.cc:908
#2 0x0000002a960d5e00 in global constructors keyed to _ZN61FLAG__namespace_do_not_use_directly_use_DECLARE_int64_instead43FLAGS_tcmalloc_large_alloc_report_thresholdE() at src/tcmalloc.cc:935
#3 0x0000002a960fafc6 in __do_global_ctors_aux() at ./src/base/spinlock.h:54
#4 0x0000002a96010f13 in _init() from ../plugins/libmonitor.so
#5 0x0000002a00000000 in ??()
#6 0x000000302ad0acaf in _dl_init_internal() from /lib64/ld-linux-x86-64.so.2
#7 0x000000302aff725c in dl_open_worker() from /lib64/tls/libc.so.6
#8 0x000000302ad0aa60 in _dl_catch_error() from /lib64/ld-linux-x86-64.so.2
#9 0x000000302aff79fa in _dl_open() from /lib64/tls/libc.so.6
#10 0x000000302b201054 in dlopen_doit() from /lib64/libdl.so.2
#11 0x000000302ad0aa60 in _dl_catch_error() from /lib64/ld-linux-x86-64.so.2
#12 0x000000302b201552 in _dlerror_run() from /lib64/libdl.so.2
#13 0x000000302b201092 in [email protected]@GLIBC_2.2.5() from /lib64/libdl.so.2
#14 0x000000000041b559 in uap::meta::MetaManageServiceHandler::plugin_action this=0xb26000, [email protected], [email protected], [email protected], t=Variable "t" is not available.)
at /usr/lib/gcc/x86_64-redhat-linux/3.4.5/../../../../include/c++/3.4.5/bits/basic_string.h:1456
#15 0x000000000041b0bc in uap::meta::MetaManageServiceHandler::plugin_action (this=0xb26000, [email protected], [email protected], [email protected], t=uap::meta::PluginActionType::RELOAD)
at server/service_handler.cpp:173
#16 0x0000000000417641 in uap::meta::test_Service_Handler_suite_test_case_manage_service_plugin_action_Test::TestBody (this=0xb16080) at test_load.cpp:73
#17 0x00000000004446c6 in testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void> (object=0xb16080, method={__pfn = 0x21, __delta = 0}, location=0x537f30 "the test body")
at ../../../../com/btest/gtest/src/gtest.cc:2744
#18 0x000000000042dd1c in testing::Test::Run (this=0xb16080) at ../../../../com/btest/gtest/src/gtest.cc:2766
#19 0x000000000042e8b4 in testing::TestInfo::Run (this=0xb17160) at ../../../../com/btest/gtest/src/gtest.cc:2958
#20 0x000000000042f415 in testing::TestCase::Run (this=0xb23000, runtype=0) at ../../../../com/btest/gtest/src/gtest.cc:3160
#21 0x0000000000436352 in testing::internal::UnitTestImpl::RunAllTests (this=0xb22000) at ../../../../com/btest/gtest/src/gtest.cc:5938
#22 0x0000000000434299 in testing::UnitTest::Run (this=0x6f4220, run_type=0) at ../../../../com/btest/gtest/src/gtest.cc:5449
#23 0x0000000000434268 in testing::UnitTest::Run (this=0x6f4220) at ../../../../com/btest/gtest/src/gtest.cc:5387
#24 0x0000000000455404 in main (argc=1, argv=0x7fbffff8c8) at ../../../../com/btest/gtest/src/gtest_main.cc:38
其實我已經重新定義了四種功能:
void __attribute__((constructor)) dlinit()
{
}
void __attribute__((destructor)) dldeinit()
{
}
void _init()
{
}
void _fini()
{
}
什麼程序展示了這種行爲,用什麼插件?程序和插件是如何構建的?你的LD_LIBRARY_PATH變量是什麼?你的'plugin_path'是否包含'/'?它的價值是什麼?你應該在你的代碼之後添加一個'fflush(NULL)'! –
感謝您的回覆,我只是沒有設置LD_LIBRARY_PATH和絕對路徑以/開頭的plugin_path,因爲我只是在這裏添加printf,但是我的代碼沒有,它不是fflush問題,因爲掛在dlopen – user2530422
我不明白如何以及爲什麼你認爲代碼掛在'dlopen'時間?你使用了調試器嗎?顯示插件的代碼,以及程序的更多代碼。 –