gpt4 book ai didi

c++ - 在嵌入式 Linux 平台上使用 std::string 时出现段错误

转载 作者:IT王子 更新时间:2023-10-29 00:31:21 26 4
gpt4 key购买 nike

几天来,我一直在处理我的应用程序在嵌入式 Arm Linux 平台上运行的问题。不幸的是,该平台阻止我使用任何常用的有用工具来查找确切的问题。在运行 Linux 的 PC 上运行相同的代码时,我没有得到这样的错误。

在下面的示例中,我可以通过取消对字符串、列表或 vector 行的注释来可靠地重现问题。留下他们的评论会导致应用程序运行完成。我预计有什么东西正在破坏堆,但我看不到什么?该程序将运行几秒钟,然后出现段错误。

代码是使用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 );
}

最佳答案

也许您正在使用标准库的单线程版本,包括 newdelete 运算符?

这些对象是在你的互斥量的保护范围内构建的,但在这些范围之外被破坏了,所以析构函数可能会互相踩踏。一项快速测试是在 killer 的声明周围放置范围括号 {}

参见 the gcc documentation了解更多。

关于c++ - 在嵌入式 Linux 平台上使用 std::string 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2412667/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com