Smart answer needed for strange segmentation fault

2019-08-10 00:58发布

The last couple of days I've been working on a strange segmentation fault. The following code works just fine on my PC running Linux. But using the ARM crosscompiler suppplied by the manufactor of our embedded device, it gives a segmentation fault in routine s(). The SIGSEGV occurs at the destruction of a std::string. This also happens if you pass it as a variable. However, with non STL classes (e.g. int) it all works fine.

The code is compiled using an ARM cross compiler


arm-linux-g++ -Wall -otest -lpthread
arm-linux-strip test

All suggestions are welcome!


using namespace std;

void *ExecuteThreadMethod(void *AThread);

class Thread
{
  private:
    pthread_t internalThread;
    sem_t finishedSemaphore;
  public:
    bool Terminated;
    Thread()
    {
      Terminated = false;
      sem_init (&finishedSemaphore, 0, 0);
    }
    ~Thread()
    {
      sem_destroy (&finishedSemaphore);
    }

    void RunSigSegv() // <----- with the try...catch it causes a SIGSEGV in routine s() below
    {
      try
      {
        while (!Terminated)
        {
          cout << "ExecuteLooped" << endl;
        }
        sem_post(&finishedSemaphore);
      }
      catch(...)
      {
      }
    }

    void RunOk() // <----- without the try...catch, it runs fine
    {
      while (!Terminated)
      {
        cout << "ExecuteLooped" << endl;
      }
      sem_post(&finishedSemaphore);
    }

    void Start()
    {
      pthread_attr_t _attr;

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

    void Terminate()
    {
      Terminated = true;
      sem_wait(&finishedSemaphore);
    }
};

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

Thread _thread;

void s()
{
  string Test;
  _thread.Start();
} // <----- destruction of std::string Test causes a SIGSEGV, without try...catch in the thread this doesn't happen

void t()
{
  _thread.Terminate();
}

int main(void)
{
  s();
  t();
}

1条回答
Evening l夕情丶
2楼-- · 2019-08-10 01:49

Do not use -lpthread. This merely links with the library which provides the thread handling functions. Full threading support may require more than that, e.g. linking with a specially thread-safe version of libstdc++, or reserving a specific register for thread-local variable access.

With gcc or g++, use the -pthread command-line flag, both for compilation and for linking. This will instruct gcc to do whatever is necessary to enable reliable threading, including, but not limited to, adding the -lpthread flag when required.

查看更多
登录 后发表回答