Tôi đã làm việc trong một vài ngày về một vấn đề với ứng dụng của tôi đang chạy trên nền tảng Arm Linux được nhúng. Thật không may nền tảng này ngăn cản tôi sử dụng bất kỳ công cụ hữu ích thông thường nào để tìm ra vấn đề chính xác. Khi cùng một mã được chạy trên PC chạy Linux, tôi không nhận được lỗi như vậy.Lỗi khi sử dụng std :: string trên nền tảng Linux nhúng
Trong ví dụ bên dưới, tôi có thể tái tạo lại vấn đề một cách đáng tin cậy bằng cách bỏ ghi chú chuỗi, danh sách hoặc đường vectơ. Để họ nhận xét kết quả trong ứng dụng đang chạy để hoàn thành. Tôi hy vọng rằng một cái gì đó đang làm hỏng đống, nhưng tôi không thể nhìn thấy cái gì? Chương trình sẽ chạy trong vài giây trước khi đưa ra lỗi phân đoạn.
Mã này được biên soạn bằng cách sử dụng trình biên dịch chéo cánh tay-linux:
arm-linux-g++ -Wall -otest fault.cpp -ldl -lpthread
arm-linux-strip test
Bất kỳ ý tưởng đánh giá cao.
#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);
}
có bạn kiểm tra std :: string hoạt động mà không pthreads trên bục giảng? –
Và cố gắng, nói rằng, 2 chủ đề thay vì 100? – indiv
có, quá nhiều luồng là nguyên nhân có khả năng gây ra lỗi seg. –