IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

[Surnaturel] Une fonction qui marche en débug, pas en release


Sujet :

C++Builder

  1. #1
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 887
    Points : 1 531
    Points
    1 531
    Par défaut [Surnaturel] Une fonction qui marche en débug, pas en release
    Ben voilà, tout est dans le titre. J'ai une fonction qui marche en mode debug, pas en mode release. La voilà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if (TEST() == 0x12345678) MessageBox(NULL, "Erreur", "", MB_OK);
     
    unsigned long TEST(void) {
      unsigned long a;
     
      a = 0x12345678;
      _asm {
        mov a,esi
      }
     
      return a;
    }
    En fait, lorsqu'on regarde le code assembleur généré, le compilateur fait comme si ebp et esp étaient égaux (ce qui n'est pas le cas):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    push esi
    push ecx
    mov [esp], 0x12345678
    mov [ebp+0x00],esi
    mov eax,[esp]
    pop edx
    pop esi
    ret
    Il semblerait donc que ce soit un problème de convention d'appel. Mais j'ai essayé de la déclarer en pascal, stdcall, cdecl, etc... Rien n'y fait. Quelqu'un aurait-il une idée ?

  2. #2
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Si cela fonctionne en mode debug et pas en mode release, c'est peut etre qu'il manque une pause quelque part.

  3. #3
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 060
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 060
    Points : 8 296
    Points
    8 296
    Par défaut
    J'ai compilé ta fonction avec BCB6.
    Elle me donne ceci en asm :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     push esi
     push ecx
     mov [esp],305419896
     mov [esp+0],esi
     mov eax,[esp]
     pop edx
     pop esi
     ret
    le registre ebp n'est pas utilisé.

  4. #4
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 887
    Points : 1 531
    Points
    1 531
    Par défaut
    Citation Envoyé par CGi
    J'ai compilé ta fonction avec BCB6.
    Elle me donne ceci en asm :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     push esi
     push ecx
     mov [esp],305419896
     mov [esp+0],esi
     mov eax,[esp]
     pop edx
     pop esi
     ret
    le registre ebp n'est pas utilisé.
    Oui, ce code est plus logique. Donc ce serait soit un problème de patch, soit une option de compilation ?

    Ma version:

    Version 6.0 (build 10.166)
    Mes options sont les options par défaut par défaut quand on fait "nouveau projet" et qu'on clique sur "Version finale":

    Optimisation de code: Vitesse
    En-tête pré-compilés: cacher
    Jeu d'instructions: 80386
    Conventions d'appel: C
    Variables registres: Automatiques
    Conformité du langage: Borland
    Il ne me semble pas que les autres options puissent avoir une influence.

  5. #5
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 060
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 060
    Points : 8 296
    Points
    8 296
    Par défaut
    Version 6.0 (build 10.166)
    J'ai la même version.

    J'ai recompilé avec les mêmes options que tu as mentionné,
    J'ai toujours le même résultat (pas de registre ebp en vu).

    C'est vrai que c'est quand même bizard.

    Tu as essayé de recompiler cette fonction dans un autre projet.

  6. #6
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 887
    Points : 1 531
    Points
    1 531
    Par défaut
    Citation Envoyé par CGi
    Tu as essayé de recompiler cette fonction dans un autre projet.
    Oui. Enfin, non, c'est le contraire. Cette fonction est issue d'une autre fonction d'un autre projet, mais qui présente les mêmes symptomes. En fait au départ, c'était la fonction RDTSC de la FAQ, qui permet de lire la fréquence du processeur. Après avoir isolé la fonction qui plantait (pas facile puisqu'elle plantait qu'en mode release), je l'ai progressivement simplifiée pour aboutir à ma fonction TEST.

  7. #7
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    Points : 115
    Points
    115
    Par défaut
    Bonjour,

    il me semble que j'ai déjà eu le problème avec une fonction RDSTC que je voulais utiliser dans mon code et que j'avais trouvé sur une des faq de ce site.
    apres une bonne prise de tete, et une grosse galere, il reste cela comme code: (pb de fonctionnement différent entre debug et release)
    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
    double RDTSC(void)
    {
     
    	unsigned long a, b;
    	double x;
     
    	DebugString ("avant l'assembleur");
    	asm
    	{
    		db 0x0F,0x31 // instruction RDTSC
     
    		mov [a],eax
    		mov [b],edx
    	}
    	DebugString ( "apres l'asm");
    	x  = b;
    	x *= 4294967296;
    	x += a;
    	DebugString ( "avant le return");
    	return x;
    }
    J'espere que ca résoudra ton problème...

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/05/2015, 20h21
  2. une fonction qui ne s'execute pas correctement
    Par chmek firas dans le forum Débuter
    Réponses: 4
    Dernier message: 14/05/2012, 22h26
  3. Une fonction qui marche 8 fois mais pas 9
    Par Swarley dans le forum Prolog
    Réponses: 1
    Dernier message: 04/12/2008, 10h21
  4. Pb sur une fct qui marche sous mozilla mais pas ie
    Par chpog dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/09/2005, 11h26
  5. une comparaison qui marche pas.
    Par gandf dans le forum C++Builder
    Réponses: 7
    Dernier message: 16/02/2004, 15h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo