WernerP Ответов: 2

Std:: строка не сохраняется между приложением и log4cxxd.dll, оба режима отладки


ОС: Windows 7 Pro
IDE: Visual Studio 2015

Дорогие друзья,

У меня происходит странная вещь, когда я пытаюсь запустить любое приложение, скомпилированное со стандартными настройками отладки и связанное с отладочной версией Apache log4cxx, библиотеки DLL logger, которую я также скомпилировал со стандартными настройками отладки.

Когда я запускаю код, как показано ниже, с
LOG4CXX_INFO(logger0, st.c_str());
затем он пишет" xyz " на консоль, как и следовало ожидать.

Однако, когда я запускаю его с помощью
LOG4CXX_INFO(logger0, st);
то есть строковый объект передается функции dll (по ссылке), программа выходит из строя. Шаг в вызываемую функцию показывает, что буфер строкового объекта () указывает не на тот же адрес (0x0037fa58 "xyz"), а на (0x0037fa54 "xyz"), то есть на 4 байта левее оригинала.

Любой намек очень ценится - большое вам спасибо.

Овации
Вернер

код вызова

std::string st = std::string("xyz");
LOG4CXX_INFO(logger0, st);


Код называется

CharMessageBuffer& MessageBuffer::operator<<(const std::string& msg) {
   return cbuf.operator<<(msg);
}


Что я уже пробовал:

Я заподозрил _ITERATOR_DEBUG_LEVEL и проверил, было ли это 2 как в приложении, так и в dll (true). Если я установлю _ITERATOR_DEBUG_LEVEL=0, удивительно, но приложение также ссылается на dll без жалоб, и ссылка на строку правильно передается вызываемой функции: код работает.

2 Ответов

Рейтинг:
0

Richard MacCutchan

Это происходит потому, что вы отправляете объект string, а не фактический текст строки, которую он содержит. Вам нужно точно следовать правилам вызываемой функции.


WernerP

- Спасибо, Ричард. Хорошее предложение. Однако я забыл показать вызываемый объект, представленный макросом LOG4CXX_INFO: он принимает строку & amp; аргумент. Сдвиг в 4 байта указывает на то, что std::string имеет другое определение при вызове приложения и dll. Это не должно быть так, в частности, поскольку оба они были скомпилированы с настройками отладки по умолчанию. В частности, то, что я сделал сейчас, состояло в том, чтобы явно установить _ITERATOR_DEBUG_LEVEL=2 (часто указываемая причина расходящейся реализации std::string) при компиляции dll.

Рейтинг:
0

WernerP

Тривиальная ошибка: я переименовал как lib, так и dll в D. lib и D.dll. Конечно, это не сработает, так как lib указывает на оригинальное имя. :-\