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 :
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 int main(int argc,const char **argv) { ABM proc(params...); proc.execute(fileinr); return EXIT_SUCCESS; }
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 template <class T> bool doit( Process & process, const string & fileinr, Finder & ) { //stuff return(1); }
"
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 execute
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
Partager