Недавно я преобразовал неуправляемое консольное приложение 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? Это не то, что я делал раньше, так что я бы не удивился, если бы что-то очевидное я пренебрег. Любая помощь приветствуется.