天天看點

對于glog中ShutdownGoogleLogging後不能再次InitGoogleLogging問題的解決辦法

<b>注:最近代碼已修複此bug</b>

<a href="http://code.google.com/p/google-glog/issues/detail?id=142" target="_blank">https://code.google.com/p/google-glog/issues/detail?id=142</a>

<a href="http://code.google.com/p/google-glog/source/browse/trunk/src/utilities.cc" target="_blank">https://code.google.com/p/google-glog/source/browse/trunk/src/utilities.cc</a>

問題原因非常簡單,utilities.cc檔案中的ShutdownGoogleLoggingUtilities未對全局靜态變量g_program_invocation_short_name重置為NULL,下面是相關的源代碼,一看便知,解決辦法就是加上:g_program_invocation_short_name = NULL;一句,由于是靜态的全局變量,不能在自己程式中執行這個操作,除非改成非static全局變量。

<b>源碼檔案logging.cc</b>

1803 void <b>InitGoogleLogging</b>(const char* argv0) {

1804   glog_internal_namespace_::InitGoogleLoggingUtilities(argv0);

1805 }

1806 

1807 void <b>ShutdownGoogleLogging</b>() {

1808   glog_internal_namespace_::ShutdownGoogleLoggingUtilities();

1809   LogDestination::DeleteLogDestinations();

1810   delete logging_directories_list;

1811   logging_directories_list = NULL;

1812 }

<b>源碼檔案src/utilities.cc</b>

57 static const char* <b>g_program_invocation_short_name </b>= NULL;

167 bool <b>IsGoogleLoggingInitialized</b>() {

168   return g_program_invocation_short_name != NULL;

169 }

316 void <b>InitGoogleLoggingUtilities</b>(const char* argv0) {

317   CHECK(!IsGoogleLoggingInitialized())

318       319   const char* slash = strrchr(argv0, '/');

320 #ifdef OS_WINDOWS

321   if (!slash)  slash = strrchr(argv0, '\\');

322 #endif

323   g_program_invocation_short_name = slash ? slash + 1 : argv0;

324   g_main_thread_id = pthread_self();

325 

326 #ifdef HAVE_STACKTRACE

327   InstallFailureFunction(&amp;DumpStackTraceAndExit);

328 #endif

329 }

330 

331 void <b>ShutdownGoogleLoggingUtilities</b>() {

332   CHECK(IsGoogleLoggingInitialized())

333       334 #ifdef HAVE_SYSLOG_H

335   closelog();

336 #endif

      <b>g_program_invocation_short_name = NULL;</b>

337 }

閱讀(4925) | 評論(0) | 轉發(0) |