Gömülü bir Arm Linux platformunda çalışmamdaki bir uygulamayla ilgili bir kaç gün için çalışıyorum. Ne yazık ki platform, kesin sorunu bulmak için her zamanki yararlı araçlardan herhangi birini kullanmamı engelliyor. Linux çalıştıran PC'de aynı kod çalıştırıldığında, böyle bir hata almıyorum.Seg Hata, gömülü Linux platformunda std :: string kullanırken
Aşağıdaki örnekte, dizeyi, liste veya vektör satırlarını rahatsız ederek sorunu güvenilir bir şekilde yeniden oluşturabilirim. Onları bırakmak, uygulamanın tamamlanmaya kadar devam etmesini sağlar. Bir şeyin yığılmayı bozduğunu umuyorum ama ne göremiyorum? Program bir segmentasyon hatası vermeden önce birkaç saniye çalışacaktır.
kod
bir kol Linux çapraz derleyici derlenir:arm-linux-g++ -Wall -otest fault.cpp -ldl -lpthread
arm-linux-strip test
bir fikir büyük takdir.
#include <stdio.h>
#include <vector>
#include <list>
#include <string>
using namespace std;
/////////////////////////////////////////////////////////////////////////////
class TestSeg
{
static pthread_mutex_t _logLock;
public:
TestSeg()
{
}
~TestSeg()
{
}
static void* TestThread(void *arg)
{
int i = 0;
while (i++ < 10000)
{
printf("%d\n", i);
WriteBad("Function");
}
pthread_exit(NULL);
}
static void WriteBad(const char* sFunction)
{
pthread_mutex_lock(&_logLock);
printf("%s\n", sFunction);
//string sKiller; // <----------------------------------Bad
//list<char> killer; // <----------------------------------Bad
//vector<char> killer; // <----------------------------------Bad
pthread_mutex_unlock(&_logLock);
return;
}
void RunTest()
{
int threads = 100;
pthread_t _rx_thread[threads];
for (int i = 0 ; i < threads ; i++)
{
pthread_create(&_rx_thread[i], NULL, TestThread, NULL);
}
for (int i = 0 ; i < threads ; i++)
{
pthread_join(_rx_thread[i], NULL);
}
}
};
pthread_mutex_t TestSeg::_logLock = PTHREAD_MUTEX_INITIALIZER;
int main(int argc, char *argv[])
{
TestSeg seg;
seg.RunTest();
pthread_exit(NULL);
}
Eğer std kontrol ettikten :: dize platformda Pthreads olmadan çalışır? –
Ve 100 yerine 2 iş parçacığı denediniz mi? – indiv
evet, çok fazla iş parçacığı, seg hatasının olası bir nedenidir. –