Попробуйте ... catch вызывает ошибку сегментации во встроенном ARM с потоками posix - PullRequest
1 голос
/ 18 октября 2010

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

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

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

Код скомпилирован с использованием кросс-компилятора ARM

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


&#35;include <stdlib.h>
&#35;include <stdio.h>
&#35;include <pthread.h>
&#35;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);
}

Ответы [ 2 ]

1 голос
/ 18 октября 2010

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

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

0 голосов
/ 18 октября 2010

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

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

...