Trycatch вызывает ошибку сегментации на встроенном ARM с потоками posix

Сегодня я опубликовал проблему с ошибкой сегментации после уничтожения std::string (см. этот пост). Я удалил код, чтобы не использовать STL, и иногда все еще возникает ошибка сегментации.

Следующий код отлично работает на моем ПК под управлением Linux. Но использование кросскомпилятора ARM, предоставленного производителем нашего встраиваемого устройства, приводит к ошибке сегментации непосредственно перед catch (...).

Похоже, что эта проблема связана с это сообщение в группах Google, но я пока не нашел решения.

Код компилируется с помощью кросс-компилятора ARM.

Любые предложения по-прежнему приветствуются!


#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void *ExecuteThreadMethod(void *AThread);

class Thread
{
  private:
    pthread_t internalThread;
  public:
    void RunSigSegv()
    {
      try
      {
        for (int i = 0; i < 200; i++)
        {
          usleep(10000);
        }
      } // <---- Segmentation fault occurs here
      catch(...)
      {
      }
    }

    void Start()
    {
      pthread_attr_t _attr;

      pthread_attr_init(&_attr);
      pthread_attr_setdetachstate(&_attr, PTHREAD_CREATE_DETACHED);
      pthread_create (&internalThread, &_attr, ExecuteThreadMethod, this);
    }
};

void *ExecuteThreadMethod(void *AThread)
{
  ((Thread *)AThread)->RunSigSegv();
  pthread_exit(NULL);
}

Thread _thread1;
Thread _thread2;
Thread _thread3;
Thread _thread4;

void s()
{
  _thread1.Start();
  _thread2.Start();
  _thread3.Start();
  _thread4.Start();
}

int main(void)
{
  s();
  usleep(5000000);
}


person Laurens    schedule 18.10.2010    source источник


Ответы (2)


Однажды я столкнулся с такой проблемой, которая была вызвана компоновкой с версией libstdc++ без поддержки потоков, что означает, что все потоки используют общий стек обработки исключений с катастрофическими последствиями.

Убедитесь, что кросс-компилятор и его библиотеки настроены с --enable-threads=posix.

person Mike Seymour    schedule 18.10.2010
comment
Этот фрагмент кода скомпилирован без ‹code›libstdc++‹/code›. Он не должен использовать какие-либо подпрограммы STL (насколько я знаю). - person Laurens; 18.10.2010
comment
@Laurens: он будет включен неявно при связывании с g++; он необходим для поддержки различных языков, включая обработку исключений, а также для стандартной библиотеки. - person Mike Seymour; 18.10.2010

Просто диагностический вопрос: что произойдет, если вы не отсоедините поток в Start ()? Вам придется pthread_join() возвращать потоки обратно в main().

Кроме того, рассмотрели ли вы темы Boost? Это может быть более подходящим, поскольку вы используете C++, а не C.

person chrisaycock    schedule 18.10.2010
comment
К сожалению, я пробовал это с присоединяемыми потоками, и это не имеет значения. - person Laurens; 18.10.2010