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

MFC Discussion :

[MFC] bug uniquement en mode release


Sujet :

MFC

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut [MFC] bug uniquement en mode release
    Salut,

    j'ai une application Dialog - MFC qui fonctionne très bien en mode debug.
    Dès que je passe en mode release, j'obtiens des messages d'erreur du type :
    Citation Envoyé par Erreur d'application
    L'instruction à "0x73dd1c7" emploie l'adresse mémoire "0x000013b". La mémoire ne peut pas être "read".

    Cliquez sur OK pour terminer le programme.
    Cliquez sur Annuler pour déboguer le programme
    Je fais donc "Annuler" et je tombe sur :
    Citation Envoyé par Erreur d'application
    L'instruction à "0x73dd1c7" emploie l'adresse mémoire "0x000013b". La mémoire ne peut pas être "read".

    Cliquez sur OK pour terminer le programme.
    Dans Visual C++ 6, où puis-je trouver ce qui correspond à cette adresse mémoire ? Cela correspond je pense à un écrasement mémoire. Comment le pister ?

    merci

  2. #2
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Dans les options de compilation, active la génération des symboles de débogage et recommence, il devrais te donner le nom de la fonction qui bug.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut
    Voici les options que je viens de modifier :

    Project Settings -> Win32 Release
    • onglet C\C++, Category General[list:ec64bce1ac]
    • Optimizations : Disable (Debug)
    • Debug info : Program Database for Edit and Continue
    [*]onglet Link
    • Generate debug info : enabled
    [/list:u:ec64bce1ac]
    et je ne vois pas le nom de la fonction qui bug.
    Où doit-il apparaitre ? dans l'IDE ou dans le message d'erreur ?

  4. #4
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Aymerik
    • onglet Link[list:3a6a087b93]
    • Generate debug info : enabled
    [/list:u:3a6a087b93]
    Juste ça ça suffit.

    Lors du crash, fait annuler pour déboguer. Consulte la pile des appels, les adresses genre 0x73dd1c7 devraient avoir été remplacées par le nom des fonctions.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut
    Lorsque je fais annuler pour déboguer, mon programme tourne encore tout en ayant
    Citation Envoyé par Erreur d'application
    L'instruction à "0x73dd1c7" emploie l'adresse mémoire "0x000013b". La mémoire ne peut pas être "read".

    Cliquez sur OK pour terminer le programme.
    devant mon IDE. je bouge donc cette fenetre et j'arrete mon programme (break execution) et je ne trouve aucune de mes fonctions dans la pile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    NTDLL! ...
    KERNEL32! ...
    ---------------------------------------
    plus tard...
    je viens de "trouver" l'erreur : en commentant un "UpdateData(false)", les erreurs ne se produisent que lors du survol de la souris sur ma fenetre. Je suppose que lors d'un survol souris, la fonction "DoDataExchange" est appelée ?
    donc dans ce cas mon erreur se situe dans l'une des variables citées dans cette fonction. C'est bien cela ?

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    il n'y a pas d'appel a updateData sur le survol de la souris .
    sauf si tu l'a implementé sur une fonction de deplacement de la souris...
    met un AfxMessageBox("ligne xxx") dans on OninitDialog (si c'est une dialogue) avant / apres le premier UpdateData.

    note: si c'st un pb de variables ça doit planter en debug.


  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut
    ok, c'est pas un problème de variables.
    Le plantage intervient uniquement dans un certain cas : déclenchement d'un timer puis envoi d'un message puis execution d'une fonction.
    Sans quoi je pratique le UpdateData régulièrement !
    je vais continuer à investiguer

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    en collant des AfxMessageBox aux endroits strategiques tu peux approcher de l'erreur..

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut
    pour les pistes, je continue...

  10. #10
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Aymerik
    je ne trouve aucune de mes fonctions dans la pile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    NTDLL! ...
    KERNEL32! ...
    si tu remontes la piles tu devrais en trouver.

  11. #11
    Futur Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Par défaut suite solution???
    Bonjour,

    est ce que quelqu'un a trouvé la solution à ce pb? j'ai les mêmes "symptomes" dans mon code avec un setTimer(...). Ca marche très bien en mode debug mais pas en mode release. et dès que j'enlève le setTimer, le reste marche bien en mode release....

    ce n'est relié à aucune instruction en particulier, le code a l'air d'être corrompu (des données effacées) de façon non définie: il suffit que je rajoute un bouton dans ma fenêtre avec un traitement de base (afficher des données sur une console) pour que j'ai l'erreur Access volation....

    Je voulais savoir si klk'1 avait des idées/suggestions...

    La solution radicale que j'ai trouvé est de re-prendre mon code en C et laisser tomber les MFC...;

  12. #12
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    ce n'est certainement pas la faute des MFC ..
    la verité est ailleurs....

  13. #13
    Futur Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Par défaut
    Ce n'est pas la faute à mon code en tout cas )

    Je n'ai pas trouvé mieux pour le résoudre et cela fait à peu prés 3semaines que ça me fatigue...


    D'un autre côté, pour en avoir le coeur net, j'ai créé un nouveau projet avec le wizard de VC++ 6 (MFC AppWizard Exe ensuite Dialog Based ensuite Finish).
    Je n'ai rien changé au code existant à part le rajout de:
    + SetTimer(1, 1000, NULL) dans le InitDialog de la fenetre,
    + Redirection du traitement de WM_TIMER à une de mes fonctions: ON_MESSAGE(WM_TIMER, MyOwnTimerProc())
    + Déclaration de la fonction (afx_msg void MyOwnTimerProc()...),

    et c'est tout. et j'ai qd même pu créer l"Access Violation en mode release....

  14. #14
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    et bien c'est que tu te plantes mon cher ami .
    crois tu etre le seul a avoir du utilisé un SetTimer ?
    toujours se remettre en cause avant de dire c'est l'api ou la lib MFC qui ne fonctionne pas ...

  15. #15
    Futur Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Par défaut
    Je suis d'accord avec toi. par contre je ne sais pas où est ce que je fais l'erreur!!

  16. #16
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    et bien pour ça il nous faudrait voir le code...
    ou un projet minimaliste qui reproduit le probleme, et que tu peux joindre au post.

  17. #17
    Futur Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Par défaut
    je suis nouveau sur le forum j'avais pas vu que ta réponse était sur une deuxième page

    SInon pour créer le pb, il suffit d'ouvrir un nouveau projet sous VC++ 6 (MFC Appwizard exe), ensuite, DialogBased et puis finish. on appelle le projet testTimer par exemple.

    Dans la fonction testTimerDlg::OnInitDialog(), on rajoute la ligne suivante:
    unsigned int test_Timer = SetTimer(1, 2000, NULL);

    ensuite on rajoute la ligne suivante:
    ON_MESSAGE(WM_TIMER, myTestTimer)
    entre le BEGIN_MESSAGE_MAP et le END_MESSAGE_MAP() du même fichier
    et enfin on rajoute:
    afx_msg void myTestTimer();

    avant le DECLARE_MESSAGE_MAP() dans le fichier testTimerDlg.h


    et voilà, tu as le pb en exécutant le code en mode release....

  18. #18
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Tu penses bien que tu n'es pas le seul au monde à avoir utilisé un timer dans une application MFC et que si c'etait buggé ça se saurait ....
    Si tu avais utilisé l'assistant de visual tu n'aurais pas eu de problémes , et ton code serait alors correcte.
    voila un exemple de ce que génére visual sur le message WM_TIMER:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    BEGIN_MESSAGE_MAP(CTestDlgDlg, CDialog)
        //{{AFX_MSG_MAP(CTestDlgDlg)
        ON_WM_TIMER()
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
     
    void CTestDlgDlg::OnTimer(UINT nIDEvent) 
    {
        // TODO: Add your message handler code here and/or call default
     
        CDialog::OnTimer(nIDEvent);
    }
    Toujours se remettre en question avant de dire c'est la lib qui ne fonctionne pas et mon code est correcte....

  19. #19
    Futur Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Par défaut
    merci pour la réponse, ça marche mnt..

    sinon pour clore le sujet sur ma remarque précedente, c'était sarcastique...

    En tt cas, c'est super. c'était un pb qui me prenait la tête depuis un moment et je n'avais pas pensé au class wizard...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/05/2012, 10h12
  2. Bug en mode release
    Par ngatchou dans le forum VB.NET
    Réponses: 4
    Dernier message: 02/12/2011, 17h27
  3. Réponses: 8
    Dernier message: 15/02/2009, 22h12
  4. [MFC]probleme d'info bulle en mode release
    Par jiraya43 dans le forum MFC
    Réponses: 4
    Dernier message: 02/05/2006, 10h09
  5. Erreur LNK1104 uniquement en mode release
    Par dus dans le forum MFC
    Réponses: 1
    Dernier message: 30/09/2005, 14h03

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