Последние пару дней я работал над странной ошибкой сегментации.Следующий код отлично работает на моем ПК под управлением Linux.Но с использованием кросс-компилятора ARM, поставляемого производителем нашего встроенного устройства, он дает ошибку сегментации в подпрограмме s ().SIGSEGV происходит при уничтожении std :: string.Это также происходит, если вы передаете его как переменную.Однако с классами, отличными от STL (например, int), все работает нормально.
Код скомпилирован с использованием кросс-компилятора ARM
arm-linux-g++ -Wall -otest -lpthread
arm-linux-strip test
Все предложения приветствуются!
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();
}