对于glog中ShutdownGoogleLogging后不能再次InitGoogleLogging问题的解决办法
注:最近代码已修复此bug
https://code.google.com/p/google-glog/issues/detail?id=142
https://code.google.com/p/google-glog/source/browse/trunk/src/utilities.cc
https://code.google.com/p/google-glog/source/browse/trunk/src/utilities.cc
问题原因非常简单,utilities.cc文件中的ShutdownGoogleLoggingUtilities未对全局静态变量g_program_invocation_short_name重置为NULL,下面是相关的源代码,一看便知,解决办法就是加上:g_program_invocation_short_name = NULL;一句,由于是静态的全局变量,不能在自己程序中执行这个操作,除非改成非static全局变量。
源码文件logging.cc
1803 void InitGoogleLogging(const char* argv0) {
1804 glog_internal_namespace_::InitGoogleLoggingUtilities(argv0);
1805 }
1806
1807 void ShutdownGoogleLogging() {
1808 glog_internal_namespace_::ShutdownGoogleLoggingUtilities();
1809 LogDestination::DeleteLogDestinations();
1810 delete logging_directories_list;
1811 logging_directories_list = NULL;
1812 }
源码文件src/utilities.cc
57 static const char* g_program_invocation_short_name = NULL;
167 bool IsGoogleLoggingInitialized() {
168 return g_program_invocation_short_name != NULL;
169 }
316 void InitGoogleLoggingUtilities(const char* argv0) {
317 CHECK(!IsGoogleLoggingInitialized())
318 << "You called InitGoogleLogging() twice!";
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(&DumpStackTraceAndExit);
328 #endif
329 }
330
331 void ShutdownGoogleLoggingUtilities() {
332 CHECK(IsGoogleLoggingInitialized())
333 << "You called ShutdownGoogleLogging() without calling InitGoogleLogging() first!";
334 #ifdef HAVE_SYSLOG_H
335 closelog();
336 #endif
g_program_invocation_short_name = NULL;
337 }
分类:
C/C++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义