Logger::getInstance вызывает исключение bad_alloc в log4cplus

Я пытаюсь реализовать ведение журнала в приложении С++, используя log4cplus. Я могу успешно собрать/связать (я добавил log4cplus.lib в свои дополнительные библиотеки и скопировал log4cplus.dll в build/outdir)

Когда я запускаю свое приложение, я получаю следующее исключение, когда оно выполняет мой вызов Logger::getInstance:

Необработанное исключение по адресу 0x75cad36f в LogTesterConsole.exe: исключение Microsoft C++: std::bad_alloc в ячейке памяти 0x0013ed8c..

Я попытался разместить вызов вне моей процедуры main(), а также внутри и получил те же результаты.

Любые идеи?

Код:-

 #include "stdafx.h"
 #include <log4cplus/logger.h>
 #include <log4cplus/loggingmacros.h>
 #include <log4cplus/configurator.h>
 using namespace log4cplus;
 int _tmain(int argc, _TCHAR* argv[])
 { 
   BasicConfigurator config;
   config.configure();
   Logger logger = Logger::getInstance(LOG4CPLUS_TEXT("main"));
   LOG4CPLUS_WARN(logger, LOG4CPLUS_TEXT("Hello, World!"));
   return 0;
 }

person Josh    schedule 01.09.2012    source источник
comment
не используйте обратную косую черту в пути к заголовочным файлам, вместо этого используйте косую черту   -  person Maxwe11    schedule 01.09.2012
comment
@Josh: я сопровождаю log4cplus. Пожалуйста, попробуйте запустить его в Visual Studio под отладчиком и посмотрите, где возникает исключение.   -  person wilx    schedule 01.09.2012
comment
@wilx: Отслеживание вызова PropertyConfigurator::doConfigure выглядит так, как будто он идет на юг в конструкторе PropertyConfigurator (тот, у которого есть подпись аргумента «const tstring& propertyFile»). Похоже, это происходит в std::basic_string::assign. Глядя на значение аргумента propertyFile из конструктора, похоже, что оно искажено.   -  person Josh    schedule 02.09.2012
comment
К вашему сведению: я на Win7, использую VS2010. Я собрал log4cplus из решений VS без изменения каких-либо настроек проекта.   -  person Josh    schedule 02.09.2012
comment
Я могу успешно запустить тесты отладки из решения log4cplus (хотя я получаю ошибку «не удалось открыть файл log4cplus.properties», которую я ожидал). Я прочесывал различия и пока не нашел ничего интересного.   -  person Josh    schedule 02.09.2012
comment
Проверка работоспособности: не могли бы вы сказать мне (или указать мне на документацию), какие шаги мне нужно предпринять, чтобы использовать log4cplus в моем приложении. Я добавил log4cplus.lib в Project Linker-›Input-›Additional_Dependencies, скопировал log4cplus.dll в свою рабочую папку и добавил путь включения log4cplus в C/C++-›General-›Additional_Include_Directories. Я также убедился, что мой проект соответствует моему набору символов сборки log4cplus (многобайтовый)   -  person Josh    schedule 04.09.2012
comment
@Josh: Этого должно быть достаточно. Используете ли вы log4cplus DLL или статическую библиотеку log4cplus?   -  person wilx    schedule 08.09.2012
comment
@Josh: Вы нашли способ диагностировать эту проблему?   -  person wilx    schedule 17.09.2012
comment
К сожалению нет. В итоге я сдался. Я создавал простые приложения Hello World и так и не смог успешно решить проблему. Возникли другие, более насущные проблемы, но к ним еще не возвращались.   -  person Josh    schedule 17.09.2012


Ответы (3)


Если вы создаете приложение в режиме отладки, не забудьте указать ссылку на lib4CplusD.lib и lib4CplusD.dll. Точно так же выпускное приложение должно связываться с lib4cplus.lib и lib4cplus.dll. У меня была та же ошибка времени выполнения, и когда я связал свое отладочное приложение с отладочными библиотеками, проблема была решена.

person FishesCycle    schedule 13.11.2012

пытаться:-

int _tmain(int argc, _TCHAR* argv[])
 { 
   PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("log4cplus.properties"));
   Logger root = Logger::getRoot();
   try{
   Logger logger = Logger::getInstance(LOG4CPLUS_TEXT("main"));
    }
   catch(...) {
        cout << "Exception..." << endl;
        LOG4CPLUS_FATAL(root, "Exception occured...");
    }
   LOG4CPLUS_WARN(logger, LOG4CPLUS_TEXT("Hello, World!"));
   return 0;
 }
person perilbrain    schedule 01.09.2012
comment
Я попробовал предложенный вами код (с небольшим модом, объявив «логгер» вне блока TRY), и теперь это строка doConfigure, которая дает сбой, и это та же ошибка (bad_alloc) - person Josh; 01.09.2012
comment
У меня есть файл log4cplus.properties в моей рабочей папке отладки как FYI. - person Josh; 01.09.2012
comment
Еще один FYI: я получаю одинаковое поведение при использовании log4cplus-1.1.0-rc8 или log4cplus-1.0.4.1. - person Josh; 01.09.2012
comment
вы пробовали отлаживать???...могут быть и другие проблемы...но я предлагаю добавить.#include <log4cplus/helpers/loglog.h> #include <log4cplus/helpers/stringhelper.h> - person perilbrain; 01.09.2012
comment
Я запускаю из отладчика, да. Трудно представить, что добавление дополнительных файлов заголовков изменит поведение во время выполнения. - person Josh; 01.09.2012
comment
При просмотре трассировки стека (при вызове PropertyConfigurator::doConfigure видно, что значение первого аргумента искажено). Может быть, LOG4CPLUS_TEXT перепутался? - person Josh; 01.09.2012
comment
Раньше у меня были сомнения... что это все может быть из-за предварительно скомпилированных заголовков... и, скорее всего, это повлияло на LOG4CPLUS_TEXT... - person perilbrain; 01.09.2012
comment
Если я сделаю следующее: string s = LOG4CPLUS_TEXT(asd), значение s равно asd. - person Josh; 01.09.2012

Я знаю, что этот пост довольно старый, но я столкнулся с точно такой же проблемой, когда вчера начал пробовать log4cplus v2.0.0.

Краткий ответ: это проблема сборки Debug/Release.

Теперь более длинный ответ для тех, кто может воспроизвести:

  • Я скачал последнюю стабильную версию log4cplus (v2.0.0) здесь
  • Я открыл Visual Studio Soultuin в ./log4cplus-2.0.0/msvc14 с VS2017 и сделал сборку выпуска (юникод) log4cplus-проекта (Windows SDK v10.0.16299.0; набор инструментов платформы v141). Все получилось нормально.
  • Я сделал новый пример C++-решения, чтобы опробовать предыдущую сборку log4cplus.
  • Setup to use log4cplus:
    • Add log4cplusU.lib as an additional dependency to the linker
    • Добавьте log4cplusU.dll в выходной каталог
    • Добавить все в ./log4cplus-2.0.0/include в дополнительные включения
  • Сделайте отладочную сборку (x86) примера решения. Все работало нормально.
  • Сделав сборку решения, я нажал «запустить», чтобы посмотреть, все ли работает.

Теперь это тот момент, когда я столкнулся с той же проблемой, которую @Josh описал в своем первоначальном посте. Теперь фактическая проблема заключается в том, что я сделал выпускную сборку log4cplus, но использовал эту выпускную сборку в отладочной сборке моего собственного приложения.

Помня об этом, я сделал релизную сборку своего собственного приложения, и все заработало как часы!

Я отправил свое полное решение VS2017 в свой репозиторий GitHub, чтобы вы могли воспроизвести проблему " руки вверх". Просто измените конфигурацию этого решения на «Отладка» (x86) и посмотрите, как оно создаст исключение во время выполнения. Измените его на «Release» (x86) и посмотрите, как он работает, как и ожидалось!

person MikeVe    schedule 15.04.2018