Salut à tous,
Mon algorithme en c++ compile bien mais lors de l exécution il me gènére une erreur de segmentation. est ce que quelqu'un a déjà rencontré ce type de message ?
Merci .
Version imprimable
Salut à tous,
Mon algorithme en c++ compile bien mais lors de l exécution il me gènére une erreur de segmentation. est ce que quelqu'un a déjà rencontré ce type de message ?
Merci .
A peu près 100% des développeurs C/C++ l'ont déjà vue, cette erreur, t'inquiète pas... :mouarf:
Tu as dû déréférencer un pointeur non-initialisé, ou taper "trop loin" après une structure ou un container (aller au delà de sa taille). Mais bon, sans le code et la ligne indiquée pour l'erreur, difficile d'être plus précis.
oui clair qu'entre celle là et les autre memory fault , bus error, ...
petite aide pour trouver la cause de l'erreur
http://www.cmi.univ-mrs.fr/~contensi...=env&page=deb5
Salut,
L'erreur de segmentation est sans doute une des erreurs les plus courantes à l'exécution.
Elle survient généralement de manière aléatoire parce que, à un moment, tu essaye d'aller "chipoter" à une adresse mémoire qui n'est plus utilisée dans le contexte où tu essaye d'y accéder.
Le plus souvent, elle est due:
Comme tu peux le remarquer, son origine est très souvent un pointeur ;)
- à un pointeur détruit non remis à zéro,
- à un pointeur NULL non testé,
- à une tentative d'accès au Nieme élément d'une collection qui n'en contient que maximum N-1,
- à une tentative d'accès à un objet pointé par un pointeur qui n'a pas été correctement initialisé (à NULL s'il pointe vers un objet inexistant ou à une valeur correspondant réellement à l'adresse à laquelle se trouve un objet du type adéquat).
Mais, au delà de cela, il faudrait au moins une partie du code pour arriver à en déterminer la cause.
Le plus embêtant de l'histoire, c'est que l'erreur qui finit par provoquer la faute de segmentation est parfois très éloignée du point où elle apparait :P
Merci pour vos réponses, je vais revoir tous les pointeurs de mon code et les containers, et essayer la solution de jabbounet. sinon j envoyerai mon code.
Salut,
bon idee est aussi lancer ton program sous debuger :P
(ou bien ... utiliser "memory checker" comme valgrind etc. mais c'est plus difficile et c'est la solution seulement pour linux).
Fredy
j'ai lancé mon programme avec gdb comme suit :
je ne sais pas j'arrive toujours pas à cerner l erreur? :cry:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 anne@anne-desktop:~/Bureau/paradiseo-1.2.1/paradiseo-eo/build/tutorial/FeatureSelection2$ gdb ./FeatureSelectionEA GNU gdb 6.6-debian Copyright (C) 2006 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i486-linux-gnu"... Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1". (gdb) run Starting program: /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build/tutorial/FeatureSelection2/FeatureSelectionEA Loading model from file ... No such file or directory Program exited with code 01. (gdb) run Starting program: /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build/tutorial/FeatureSelection2/FeatureSelectionEA Loading model from file ... No such file or directory Program exited with code 01.
Fredy Kruger est ce que vous pouvez m'expliquer svp comment je peux utiliser "memory checker parce que je suis sous lunix? Merci
voilà je vous envoie les classes dont je suis sure que l'erreur vient de l'une d'elle.
est ce que quelqu'un peut m'aider?
Salut,
Je n'ai pas tout analysé mais il y au - un truc qui me parait bizarre et qui pourrait expliquer ton problème (ou un futur problème).
Dans eoFeatureSelectionClone.h, dans la fonction void apply(eoPopulator<GenotypeT>&_pop) , tu écris :
Puis ta boucle :Code:_pop.reserve(1000);
Tu fais donc 1100 itérations si je ne m'abuses. Ne serait-ce pas plutôt :Code:
1
2
3
4
5 while (j!=100) { // .... for(unsigned i=0;i<=10;i++) }
Code:
1
2
3
4
5 while (j!=100) { // .... for(unsigned i=0;i<10;i++) }
Salut,
1. Ca c'est quoi ?
Starting program: /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build/tutorial/FeatureSelection2/FeatureSelectionEA
Loading model from file ...
No such file or directory
?????
2. Valgrind
Il faut le telecharger de http://valgrind.org/ et apres lancer "la Sainte Trinité" .... c'est-à-dire
configure ; make ; make install :mouarf:
Moi, je lance valgrind comme ca :
valgrind --leak-check=full --show-reachable=yes --log-file=resultat_in_txt.txt ./binary_a_lancer
Bonne chance. Fredy
( et excusez ma langue francaise )
merci 3DArchi c vrai c'est l'une des erreurs que je mes suis pas rendu compte d eux! en fait c'est un algorithme évolutionnaire qui crée pour chaque individu dix copies, et comme une population comporte 100 individus on va obtenir 1000! et c vrai que ≤ est fausse!
mais ça n empeche le problème d erreur de segmentation persiste encore :(
merci fredy! je vais essayer ce que vous m'aviez proposé!
Pour gdb :
compile avec -g;
essaye insight ou ddd, moins galère à utiliser au début.
Ou alors, fais un mode TRACE :
à chaque début de fonction ou méthode :
et compile avec -D TRACE.Code:
1
2
3
4 #ifdef TRACE std::cout<<"Entré dans fonction"<<std::endl; #endif
Ou enfin, plus dure, regarde du coté de la gestion des execptions...
merci lavock! j'ai essayé toutes ces solutions mais aucune ne marchent pour moi.
pour TRACE j ai fait ce que vous m'avez indiqué mais lorsque je tape make -D TRACE pour compiler cela m 'affiche qu il n y a pas d option de type -D :?
Il n'y a pas d'espace entre D et TRACE : -DTRACE
L'espace est optionel, c'est surtout que tu ne doit pas l'invoquer sur le make mais sur ton compilateur.
Modifie ton Makefile est rajoute ceci à la fin de CXXFLAGS ou de ta ligne de compilation.
Parce que, si je ne m'abuse, la question à été posé par quelqu'un qui ne maîtrise pas encore tout bien. Et le mode trace apporte, pédagogiquement, un intérêt bien plus subtile que le debug (qui de plus s'avère relativement dur à maîtriser pour les débutants).
Mais dans l'ensemble, je suis bien d'accord, une fois GDB maîtriser, le trace est à bannir !
ça apprend a mettre des printf partout dans le code encadré par des directives de compilation....
bref ça peu réduire a lisibilité du code.
pour le débugger pas besoin de le maitriser complètement pour savoir ou ça plante.
Avec un programme compilé et linké avec l'option -g
et une fois dans le debugger tu tappe la commande "bt" pour avoir la pile d'appel et donc la méthode ou ça plante ainsi que la ligne.Code:
1
2
3
4
5 $ulimit -c unlimited $./monprogrammme_qui_plante .... --> genère un fichier core. $gdb monprogrammme_qui_plante <le fichier core genéré précédement>
tu as aussi ses appelant qui sont parfois fautif aussi de fournir des paramètres invalide.
Non, c'est surtout que ça montre de façon rudimentaire et précise comment les appels s'enchaine.
A vrai dire, je ne connaissait pas trop ulimit (vite fait le nom). La question est :
Crois tu vraiment que quelqu'un qui ne maîtrise pas le compilateur (et qui vient surement d'un autre langage style java), arrivera à exploiter le résultat de la commande bt ?
Quoi qu'il en soit, annesophiedecar, pourrais tu, s'il de plait, nous écrire ton Makefile pour qu'on te dise quoi mettre dedans, et ainsi être complet ?
c'est juste pour indiquer que le système peu pondre des fichiers coredump (pour faire des debug post mortem)Citation:
A vrai dire, je ne connaissait pas trop ulimit
je l'ai indiqué au cas ou le compte est configuré par défaut pour ne pas en générer.
Cette commande est parfois utile, car elle peu gérer quelques limites sur les compte utilisateurs (nombre de descripteurs de fichier ouvert simultanément par exemple)
oui je pense.
si l'option -g est positionnée à la compilation, tu as la liste des fonctions qui ont été appelées au moment du plantage ainsi que la ligne dans le fichier source.
il suffit ensuite d'aller dans les fichiers pour regarder.
Merci pour votre aide, effectivement je suis assez débutante en c++ et surtout aussi en lunix:( et surtout ce qui me dérange c'est que j'arrive nullement pas encore à cerner l'erreur d'ou elle peut venir:(
voilà je vous envoie mon Makefile. Je vous suis vraiment reconnaissante pour tous vos efforts.
Merci
Mon makefileCode:
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246 # CMAKE generated file: DO NOT EDIT! # Generated by "Unix Makefiles" Generator, CMake Version 2.6 # Default target executed when no arguments are given to make. default_target: all .PHONY : default_target #============================================================================= # Special targets provided by cmake. # Disable implicit rules so canoncical targets will work. .SUFFIXES: # Remove some rules from gmake that .SUFFIXES does not remove. SUFFIXES = .SUFFIXES: .hpux_make_needs_suffix_list # Suppress display of executed commands. $(VERBOSE).SILENT: # A target that is always out of date. cmake_force: .PHONY : cmake_force #============================================================================= # Set environment variables for the build. # The shell in which to execute make rules. SHELL = /bin/sh # The CMake executable. CMAKE_COMMAND = /usr/local/bin/cmake # The command to remove a file. RM = /usr/local/bin/cmake -E remove -f # The top-level source directory on which CMake was run. CMAKE_SOURCE_DIR = /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo # The top-level build directory on which CMake was run. CMAKE_BINARY_DIR = /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build #============================================================================= # Targets provided globally by CMake. svm.o: /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build/lib/libsvm-2.82/svm.cpp /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build/lib/libsvm-2.82/svm.h $(CXXC) $(CFLAGS) -c /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build/lib/libsvm-2.82/svm.cpp # Special rule for the target edit_cache edit_cache: @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running interactive CMake command-line interface..." /usr/local/bin/cmake -i . .PHONY : edit_cache # Special rule for the target edit_cache edit_cache/fast: edit_cache .PHONY : edit_cache/fast # Special rule for the target rebuild_cache rebuild_cache: @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." /usr/local/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) .PHONY : rebuild_cache # Special rule for the target rebuild_cache rebuild_cache/fast: rebuild_cache .PHONY : rebuild_cache/fast # Special rule for the target test test: @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." /usr/local/bin/ctest --force-new-ctest-process $(ARGS) .PHONY : test # Special rule for the target test test/fast: test .PHONY : test/fast # The main all target all: cmake_check_build_system cd /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build/CMakeFiles /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build/tutorial/FeatureSelection2/CMakeFiles/progress.make cd /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build && $(MAKE) -f CMakeFiles/Makefile2 tutorial/FeatureSelection2/all $(CMAKE_COMMAND) -E cmake_progress_start /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build/CMakeFiles 0 .PHONY : all #svm.o: svm.cpp svm.h # $(CXXC) $(CFLAGS) -c svm.cpp # The main clean target clean: cd /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build && $(MAKE) -f CMakeFiles/Makefile2 tutorial/FeatureSelection2/clean .PHONY : clean # The main clean target clean/fast: clean .PHONY : clean/fast # Prepare targets for installation. preinstall: all cd /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build && $(MAKE) -f CMakeFiles/Makefile2 tutorial/FeatureSelection2/preinstall .PHONY : preinstall # Prepare targets for installation. preinstall/fast: cd /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build && $(MAKE) -f CMakeFiles/Makefile2 tutorial/FeatureSelection2/preinstall .PHONY : preinstall/fast # clear depends depend: cd /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 .PHONY : depend # Convenience name for target. tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionEA.dir/rule: cd /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build && $(MAKE) -f CMakeFiles/Makefile2 tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionEA.dir/rule .PHONY : tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionEA.dir/rule # Convenience name for target. FeatureSelectionEA: tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionEA.dir/rule .PHONY : FeatureSelectionEA # fast build rule for target. FeatureSelectionEA/fast: cd /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build && $(MAKE) -f tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionEA.dir/build.make tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionEA.dir/build .PHONY : FeatureSelectionEA/fast # Convenience name for target. tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionLibEA.dir/rule: cd /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build && $(MAKE) -f CMakeFiles/Makefile2 tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionLibEA.dir/rule .PHONY : tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionLibEA.dir/rule # Convenience name for target. FeatureSelectionLibEA: tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionLibEA.dir/rule .PHONY : FeatureSelectionLibEA # fast build rule for target. FeatureSelectionLibEA/fast: cd /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build && $(MAKE) -f tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionLibEA.dir/build.make tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionLibEA.dir/build .PHONY : FeatureSelectionLibEA/fast FeatureSelectionEA.o: FeatureSelectionEA.cpp.o .PHONY : FeatureSelectionEA.o # target to build an object file FeatureSelectionEA.cpp.o: cd /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build && $(MAKE) -f tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionEA.dir/build.make tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionEA.dir/FeatureSelectionEA.cpp.o .PHONY : FeatureSelectionEA.cpp.o FeatureSelectionEA.i: FeatureSelectionEA.cpp.i .PHONY : FeatureSelectionEA.i # target to preprocess a source file FeatureSelectionEA.cpp.i: cd /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build && $(MAKE) -f tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionEA.dir/build.make tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionEA.dir/FeatureSelectionEA.cpp.i .PHONY : FeatureSelectionEA.cpp.i FeatureSelectionEA.s: FeatureSelectionEA.cpp.s .PHONY : FeatureSelectionEA.s # target to generate assembly for a file FeatureSelectionEA.cpp.s: cd /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build && $(MAKE) -f tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionEA.dir/build.make tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionEA.dir/FeatureSelectionEA.cpp.s .PHONY : FeatureSelectionEA.cpp.s FeatureSelectionLibEA.o: FeatureSelectionLibEA.cpp.o .PHONY : FeatureSelectionLibEA.o # target to build an object file FeatureSelectionLibEA.cpp.o: cd /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build && $(MAKE) -f tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionLibEA.dir/build.make tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionLibEA.dir/FeatureSelectionLibEA.cpp.o .PHONY : FeatureSelectionLibEA.cpp.o FeatureSelectionLibEA.i: FeatureSelectionLibEA.cpp.i .PHONY : FeatureSelectionLibEA.i # target to preprocess a source file FeatureSelectionLibEA.cpp.i: cd /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build && $(MAKE) -f tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionLibEA.dir/build.make tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionLibEA.dir/FeatureSelectionLibEA.cpp.i .PHONY : FeatureSelectionLibEA.cpp.i FeatureSelectionLibEA.s: FeatureSelectionLibEA.cpp.s .PHONY : FeatureSelectionLibEA.s # target to generate assembly for a file FeatureSelectionLibEA.cpp.s: cd /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build && $(MAKE) -f tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionLibEA.dir/build.make tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionLibEA.dir/FeatureSelectionLibEA.cpp.s .PHONY : FeatureSelectionLibEA.cpp.s make_FeatureSelection.o: make_FeatureSelection.cpp.o .PHONY : make_FeatureSelection.o # target to build an object file make_FeatureSelection.cpp.o: cd /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build && $(MAKE) -f tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionLibEA.dir/build.make tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionLibEA.dir/make_FeatureSelection.cpp.o .PHONY : make_FeatureSelection.cpp.o make_FeatureSelection.i: make_FeatureSelection.cpp.i .PHONY : make_FeatureSelection.i # target to preprocess a source file make_FeatureSelection.cpp.i: cd /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build && $(MAKE) -f tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionLibEA.dir/build.make tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionLibEA.dir/make_FeatureSelection.cpp.i .PHONY : make_FeatureSelection.cpp.i make_FeatureSelection.s: make_FeatureSelection.cpp.s .PHONY : make_FeatureSelection.s # target to generate assembly for a file make_FeatureSelection.cpp.s: cd /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build && $(MAKE) -f tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionLibEA.dir/build.make tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionLibEA.dir/make_FeatureSelection.cpp.s .PHONY : make_FeatureSelection.cpp.s # Help Target help: @echo "The following are some of the valid targets for this Makefile:" @echo "... all (the default if no target is provided)" @echo "... clean" @echo "... depend" @echo "... FeatureSelectionEA" @echo "... FeatureSelectionLibEA" @echo "... edit_cache" @echo "... rebuild_cache" @echo "... test" @echo "... FeatureSelectionEA.o" @echo "... FeatureSelectionEA.i" @echo "... FeatureSelectionEA.s" @echo "... FeatureSelectionLibEA.o" @echo "... FeatureSelectionLibEA.i" @echo "... FeatureSelectionLibEA.s" @echo "... make_FeatureSelection.o" @echo "... make_FeatureSelection.i" @echo "... make_FeatureSelection.s" .PHONY : help #============================================================================= # Special targets to cleanup operation of make. # Special rule to run CMake to check the build system integrity. # No rule that depends on this can have commands that come from listfiles # because they might be regenerated. cmake_check_build_system: cd /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 .PHONY : cmake_check_build_system
Bon, je maîtrise pas cmake, mais d'après la faq, il faudrait que tu lance cmake avec l'option :
-D CMAKE_CXX_FLAG_MAINTENER=-g
Je ne sais pas trop si _MAINTENER et nécessaire ni même à quoi il sert...:?
A faire confirmer par quelqu'un qui maîtrise bien l'engin.
Le plus simple avec cmake, c'est probablement de faire
ccmake .
puis de modifier le CMAKE_BUILD_TYPE en Debug (puis c pour reconfigurer le projet, et g pour regénérer).
Mais ne va pas toucher les fichiers générés par cmake (sauf si tu sais exactement ce que tu veux faire).
le print debugging est du debuggage comme un autre. c'est ni plus ni moins que du log. l'avantage du print debugging c'est meme que tu peux avoir un historique de ce qui s'est passé (contrairement a gdb qui ne te donne que la derniere pile d'appel), par exemple combien de fois la fonction a été appelée avec succès avant de planter, etc.
enfin chacun fait comme il lui plait hein.
Le souci avec cette méthode c'est que ton exécutable de "debugging" n'est pas le même que le "produit" final, ca te force au moins deux compilation pour valider ta correction cela peu être long sur un gros produit.
Pour ce genre de choses je préfère largement utiliser un tracer logger correctement configuré et utilisé.
J'ai déjà vu des dev pas très propres oublier de nettoyer ce genre de macros, et livrer une version "debugging" (traces actives) en (pre)prod. Pire j'en ai vu faire des calcul dedans et piocher les infos comme si elles étaient valide pour le reste du code...
depuis cette époque je suis plutôt froid par par rapport à cette façon de faire.
mais effectivement chacun est libre de ses choix.
on parle ici d'un projet qui ne doit pas etre de taille suffisante pour justifier un enorme investissement sur du print debugging.
une classe TracerLogger minimaliste ne doit pas prendre plus de 0.5 jours de conception/dev.
je vois bien un truc du style (il peu y avoir des coquille je le tappe directement dans le message sans compiler).
et tu gère le niveau de trace a appliquer par conf (paramètre du programme, lecture de variable d'environnement, ...)Code:
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
54
55 #include <iostream> class Tracer { // Définit les niveaux de trace diponible. typedef enum { Debug = 0, Info, Warning, } TraceLevel; // constructeur. // prend le nom du traceur ainsi que le niveau de trace a afficher. Tracer(string aName,aLevel): name(aName), level(aLevel) {} // Méthode pour tracer les messages. void traceDebugMessage(String &msg) { if (level <= Debug) { std::cout << "DEBUG:" << name <<":"<< msg << std::endl; } } void traceInfoMessage(String &msg) { if (level <= Info) { std::cout << "DEBUG:" << name <<":"<< msg << std::endl; } } void traceWarningMessage(String &msg) { if (level <= Warning) { std::cout << "DEBUG:" << name <<":"<< msg << std::endl; } } void traceFatalMessage(String &msg) { if (level <= Fatal) { std::cout << "DEBUG:" << name <<":"<< msg << std::endl; } } // Permet de changer le niveau de trace a afficher. void setTraceLevel(TraceLevel aLevel) { level = aLevel; } // permet de savoir si il est possible de tracer les // message d'un niveau donné. bool isEnable(TraceLevel aLevel) { return (aLevel<= level); } private: String name; TraceLevel level; }
Ce tracer (pas thread-safe) est rapide a implémenter et peux convenir a un petit projet.
tu peux laisser -g -O3 -Wall en même temps sur une version récente de gcc par exemple.
Ensuite si tu ne veux pas que l'on vois les méthodes/objets de exe / lib tu peux le stripper pour virer la table des symboles (utilisé par le debugger) avant livraison (pas de recompilation dans ce cas :D
focus... on parle d'un projet de débutant en C++, pas de ta boite de professionnels...
Les traces définissable au runtime sont pratique, mais j'aime pas trop le concept de devoir les laisser dans le code final (même si ça alourdie par grand chose)...
Hum, même actuellement le mode -g3 est incompatible avec -o3... Bon, après, on est pas obligé d'aller jusqu'à trois, mais je préfère.
Merci pour toutes vos réponses, c'est vrai que je suis plus au moins débutante en c++ mais le projet est loin d'etre un projet pour débutant:)
bref devant toutes ces solutions franchement je me sens un peu perdu là :( laquelle de vos solutions j'utilise vue que je suis pressé par le temps ?
Merci pour votre aide:ccool:
salut,
j'ai cru que cette erreur m'allait me laisser tranquille mais voilà qu'elle me réaparait dans un autre contexte voilà c'est une boucle simple qui met dans un vecteur de booléen sa taille est de 7129 un nombre aléatoire soit 0 soit 1
à l'exécution la boucle s'arrete des fois en atteignant le nombre d'itération 7070 des fois 7026 des fois 6029 en m'affichant erreur de segmentation!Code:
1
2
3
4
5
6
7
8
9
10
11
12 double r = 0.0; r = rng.uniform(); std::vector<bool> b(7129); for (int j=0;j<7129;j++) {b[j]=rng.flip(); eo.setB(b); cout<<"le num"; cout<<j; //eo.invalidate(); }
j'arrive vraiment pas à voir l'erreur? est ce que quelqu'un pourrait m'aider?
Jabbounet stp tu as compris quelque chose ?
Merci .
Salut,
Ca fait quoi cette fonction :
Code:eo.setB(b);
setB est la suivante:
avec tab c'estCode:
1
2
3
4 void setB(vector<bool> & _b) { tab=_b; }
de taille 7129Code:std::vector<bool> tab
Tu peux montrer l'intégralité de ta fonction :
Car il semblerait que tu fasses sauter la pile. Deux raisons courantes : appels récursif ou tableau trop important sur la pile.Code:
1
2
3
4
5
6
7
8
9
10
11 double r = 0.0; r = rng.uniform(); std::vector<bool> b(7129); for (int j=0;j<7129;j++) {b[j]=rng.flip(); eo.setB(b); cout<<"le num"; cout<<j; //eo.invalidate(); }
De plus, dans le code que tu proposes, on ne sait pas trop si tu n'as pas oublié un '}' ou si la boucle va jusqu'au } que tu présentes.
[EDIT] : tu ne ferais pas des allocations (des new) dans rng.flip() ?