【发布时间】:2017-05-23 21:35:24
【问题描述】:
当我打电话时
log4cplus::Logger::shutdown();
它在 log4cplus 类的解构器上抛出异常 Invalid address specified to RtlFreeHeap( 02BF0000, 02B71170 )。
我正在使用 log4cpp 1.2.x(来自当前的 1.2.x 分支)和 Visual Studio 2010 SP1。我将我的应用程序编译为在 Win32 架构上工作,但在为 x64 编译时它也会崩溃。我将 log4cplus 创建为 DLL 文件,并将 log4cplus.lib 文件添加为我的应用程序的附加依赖项,以链接它的加载时间。我有一些其他 DLL 文件,它们在运行时动态加载到应用程序中。运行时加载的 DLL 也依赖于 log4cplus。
log4cplus 的日志系统会尽早初始化以支持在我的应用程序的每个阶段进行日志记录(作为 main 方法中的第一次调用)。
混合加载时和运行时加载的 DLL 文件是否存在问题?
PS:我有一些C++编程的基础知识。
编辑:
操作系统:Windows 8.1 x64
应用类型:
- 基于 WinAPI 的 GUI 应用程序(自定义预加载器、更新机制和用户登录)
- native调用jvm.dll创建JavaVM(用户登录后的主应用,Java编写)
在创建 JavaVM 之前调用 PatternLayout::~PatternLayout() 后遇到异常。
edit2:
我的项目解决方案的结构是:
- 应用(可执行)
- xcom(用于与 Java 通信的 dll 库)
- systemgtk(用于注册表访问和 GUI 的 dll 库)
- 服务(可执行文件、后台更新程序、作为 Windows 服务运行)
- log4cplus
项目 app、xcom、systemgtk 和 serivce 在初始化时加载 log4cplus,systemgtk 和 xcom 在运行时加载到应用程序和服务中。
我在 app.exe 中初始化 log4cplus 并想在 systemgtk.dll 中关闭它。
edit3:
好的,这似乎是构建配置问题。我不知道怎么做,但我解决了这个问题。
【问题讨论】:
-
几个问题: 1.你什么时候打电话给
log4cplus::Logger::shutdown();还在main()里面吗? 2. log4cplus 1.2.0 的确切版本是什么?它是 RC 还是版本本身? 3. log4cplus的日志系统尽早初始化以支持我的应用程序每个阶段的日志究竟是什么意思? 4. 这是在什么版本的 Windows 上运行的? -
嗯,这看起来像“Crash in ~per_thread_data · Issue #155 · log4cplus/log4cplus”,但在 1.2.0 发布后已修复。
-
@wilx 1. 我在 WinAPI GUI 循环中调用
log4cplus::Logger::shutdown();(我不确定它是否是同一个线程,可能是另一个线程)。我没有编写应用程序,我必须使用日志记录来扩展它; 2.我使用的是1.2.0版本; 3.我把它初始化为main方法中的第一件事; 4. Windows 8.1 x64 -
@wilx 我用更多细节更新了这个问题。
-
嗯,我几乎不可能说出发生了什么。我建议尝试查看最新的 1.2.x branch 并尝试使用它进行构建。
标签: c++ windows logging dll log4cplus