Debug DLL

galax98 Messages postés 49 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 29 juin 2020 - 6 juin 2013 à 16:21
galax98 Messages postés 49 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 29 juin 2020 - 16 juin 2013 à 14:31
Bonjour,
Voici le pb sur lequel je suis bloqué depuis quelques jours.
J'ai une application qui appelle de nombreuses fois une fonction qui provient d'une dll annexe.
Il y a visiblement un bug puisque la fonction est sensée renvoyer toujours la meme valeur si les parametres qui lui sont fournis sont les memes, or il arrive (rarement mais quand meme) que la fonction renvoie 2 valeurs différentes à parametres initiaux égaux.
Le gros pb est que lorsque je lance mon application ou la dll en mode debugger pour voir à quel moment la fonction "deraille", le bug disparait ....
Pareil si j'essaye d'imprimer dans un fichier l'etat de certaines variables pour suivre le déroulement sans faire appel au debugger, le bug disparait aussi.
On m'a dit que ca pouvait ressembler à un bug de pile, et qui pourrait donc etre du à une mauvaise instruction à un tout autre endroit du programme.
Voyez vous comment je pourrais déceler d'où vient le probleme ?
Merci
A voir également:

30 réponses

galax98 Messages postés 49 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 29 juin 2020
15 juin 2013 à 18:38
Gràce à cela en effet j'ai débusqué le coupable !
Il s'agit d'une de mes fonctions qui comporte environ une trentaine de boucles imbriquées ...
Ca doit lui faire peter les plombs en terme d'optimisation ....
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
15 juin 2013 à 19:50
Voilà c'est une bonne nouvelle. En effet, une telle imbrication de boucles pourrait être fatale à l'éditeur de liens pour certaines optimisations. Il ne te reste plus qu'à recoder ta fonction.
Bonne continuation.
0
galax98 Messages postés 49 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 29 juin 2020
16 juin 2013 à 12:51
Oui, il faudrait sans doute que j'utilise des sous fonctions récursives ... ca me semble très compliqué.
Est ce que je peux desactiver l'optimisation juste pour une fonction ou bien ca doit concerner tout le fichier cpp, auquel cas je peux peut etre "isoler" cette fonction dans un fichier à part sur lequel je desacitverai l'optimisation ?
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
16 juin 2013 à 13:35

Il n'y a que 6 fichiers cpp, mais comme je disais environ 40.000 lignes "utiles".
[...]
Il s'agit d'une de mes fonctions qui comporte environ une trentaine de boucles imbriquées ...

~10 000 lignes par fichier, 30 imbrications de boucle... Mais qui a fait ça ? C'est juste horrible, c'est n'importe quoi (tu as gagné le droit d'engueuler ton architecte projet :p).
Le vrai problème n'est pas l'optimisation, mais toute la conception du projet qui est à revoir.

D'une manière générale:
- Une fonction ne doit pas excéder une cinquantaine de lignes (et c'est déjà beaucoup, en moyenne c'est plus de l'ordre de 25).
- Un fichier ne doit pas excéder 1000 lignes (en comptant commentaires et espaces), et encore c'est déjà beaucoup.
- On ne dépasse jamais 3 imbrications de boucle (et c'est déjà beaucoup).

Un projet bien conçu, à tous ses éléments correctement partitionnés:
- 2 à 3 fichier par classes: .cc, .hh (et .hxx si template il y a).
- Mieux vaut de nombreuses petites fonctions claires qu'une grosse fonction monolithique inmaintenable. Toujours découper son code en petites fonctions.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
16 juin 2013 à 13:43
Oui tout à fait. Ce serait même une bonne idée si l'optimisation de ta fonction n'est pas obligatoire et que son recodage s'avère fastidieux. La directive #pragma optimize peut être mise là ou on veut dans le code à condition que ce soit en dehors des fonctions. Son deuxième paramètre est soit off soit on. Ainsi tu pourras la mettre juste avant le code de ta fonction pour désactiver l'optimisation et puis la remettre après pour la réactiver. Exemple:
#pragma optimize ("", off)
int nom_de_la_fonction(int inombre)
{
    //... code de la fonction
    return 0;
}
#pragma optimize ("", on)
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
16 juin 2013 à 14:02
@CtpPingu : Mon dernier post est adressé à galax98. Je n'ai pas vu le tien avant de commencer à écrire ma réponse. Oui, c'est sûr, la conception est à revoir. Je pensais lui faire les mêmes remarques mais j'ai préféré d'abord essayer de l'aider à passer son blocage.
0
galax98 Messages postés 49 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 29 juin 2020
16 juin 2013 à 14:06
Je ne vais pas rentrer dans le détail de toutes tes remarques, mais :

pour les 1000 lignes par fichier, je ne suis pas sur que gérer un projet comportant plus de 60 fichiers cpp soit très pratique
pour les 50 lignes par fonction, quand il faut par exemple initialiser une centaine de parametres au départ, ca ne facilite pas les choses
pour les imbrications, si tu parviens à faire une fonction identique à la mienne en ne dépassant pas 3 imbrications de boucle, chapeau bas ...
0
galax98 Messages postés 49 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 29 juin 2020
16 juin 2013 à 14:08
@racpp : merci pour tout.
(Mon dernier message etait pour Cpt)
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
16 juin 2013 à 14:20
pour les 1000 lignes par fichier, je ne suis pas sur que gérer un projet comportant plus de 60 fichiers cpp soit très pratique

Un gros projet a de nombreux fichiers. Et c'est normal. C'est pourtant très pratique. Une équipe peut bosser indépendamment sur chacun d'eux, sans créer constamment des conflits sur le gestionnaire de version. Je bossse actuellement sur un projet comportant environ 500 fichiers. Je t'invite à télécharger des projets réputés sur github ou Google code. Tu verras que ce que je dis sera vite vérifié ^^. Qui plus est, seul les fichiers modifiés sont recompilés. Inutile de préciser que ça améliore grandement la vitesse de recompilation.

pour les 50 lignes par fonction, quand il faut par exemple initialiser une centaine de parametres au départ, ca ne facilite pas les choses

Si tu as un 100 arguments à initialiser, tu as déjà un problème de conception. C'est que le découpage n'est pas fait ou mal fait.

pour les imbrications, si tu parviens à faire une fonction identique à la mienne en ne dépassant pas 3 imbrications de boucle, chapeau bas ...

3 imbrications max au sein d'une fonction. Rien ne t'empêche d'appeler une fonction dans ta boucle qui refait une imbrication. Néanmoins, 30 imbrications globales me paraît tout de même élevé.
Je ne pense pas que tu ais le droit, mais si tu m'envois ton projet, je te peux te faire du code review.


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
galax98 Messages postés 49 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 29 juin 2020
16 juin 2013 à 14:31
Je te remercie mais en effet je ne peux rien t'envoyer.
Tes remarques se justifient en effet si plusieurs personnes travaillent dessus.
Là il se trouve que je suis seul (sur cette partie), sachant exactement où tout se trouve, je vais plus vite, meme si le fichier comporte 10.000 lignes, que si je devais jongler d'un fichier à l'autre, mais dans l'esprit tu as raison.
Pour la fonction, je vais voir si je peux l'isoler, l'expliquer et te l'envoyer voir ce que tu en penses.
0
Rejoignez-nous