Ho lavorato per un paio di giorni su un problema con la mia applicazione in esecuzione su una piattaforma Arm Linux incorporata. Purtroppo la piattaforma mi impedisce di utilizzare uno dei soliti strumenti utili per trovare il problema esatto. Quando lo stesso codice viene eseguito sul PC con Linux, non ottengo alcun errore di questo tipo.Seg Errore quando si utilizza std :: string su una piattaforma Linux incorporata
Nell'esempio seguente, posso riprodurre in modo affidabile il problema rimuovendo la stringa, l'elenco o le linee vettoriali. Lasciandoli i risultati commentati nell'applicazione in esecuzione fino al completamento. Mi aspetto che qualcosa stia corrompendo il mucchio, ma non riesco a vedere cosa? Il programma verrà eseguito per alcuni secondi prima di dare un errore di segmentazione.
il codice viene compilato utilizzando un cross compilatore braccio-linux:
arm-linux-g++ -Wall -otest fault.cpp -ldl -lpthread
arm-linux-strip test
Tutte le idee molto apprezzato.
#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);
}
Hai controllato std :: string funziona senza pthreads sulla piattaforma? –
E provato, ad esempio, 2 thread anziché 100? – indiv
sì, troppi thread è una probabile causa dell'errore del segmento. –