log4cplus-helpers :: towstring()和PropertyConfigurator :: doConfigure在非CLR模式下运行的C ++ / CLI中的scramble字符串参数

时间:2016-05-13 22:58:45

标签: c++-cli log4cplus

我使用log4cplus作为CLR和非CLR C ++ / CLI代码和C#代码的记录器,因此我使用log4cplus的log xc build,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上的非托管代码中的非Unicode DEBUG MODE 版本的log4cplus中,而不是发布模式版本中。

例如:

#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;
}

0 个答案:

没有答案