임베디드 암 Linux 플랫폼에서 실행되는 응용 프로그램 문제로 며칠 동안 작업했습니다. 불행하게도이 플랫폼은 정확한 문제를 찾는 데 유용한 도구를 사용하지 못하도록합니다. Linux를 실행하는 PC에서 동일한 코드를 실행하면 오류가 발생하지 않습니다.임베디드 Linux 플랫폼에서 std :: string을 사용할 때의 Seg 오류
아래 예제에서 문자열, 목록 또는 벡터 선의 주석을 제거하여 문제를 확실히 재현 할 수 있습니다. 주석 처리 된 상태로두면 응용 프로그램이 완료 될 때까지 실행됩니다. 무언가가 힙을 손상 시키길 기대하지만, 나는 무엇을 볼 수 없습니까? 세그먼테이션 오류가 발생하기 전에 프로그램이 몇 초 동안 실행됩니다.
코드
는 아암 리눅스 크로스 컴파일러를 이용하여 컴파일된다arm-linux-g++ -Wall -otest fault.cpp -ldl -lpthread
arm-linux-strip test
어떤 아이디어가 크게 감사.
#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);
}
당신이 표준을 확인했다 :: 캐릭터 라인은, 플랫폼에의 pthreads없이 작동? –
그리고 100 개 대신 2 개의 스레드를 시도 했습니까? – indiv
예, 너무 많은 스레드가 seg 오류의 원인 일 수 있습니다. –