Does this crash always happen at startup? Is it deterministic?
c0000135 is STATUS_DLL_NOT_FOUND. I suspect ntdll is trying to demand-load another DLL to provide that API, and it is missing or corrupt on your Windows installation. BTW, you’ll probably get a better stack trace from a native debugger (windbg, etc.) in this scenario. Cheers, Andrew ________________________________ From: KONRAD Frederic <frederic.kon...@adacore.com> Sent: Thursday, September 13, 2018 10:02:56 AM To: Andrey Shedel Cc: Andrew Baumann; Paolo Bonzini; QEMU Developers Subject: crashes with win2008 host Hi Andrey, I've strange crashes since this commit: (yes its old) commit 12f8def0e02232d7c6416ad9b66640f973c531d1 Author: Andrey Shedel <ashe...@microsoft.com> Date: Fri Mar 24 15:01:41 2017 -0700 win32: replace custom mutex and condition variable with native primitives Basically it just crashes.. (exception 0xc0000135) like this: (gdb) run Starting program: C:\home\konrad\temp\qemu-system-sparc --version [New Thread 5324.0xdf8] gdb: unknown target exception 0xc0000135 at 0x77636698 gdb: unknown target exception 0xc0000135 at 0x77636698 Program received signal ?, Unknown signal. 0x0000000077636698 in ntdll!RtlRaiseStatus () from C:\Windows\system32\ntdll.dll (gdb) bt #0 0x0000000077636698 in ntdll!RtlRaiseStatus () from C:\Windows\system32\ntdll.dll #1 0x00000000775dcbf7 in ntdll!LdrGetProcedureAddress () from C:\Windows\system32\ntdll.dll #2 0x00000000775a536e in ntdll!LdrInitializeThunk () from C:\Windows\system32\ntdll.dll #3 0x0000000000000000 in ?? () Backtrace stopped: previous frame inner to this frame (corrupt stack?) (gdb) Sorry the backtrace is not really helpful.. I can reproduce the same behavior with v3.0.0.. and only with the Windows 2008 server host.. If I partially revert the patch, eg: using CriticalSection instead of SRWL it seems to work.. But I don't understand why because SRWL should be supported on 2008 Server.. Here is the change I did (which is wrongly making qemu_mutex recursive for now): diff --git a/include/qemu/thread-win32.h b/include/qemu/thread-win32.h index d668d789b4..b335687604 100644 --- a/include/qemu/thread-win32.h +++ b/include/qemu/thread-win32.h @@ -4,7 +4,8 @@ #include <windows.h> struct QemuMutex { - SRWLOCK lock; + CRITICAL_SECTION lock; + LONG owner; #ifdef CONFIG_DEBUG_MUTEX const char *file; int line; diff --git a/util/qemu-thread-win32.c b/util/qemu-thread-win32.c index b303188a36..09ce4fd957 100644 --- a/util/qemu-thread-win32.c +++ b/util/qemu-thread-win32.c @@ -45,7 +45,7 @@ static void error_exit(int err, const char *msg) void qemu_mutex_init(QemuMutex *mutex) { - InitializeSRWLock(&mutex->lock); + InitializeCriticalSection(&mutex->lock); qemu_mutex_post_init(mutex); } @@ -53,14 +53,14 @@ void qemu_mutex_destroy(QemuMutex *mutex) { assert(mutex->initialized); mutex->initialized = false; - InitializeSRWLock(&mutex->lock); + DeleteCriticalSection(&mutex->lock); } void qemu_mutex_lock_impl(QemuMutex *mutex, const char *file, const int line) { assert(mutex->initialized); qemu_mutex_pre_lock(mutex, file, line); - AcquireSRWLockExclusive(&mutex->lock); + EnterCriticalSection(&mutex->lock); qemu_mutex_post_lock(mutex, file, line); } @@ -69,7 +69,7 @@ int qemu_mutex_trylock_impl(QemuMutex *mutex, const char *file, const int line) int owned; assert(mutex->initialized); - owned = TryAcquireSRWLockExclusive(&mutex->lock); + owned = TryEnterCriticalSection(&mutex->lock);there if (owned) { qemu_mutex_post_lock(mutex, file, line); return 0; @@ -81,7 +81,7 @@ void qemu_mutex_unlock_impl(QemuMutex *mutex, const char *file, const int line) { assert(mutex->initialized); qemu_mutex_pre_unlock(mutex, file, line); - ReleaseSRWLockExclusive(&mutex->lock); + LeaveCriticalSection(&mutex->lock); } void qemu_rec_mutex_init(QemuRecMutex *mutex) @@ -141,11 +141,12 @@ void qemu_cond_broadcast(QemuCond *cond) WakeAllConditionVariable(&cond->var); } -void qemu_cond_wait_impl(QemuCond *cond, QemuMutex *mutex, const char *file, const int line) +void qemu_cond_wait_impl(QemuCond *cond, QemuMutex *mutex, const char *file, + const int line) { assert(cond->initialized); qemu_mutex_pre_unlock(mutex, file, line); - SleepConditionVariableSRW(&cond->var, &mutex->lock, INFINITE, 0); + SleepConditionVariableCS(&cond->var, &mutex->lock, INFINITE); qemu_mutex_post_lock(mutex, file, line); } -- 2.16.2 Do you have any idea of what's happening? Regards, Fred