Bonjour,
j'essaye d'atteindre un point d'arrêt situé assez tôt dans mon code, mais je n'y arrive pas. Je pensais que gdb ne se débrouillait pas avec les templates C++ mais ça a l'air d'aller, je pense donc que c'est un problème de pointeurs de fonction. En effet le nom de la fonction à exécuter (ici "doit") est déterminée à l'exécution. Extraits de code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
int main(int argc,const char **argv)
{
   ABM proc(params...);
   proc.execute(fileinr);
   return EXIT_SUCCESS;
}
Ici l'endroit où j'ai mon point d'arrêt :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
template <class T>
bool doit( Process & process, const string & fileinr, Finder & )
{
    //stuff
    return(1);
}
Le lien entre les deux : ABM est un fils de Process, et son unique constructeur comporte :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
registerProcessType( "Volume", "S8", &doit<int8_t> );
registerProcessType( "Volume", "U8", &doit<uint8_t> );
registerProcessType( "Volume", "S16", &doit<int16_t> );
registerProcessType( "Volume", "U16", &doit<uint16_t> );
registerProcessType( "Volume", "S32", &doit<int32_t> );
registerProcessType( "Volume", "U32", &doit<uint32_t> );
registerProcessType( "Volume", "FLOAT", &doit<float> );
registerProcessType( "Volume", "DOUBLE", &doit<double> );
registerProcessType( "Volume", "RGB", &doit<int16_t> );
registerProcessType( "Volume", "RGBA", &doit<int16_t> );
"" de Process est défini comme suit :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
bool Process::execute( const string & filename )
{
 Finder    f;
 if( !f.check( filename ) )
   {
     f.launchException();
     throw format_error( filename );
     return( false );
   }
 return( execute( f, filename ) );
}
 
 
bool Process::execute( Finder & f, const string & filename )
{
 string    otype = f.objectType();
 string    dtype = f.dataType();
 
 map<string, map<string, ProcFunc> >::const_iterator   
   ip = _execs.find( otype );
 if( ip == _execs.end() )
   {
     throw datatype_format_error( string( "unsupported data type " )                       + otype + " / " + dtype, filename );
     return( false );
   }
 map<string, ProcFunc>::const_iterator  ip2 = (*ip).second.find( dtype );
 if( ip2 == (*ip).second.end() )
   {
     // Try alternate data types
     vector<string>    posstypes = f.possibleDataTypes();
     unsigned        i, n = posstypes.size();
 
     for( i=0; i<n; ++i )
    if( posstypes[i] != dtype )
      {
        ip2 = (*ip).second.find( posstypes[i] );
        if( ip2 != (*ip).second.end() )
          {
        // force new datatype into finder
        f.setDataType( posstypes[i] );
        break;
          }
      }
     if( i == n )
    {
      throw datatype_format_error( string( "unsupported data type " )                      + otype + " / " + dtype, filename );
      return( false );
    }
   }
 
 //    execute process function
 return( (*ip2).second( *this, filename, f ) );
}

Donc enfin la question : comment placer correctement mon point d'arrêt, puissque la méthode "breakpoint cheminSource/nomSource.extensionSource:numeroDeLigne" ne marche pas dans ce cas-ci. Je suis pour l'instant obligé de faire du pas à pas, ce qui combiné à du parallélisme est très très vite lassant... problème assez classique mais je n'ai rien trouvé sur le net!

D'avance merci,
AM