1

組み込み Linux OS (uclinux、mips CPU) でプロジェクトを開発していますが、ときどきクラッシュしました。gdb でコアダンプを確認しようとすると、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 個のスレッドは、デッド ループでロックおよびロック解除するだけで、バグは何もしません。死ななかった。

何か提案はありますか?

4

0 に答える 0