C++ 在嵌入式Linux平台上使用std::string时出现Seg错误

C++ 在嵌入式Linux平台上使用std::string时出现Seg错误,c++,linux,string,segmentation-fault,arm,C++,Linux,String,Segmentation Fault,Arm,我在嵌入式Arm Linux平台上运行应用程序时遇到了一个问题,为此我工作了几天。不幸的是,这个平台使我无法使用任何常用的有用工具来找到确切的问题。当相同的代码在运行Linux的PC上运行时,我没有得到这样的错误 在下面的示例中,我可以通过取消对字符串、列表或向量行的注释来可靠地重现问题。让它们在应用程序运行到完成时留下注释结果。我希望有什么东西正在腐蚀堆,但我看不到什么?程序将运行几秒钟,然后出现分段错误 代码使用arm linux交叉编译器编译: arm-linux-g++ -Wall -o

我在嵌入式Arm Linux平台上运行应用程序时遇到了一个问题,为此我工作了几天。不幸的是,这个平台使我无法使用任何常用的有用工具来找到确切的问题。当相同的代码在运行Linux的PC上运行时,我没有得到这样的错误

在下面的示例中,我可以通过取消对字符串、列表或向量行的注释来可靠地重现问题。让它们在应用程序运行到完成时留下注释结果。我希望有什么东西正在腐蚀堆,但我看不到什么?程序将运行几秒钟,然后出现分段错误

代码使用arm linux交叉编译器编译:

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 );
}
#包括
#包括
#包括
#包括
使用名称空间std;
/////////////////////////////////////////////////////////////////////////////
类TestSeg
{
静态pthread_mutex_t_logLock;
公众:
TestSeg()
{
}
~TestSeg()
{
}
静态void*TestThread(void*arg)
{
int i=0;
而(i++<10000)
{
printf(“%d\n”,i);
写回(“函数”);
}
pthread_exit(NULL);
}
静态void WriteBad(const char*s函数)
{
pthread_mutex_lock(&_logLock);
printf(“%s\n”,sffunction);

//string sKiller;//您没有说明PTHREAD\u MUTEX\u初始值设定项是什么,但是您是否在TestSeg::\u logLock上调用PTHREAD\u MUTEX\u init?如果您使用的是未初始化的互斥体,那么这些构造函数的堆栈和/或堆操作可能会干扰您的互斥体。

可能您使用的是stan的单线程版本dard库,包括
新建
删除
操作符

这些对象是在互斥锁的保护范围内构造的,但在这些边界之外被破坏,因此析构函数可能会相互碰撞。一个快速测试是在
killer
的声明周围放置范围括号
{}


有关更多信息,请参阅。

您是否尝试过-Os和-O0?您的arm-linux-g++--版本是什么?

在为嵌入式arm linux平台开发和调试分段故障时,我经常添加代码以打印信号处理程序中的堆栈。也许我描述的实现对您有一些用处。

我使用以下gcc/g++选项(以及其他选项)进行构建:


您是否检查过std::string在平台上没有pthreads的情况下工作?并且尝试过,比如说,2个线程而不是100个线程?是的,太多的线程可能是seg故障的原因。感谢响应人员。是的,我尝试过几个线程。显示问题需要更长的时间,但仍然会发生。std::string确实工作(据我所见)在平台上。静态互斥体会导致任何问题吗?我看不出任何其他变量会导致任何问题,因为它们被保留在静态函数的范围内。@Brad:您是否缺少
gcc
-pthread
标志?
pthread\u mutex\u初始值设定项
是静态初始化POSIX互斥体的标准方法t不调用
pthread\u mutex\u init(3)
。谢谢你的建议。我尝试过使用作用域括号,问题就解决了。这是在互斥体保护中声明对象的推荐方法,还是我做了一些根本错误的事情?当调用“arm-linux-g++-v”时它只生成版本,根本不列出--启用线程。这是否意味着我使用的是单线程版本?由于我没有更改交叉编译器的选项(提供程序仅支持此版本),我的最佳做法是什么?什么版本的“arm-linux-g++-v”屈服?传递
-v
选项只会打印我的gcc 2.95.2 Arm交叉编译器的版本号,但是
-v
选项列出了我的gcc 3.4.5 Arm交叉编译器的
--enable threads=posix
。嗨,jschmier,很抱歉,我已经离开项目一段时间了,现在回头看看这个问题。像你一样,帕辛g-v只打印版本号。不幸的是,我仅限于使用gcc 2.95.2 Arm交叉编译器,因为这是供应商对其嵌入式平台的所有支持。您的交叉编译器是否也有同样的问题?您是如何解决的?谢谢
arm-linux-g++ -Wall -pipe -rdynamic -fno-omit-frame-pointer test.cpp -o test