Недавно я преобразовал многопоточное неуправляемое консольное приложение Win32 C++ (MediaServer.exe) в неуправляемую DLL Win32 (MediaServer.dll). Я размещаю и отлаживаю эту DLL в отдельном неуправляемом консольном приложении Win32, и все компилируется и запускается, но примерно через минуту я получаю случайный сбой в бессмысленном месте с явно поврежденным вызовом. куча. Эти сбои происходят в самых разных местах и в довольно случайное время: но общим является то, что (очевидно поврежденный) стек вызовов всегда где-то содержит различные функции libxml2.dll, например, сбой может произойти в строке, которая выглядит нравится:
xmlDoc * document = xmlReadMemory(message.c_str(), message.length(), "noname.xml", NULL, 0);
Или вот так:
xmlBufferPtr buffer = xmlBufferCreate();
И стек вызовов может выглядеть так:
feeefeee()
libxml2.dll!000eeec9()
[Frames below may be incorrect and/or missing, no symbols loaded for libxml2.dll]
libxml2.dll!00131714()
libxml2.dll!001466b6()
libxml2.dll!00146bf9()
libxml2.dll!00146c3c()
libxml2.dll!0018419e()
Или, если повезет, вот так:
ntdll.dll!_RtlpWaitOnCriticalSection@8() + 0x99 bytes
ntdll.dll!_RtlEnterCriticalSection@4() - 0x15658 bytes
libxml2.dll!1004dc6d()
[Frames below may be incorrect and/or missing, no symbols loaded for libxml2.dll]
libxml2.dll!10012034()
libxml2.dll!1004b7f7()
libxml2.dll!1003904c()
libxml2.dll!100393a9()
libxml2.dll!10024621()
libxml2.dll!10036e8f()
MediaServer.dll!Controller::parse(std::basic_string<char,std::char_traits<char>,std::allocator<char> > message) Line 145 + 0x20 bytes C++
MediaServer.dll!Controller::receiveCommands() Line 90 + 0x25 bytes C++
MediaServer.dll!MediaServer::processCommands() Line 88 + 0xb bytes C++
MediaServer.dll!MediaServer::processCommandsFunction(void * mediaServerInstance) Line 450 + 0x8 bytes C++
MediaServer.dll!CustomThread::callThreadFunction() Line 79 + 0x11 bytes C++
MediaServer.dll!threadFunctionCallback(void * threadInstance) Line 10 + 0x8 bytes C++
kernel32.dll!@BaseThreadInitThunk@12() + 0x12 bytes
ntdll.dll!___RtlUserThreadStart@8() + 0x27 bytes
ntdll.dll!__RtlUserThreadStart@8() + 0x1b bytes
Сам сбой обычно сообщает что-то вроде «Необработанное исключение по адресу 0x77cd2239 (ntdll.dll) в MediaServerConsole.exe: 0xC000005: место записи нарушения прав доступа 0x00000014».
Излишне говорить, что этого не произошло, когда я компилировал модуль как консольное приложение.
Есть ли что-то, что я мог упустить из виду при преобразовании проекта в DLL? Это не то, что я делал раньше, поэтому я не удивлюсь, если есть что-то очевидное, чем я пренебрег. Любая помощь приветствуется.