Средство фьютекса вернуло неожиданный код ошибки?

Два потока в одном процессе, использующие объект rwlock, хранящийся в общей памяти, сталкиваются с аварийным завершением во время стресс-теста pthreads. Я потратил некоторое время, пытаясь найти повреждение памяти или взаимоблокировку, но пока ничего. это просто неоптимальный способ сообщить мне, что я создал тупик? Любые указатели на инструменты/методы для отладки этого?

Thread 5 "tms_test" received signal SIGABRT, Aborted.
[Switching to Thread 0x7ffff28a7700 (LWP 3777)]
0x00007ffff761e428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
54  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  0x00007ffff761e428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
#1  0x00007ffff762002a in __GI_abort () at abort.c:89
#2  0x00007ffff76607ea in __libc_message (do_abort=do_abort@entry=1, fmt=fmt@entry=0x7ffff77776cc "%s") at ../sysdeps/posix/libc_fatal.c:175
#3  0x00007ffff766080e in __GI___libc_fatal (message=message@entry=0x7ffff79c4ae0 "The futex facility returned an unexpected error code.") at ../sysdeps/posix/libc_fatal.c:185
#4  0x00007ffff79be7e5 in futex_fatal_error () at ../sysdeps/nptl/futex-internal.h:200
#5  futex_wait (private=, expected=, futex_word=0x7ffff7f670d9) at ../sysdeps/unix/sysv/linux/futex-internal.h:77
#6  futex_wait_simple (private=, expected=, futex_word=0x7ffff7f670d9) at ../sysdeps/nptl/futex-internal.h:135
#7  __pthread_rwlock_wrlock_slow (rwlock=0x7ffff7f670cd) at pthread_rwlock_wrlock.c:67
#8  0x00000000004046e3 in _memstat (offset=0x7fffdc0b11a5, func=0x0, lineno=0, size=134, flag=1 '\001') at tms_mem.c:107
#9  0x000000000040703b in TmsMemReallocExec (in=0x7fffdc0abb81, size=211, func=0x43f858  "_malloc_thread", lineno=478) at tms_mem.c:390
#10 0x000000000042a008 in _malloc_thread (arg=0x644c11) at tms_test.c:478
#11 0x000000000041a1d6 in _threadStarter (arg=0x644c51) at tms_mem.c:2384
#12 0x00007ffff79b96ba in start_thread (arg=0x7ffff28a7700) at pthread_create.c:333
#13 0x00007ffff76ef82d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109
(gdb) 

person Bob L    schedule 27.03.2017    source источник


Ответы (2)


Довольно сложно отлаживать то, что плохо документировано. Я пытался найти какую-либо полезную информацию о том, что «средство фьютекса вернуло непредвиденный код ошибки», но, похоже, это не указано в документации фьютекса. В моем случае это сообщение было сгенерировано sem_wait(sem), где sem не был допустимым указателем sem_t. Я случайно перезаписал его (память, указанную sem) некоторыми случайными целыми числами после инициализации sem с помощью sem_init(sem,1,1). Попробуйте проверить, передаете ли вы действительный указатель на функцию блокировки.

person Albert Mosiałek    schedule 17.05.2017

Я получал эту ошибку, когда объявлял мьютекс sem_t как локальную переменную.

person Pankaj    schedule 08.03.2020