0

我使用 log4cplus 作为 CLR 和非 CLR C++/CLI 代码和 C# 代码的记录器,因此我使用 Unicode x64 构建的 log4cplus、log4cplusU.lib/dll。

如果我在非 CLR C++/CLI x64 控制台应用程序中运行以下代码,则会出现内存访问异常。

int _tmain(int argc, _TCHAR* argv[])
{
    std::string LogFileName = "log4cplus.log";
    auto db = log4cplus::helpers::towstring(LogFileName);

例外:

Unhandled exception at 0x00007FF8E4A1CDA1 (msvcr120.dll) in ConsoleApplication1.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

这是怎么回事?

我正在使用 Visual Studio 2013。异常时的调用堆栈如下所示:

>   log4cplusU.dll!std::vector<wchar_t,std::allocator<wchar_t> >::vector<wchar_t,std::allocator<wchar_t> >(unsigned __int64 _Count) Line 691    C++
    log4cplusU.dll!log4cplus::helpers::towstring_internal(std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> > & outstr, const char * src, unsigned __int64 size, const std::locale & loc) Line 70 C++
    log4cplusU.dll!log4cplus::helpers::towstring(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & src) Line 124 C++
    ConsoleApplication1.exe!wmain(int argc, wchar_t * * argv) Line 24   C++
    ConsoleApplication1.exe!__tmainCRTStartup() Line 623    C

在 std::vector(size_type) 中触发异常时,_Count 是一个疯狂的数字。

_Count  14757396612626683276    unsigned __int64

原因似乎是字符串参数被打乱或误解。

同样的问题在 VS 上的非托管代码中 log4cplus 的非 Unicode DEBUG MODE构建中表现出来,但在发布模式构建中则没有。

例如:

#include <string>
#include "stdafx.h"

#include <iostream>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/configurator.h>

int _tmain(int argc, _TCHAR* argv[])
{
    std::string LogConfigFileName = "WhenLoggingCppManagedCode.properties";

    try
    {
        log4cplus::tstring cfn = LogConfigFileName;
        log4cplus::PropertyConfigurator::doConfigure(cfn);

        std::cout << "Good Deadpool." << std::endl;
    }
    catch (...)
    {
        std::cout << "BAD Deadpool." << std::endl;
    }

    std::cin.get();
    return 0;
}
4

0 回答 0