我已经在我的应用程序在嵌入式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 );
}
答案 0 :(得分:5)
也许您正在使用标准库的单线程版本,包括new
和delete
运算符?
这些对象是在互斥锁的守卫内构建的,但是在这些边界之外被破坏,因此析构函数可能会互相踩踏。一个快速测试是在{}
的声明周围放置范围括号killer
。
有关详情,请参阅the gcc documentation。
答案 1 :(得分:0)
您没有说PTHREAD_MUTEX_INITIALIZER是什么,但是您是否在TestSeg :: _ logLock上调用pthread_mutex_init?如果您使用的是未经初步化的互斥锁,那么这些构造函数的堆栈和/或堆操作会干扰您的互斥锁。
答案 2 :(得分:0)
你有没有尝试-Os和-O0?什么是你的arm-linux-g ++ --version?
答案 3 :(得分:0)