天天看点

对于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) |