qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] qemu 2.10.2 : util/qemu-thread-posix.c: 64: qemu_mutex_


From: Peter Maydell
Subject: Re: [Qemu-devel] qemu 2.10.2 : util/qemu-thread-posix.c: 64: qemu_mutex_lock: Assertion 'mutex->initialized' failed
Date: Sun, 11 Mar 2018 15:18:31 +0000

On 11 March 2018 at 06:58, Eva Chen <address@hidden> wrote:
> Hello,
>
> I am working on compiling QEMU 2.10.2 to a static library.
>
> Everything works fine in compiling QEMU to an execution
> file(qemu-system-aarch64), but after I link all .o and .a file to create a
> QEMU library and write a c file to call qemu_main() in qemu/util/vl.c(I
> have changed the name "main()" into "qemu_main()"), then it shows this
> error message.

This isn't really supported, so you're kind of on your
own here, but I have a few debugging suggestions below:

> util/qemu-thread-posix.c: 64: qemu_mutex_lock: Assertion
> 'mutex->initialized' failed.
> Abort (core dumped)
>
>
> The information of gdb's backtrace is shown as bellow
> (gdb) bt
>
> *#o Ox00007ffff05b31f7 in raise () at /usr/lib64/libc.so.6
> #1 0x00007ffff05b48e8 in abort () at /usr/lib64/libc.s0.6
> #2 0x00007ffff05ac266 in assert fail base () at /usr/lib64/libc.so.6
> #3 0x00007ffff05ac312 in 0 at /usr/lib64/libc.so.6
> #4 0x00000000005c47e3 in qemu_mutex_lock (address@hidden <rcu_registry lock>) 
> at
> util/qemu-thread-posix.c:64
> #5 0x00000000005d5b46 in rcu_register_thread() at util/rcu.c:290
> #6 0x00007ffff5a790de in rcu_init_complete () at util/rcu.c:318,
> #7 Ox00007ffff7dea503 in _dl_init_internal () at /lib64/ld.linux-x86-64.50.2
> #8 0x00007ffff7ddclaa in _dl_start_user () at /lib64/ld.linux - x86-64.so.2
> #9 0x0000000000000014 in ()*
>
> I found out that it aborted before conducted to the main function in QEMU

This happens before main because this backtrace is from rcu_init()
in util/rcu.c, which is marked as __attribute__((__constructor__)),
so it is called before main().

(As an aside, you'll probably find your backtraces are more
helpful and debugging is easier if you configure QEMU with
--enable-debug, which will mean we compile with debug rather
than optimization. When you've got it working you can make the
final build a non-debug one.)

> Also,  I use si and n in gdb to see what happened in this QEMU library
> it showed  that the address and content of *rcu_registry_lock* would change
> when it executed qemu_thread_create() in util/rcu.c:315
>
> $ qemu_thread_create(&thread, "cal_rcu", call_rcu_thread, NULL,
> QEMU_THREAD_DETACHED)
>
> This change caused the failure of assert(mutex->initialized) in
> qemu_mutex_lock (which called by rcu_register_thread() in call_rcu_thread())

That's odd, because mutex->initialized is supposed to be
set by qemu_mutex_init() and then not written until something
calls qemu_mutex_destroy(). If I were you I'd try using debugger
watchpoints to find out where the code is that's overwriting
mutex->initialized.

thanks
-- PMM



reply via email to

[Prev in Thread] Current Thread [Next in Thread]