Ich habe seit ein paar Tagen an einem Problem mit meiner Anwendung auf einer Embedded Arm Linux-Plattform gearbeitet. Leider schließt die Plattform mich von den üblichen nützlichen Tools aus, um das genaue Problem zu finden. Wenn derselbe Code auf dem PC mit Linux ausgeführt wird, erhalte ich keinen solchen Fehler.Seg Fault bei der Verwendung von std :: string auf einer Embedded-Linux-Plattform
In dem folgenden Beispiel kann ich das Problem zuverlässig reproduzieren, indem Sie die Zeichenfolge, die Liste oder die Vektorlinien auskommentieren. Sie haben die kommentierten Ergebnisse in der Anwendung zum Abschluss gebracht. Ich erwarte, dass etwas den Haufen verderbt, aber ich kann nicht sehen was? Das Programm wird einige Sekunden lang ausgeführt, bevor ein Segmentierungsfehler ausgegeben wird.
Der Code wird mit einem Arm-Linux-Cross-Compiler kompiliert:
arm-linux-g++ -Wall -otest fault.cpp -ldl -lpthread
arm-linux-strip test
Irgendwelche Ideen sehr geschätzt.
#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);
}
Sie std überprüft haben :: string funktioniert ohne pThreads auf der Plattform? –
Und versuchte, sagen wir, 2 Fäden statt 100? – indiv
Ja, zu viele Threads sind eine wahrscheinliche Ursache für den Seg-Fehler. –