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 �m�rite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    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
    Expert confirm�

    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 : 40
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    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 confirm�
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    D�tails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    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�.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqu� ? (Jacques Rouxel)

  4. #4
    Membre �m�rite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    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 confirm�
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    D�tails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    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.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqu� ? (Jacques Rouxel)

  6. #6
    Membre �m�rite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    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 confirm�
    Inscrit en
    Ao�t 2005
    Messages
    136
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2005
    Messages : 136
    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