c++ - que - Seg Fault al usar std:: string en una plataforma Linux incorporada
programacion linux principiantes (4)
¿Tal vez está utilizando una versión de subproceso único de la biblioteca estándar, incluidos los operadores new
y delete
?
Esos objetos se están construyendo dentro de las protecciones de su mutex, pero se destruyen fuera de esos límites, por lo que los destructores podrían pisar el uno al otro. Una prueba rápida sería colocar corchetes de delimitación {}
alrededor de la declaración de killer
.
Consulte la documentación de gcc para obtener más información.
He estado trabajando durante un par de días en un problema con mi aplicación ejecutándose en una plataforma incorporada de Arm Linux. Lamentablemente, la plataforma me impide utilizar cualquiera de las herramientas útiles habituales para encontrar el problema exacto. Cuando se ejecuta el mismo código en la PC con Linux, no recibo tal error.
En el ejemplo siguiente, puedo reproducir el problema de manera confiable al descomentar las líneas de cadena, lista o vector. Dejándoles comentarios comentados en la aplicación que se ejecuta hasta su finalización. Supongo que algo está corrompiendo el montón, pero no puedo ver qué? El programa se ejecutará durante unos segundos antes de dar un error de segmentación.
El código se compila utilizando un compilador cruzado arm-linux:
arm-linux-g++ -Wall -otest fault.cpp -ldl -lpthread
arm-linux-strip test
Cualquier idea muy apreciada.
#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 );
}
No dice qué es PTHREAD_MUTEX_INITIALIZER, pero ¿está llamando a pthread_mutex_init en TestSeg :: _ logLock? Es posible si está utilizando un mutex no identificado que las operaciones de pila y / o montón de esos constructores están interfiriendo con su mutex.
¿Has probado -Os y -O0? ¿Cuál es tu brazo-linux-g ++ --version?
Al desarrollar y depurar fallas de segmentación para una plataforma Arm Linux incorporada, a menudo agrego código para imprimir una traza inversa desde el manejador de señal SIGSEGV
. Tal vez la implementación que describo aquí pueda ser de alguna utilidad para usted.
Construyo con las siguientes opciones gcc / g ++ (entre otras):
arm-linux-g++ -Wall -pipe -rdynamic -fno-omit-frame-pointer test.cpp -o test