我正在嵌入式 linux 操作系统(uclinux,mips CPU)上开发一个项目,它偶尔会崩溃。当我尝试使用 gdb 检查 coredump 时,我可以看到它收到了 SIGILL 信号。
有时我可以看到回溯,这表明它在 pthread_mutex_lock 中死亡。但大多数时候,回溯是无效的。
有效的回溯
(gdb) bt
#0 <signal handler called>
#1 0x2ab87fd8 in sigsuspend () from /lib/libc.so.0
#2 0x2aade80c in __pthread_wait_for_restart_signal () from /lib/libpthread.so.0
#3 0x2aadc7ac in __pthread_alt_lock () from /lib/libpthread.so.0
#4 0x2aad81a4 in pthread_mutex_lock () from /lib/libpthread.so.0
#5 0x0042fde8 in aos_mutex_lock (mutex=0x66bea8) at ../../source/ssp/os/sys/linux/aos_lock_linux.c:184
无效回溯
(gdb) bt
#0 0x00690430 in ?? ()
#1 0x00690430 in ?? ()
我使用 pthread_attr_setstackaddr 为每个线程初始化一个堆栈,这样我就可以通过检查它的堆栈来看到它的调用帧。另外,我发现它死在 pthread_mutex_lock 中。
我使用包装器进行锁定和解锁,例如
struct aos_mutex_t
{
pthread_mutex_t mutex;
S8 obj_name[AOS_MAX_OBJ_NAME];
S32 lFlag;
};
S32 aos_mutex_lock(AOS_MUTEX_T *mutex)
{
S32 status;
AOS_ASSERT_RETURN(mutex, AOS_EINVAL);
mutex->lFlag++;
status = pthread_mutex_lock( &mutex->mutex );
if (status == 0)
{
return AOS_SUCC;
}
else
{
return AOS_RETURN_OS_ERROR(status);
}
}
/*
* aos_mutex_unlock()
*/
S32 aos_mutex_unlock(AOS_MUTEX_T *mutex)
{
S32 status;
AOS_ASSERT_RETURN(mutex, AOS_EINVAL);
status = pthread_mutex_unlock( &mutex->mutex );
mutex->lFlag--;
if (status == 0)
return AOS_SUCC;
else
{
return AOS_RETURN_OS_ERROR(status);
}
}
所有这些互斥锁都是在使用它们之前启动的。
我试过 gdb 运行程序,它没有死。
我写了一个简单的程序,11个线程什么都不做,只是在死循环中锁定和解锁。它没有死。
有什么建议吗?