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

Langage C++ Discussion :

Problèmes pour debuguer sur windows 64 bits du code 32 bits


Sujet :

Langage C++

  1. #1
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut Problèmes pour debuguer sur windows 64 bits du code 32 bits
    EDIT : Cette discussion est un "spin off"de http://www.developpez.net/forums/d13...r/#post7337145

    Citation Envoyé par Médinoc Voir le message
    Sinon, ça peut aussi être le debugger qui déconne si tu es sous un Windows 64 bits et que ton programme est en 32 bits.
    En quoi ca peut poser un probleme? Ou tu parles d'un autre debugger que celui de VS?

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En quoi ça peut poser un problème: C'est simple: Le debugger de Visual affiche n'importe quoi et suit mal l'exécution du code en pas à pas, même quand le code 32 bits en question est compilé en Debug. J'ignore pourquoi, mais j'ai fait l'expérience de ce problème.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut

    Ca me surprends beaucoup parceque je suis sous Win 7 64bit depuis plusieurs annees et j'ai debugge des tas de programmes 32 et 64 bit dont la plupart hautement multithread mais je n'ai jamais vu le comportement dont tu parles. Ou alors ca doit etre une categorie de cas precis?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En tout cas, j'ai vu ça à mon bureau (Windows 7 64 bits également), sur des programmes C ou C++ 32 bits sous au moins une version de Visual (2005, 2008 ou 2010).
    Et c'est reproductible, ce n'est pas ponctuel.

    Il faudra que je vois ça en semaine.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    En tout cas, j'ai vu ça à mon bureau (Windows 7 64 bits également), sur des programmes C ou C++ 32 bits sous au moins une version de Visual (2005, 2008 ou 2010).
    Et c'est reproductible, ce n'est pas ponctuel.
    Si tu as encore le code je veux bien re-tester sur VS2010 et VS2012 (dernieres updates pour les deux par contre).

  6. #6
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    En quoi ça peut poser un problème: C'est simple: Le debugger de Visual affiche n'importe quoi et suit mal l'exécution du code en pas à pas, même quand le code 32 bits en question est compilé en Debug. J'ignore pourquoi, mais j'ai fait l'expérience de ce problème.
    Je confirme, et c'est beaucoup plus fréquent avec des programmes multithreads.
    Pas de code reproduisant le problème sous la main par contre.

  7. #7
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Bon ben perso je vois pas ce probleme. J'ai bosse deja un an sur un moteur de jeu multithread sans voir ca, et c'est bien du 32bit. Vous etes sur que vous vous etes pas trompe d'interpretation de ce que faisais le debugger?

  8. #8
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Non, ya vraiment des-fois ou le débogueur galère, j'ai retrouvé 2 screens qui montrent le problème (VS 2012 + CTP November)
    Le code à énormément changé entre temps (et n'est pas un exemple minimal, je le mettrais pas ici)
    Images attachées Images attachées  

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Ton screenshot ne montre pas grand'chose, tant qu'on n'en sait pas plus sur ce qu'il y a autour (code, ce que font les différentes fonctions appelées, quels threads sont actifs...). Ton this a changé, ce qui peut être lié a plein de choses sans qu'il y ait le moindre problème dans le débogueur.

    J'ai pour ma part pas mal bossé sur ce genre d'environnement, sans avoir de soucis (tant que je déboguais la version debug et non release, bien entendu).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  10. #10
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    Non, ya vraiment des-fois ou le débogueur galère, j'ai retrouvé 2 screens qui montrent le problème (VS 2012 + CTP November)
    Le code à énormément changé entre temps (et n'est pas un exemple minimal, je le mettrais pas ici)
    Note que le CTP n est pas une version stable..........
    Mais JolyLoic l'utilise aussi sans probleme.

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    La seule fois où j'ai eu un problème de ce genre, c'était un dépassement mémoire qui me plantait pas en Debug parce que j'accédais à un morceau aussi m'appartenant.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    J'ai pu reproduire le bug sous Visual Studio 2008, exécuté en administrateur sous Window 7 64 bits. Je possède cette fonction, appelée depuis une TimerProc (dont j'ai étendu le délai à dix secondes pour m'assurer que le problème ne vient pas d'un double-appel) et avec un breakpoint sur la première ligne:
    Code C++ : 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    //Create a ShellWindows object, and call enumProc on its contents.
    EXTERN_C HRESULT EnumShellWindows(INT_PTR userData, SHLWNDENUMPROC enumProc)
    {
    	if(enumProc==NULL)
    		return E_POINTER;
     
    	HRESULT hr;
    	IShellWindowsPtr spWindows = NULL;
    	hr = CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&spWindows));
    	if(FAILED(hr))
    	{
    		switch(hr)
    		{
    		case REGDB_E_CLASSNOTREG: //If this occurs, it's very unexpected, but identifiable.
    			return hr;
    		default:
    			return E_UNEXPECTED;
    		}
    	}
    	assert(spWindows!=NULL);
     
    	hr = S_OK;
    	IDispatchPtr spDispWindow=NULL;
    	for(UINT index=0 ; hr==S_OK && IShellWindows_Item_int(spWindows, index, &spDispWindow)==S_OK ; index++)
    	{
    		HRESULT hrProc = enumProc(userData, spDispWindow);
    		if(FAILED(hrProc))
    			hr = E_UNEXPECTED;
    		if(hrProc==S_FALSE)
    			hr = S_FALSE;
     
    		spDispWindow.Release();
    	}
     
    	return hr;
    }
    J'ai vérifié que sa déclaration est identique à sa définition, que la TimerProc possède un prototype correct (elle est bien déclarée __stdcall, aucun cast sur les pointeurs de fonction), etc. Le code marche parfaitement hors du debugger, en Debug comme en Release, en 64 bits comme en 32 bits.
    En 64 bits, le debugger marche normalement: ça breake sur le if, je fais F11 et ça passe à la ligne du CoCreateInstance().
    En 32 bits, ça breake sur le if, mais quand je fais F11, ça re-breake sur la même ligne immédiatement après; si je refais F11, j'ai une Access Violation dans ntdll.dll dans le processus.
    Le programme n'a qu'un seul thread, l'erreur ne peut donc pas venir d'un thread parallèle.

    Edit: En fait, quand je fais F11 la première fois sur le if(), il semblerait que j'ai la "first-chance exception" de l'Access Violation. En lecture de la valeur d'un paramètre.
    Je rappelle que le même code, en Debug comme en Release, marche parfaitement hors du debugger. Oh, et Visual me dit seulement "Access Violation" au lieu d'un truc du genre "Access Violation reading 0x12345678", donc pas moyen de savoir grand-chose...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Ca m'a l'air bien etrange, mais cela dis si tu debug sous VS2008 je me dis que ca pourrait etre lie (et aussi peut etre le Extern C...) parcequ'il est pas franchement fait pour marcher sur du 64bit.

    C'est marrant tout ca me rapelle bien des trucs mais a chaque fois c'etait des problemes dans mon code. Aussi, je ne touche jamais au genre de code que tu montre ici parceque c'est trop specifique a windows, du coup il se peut que ce soit lie aussi.

  14. #14
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    J'ai fais un peu de recherche, je trouve des docs dans ce genre qui indiquent que peut etre tu as essaye de debugger avec les debugging tools 64bit alors qu'il faut les 32 bits (je comprends pas bien ce que ca veut dire cela dis): http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    J'ai pu reproduire sous Visual 2010, et ajouté un nouveau test: Si j'exécute le code dans le debugger sans mettre un breakpoint, ça marche nickel.
    Si je mets un breakpoint au début de ma timerproc ou d'une fonction appelée par elle, ça marche si je refais F5 (Go) immédiatement, et ça excepte si je fais F10 (Step over) ou F11 (step into) à la place.

    En 64 bits, ça ne plante pas.
    Par contre, la présence d'un breakpoint dans la fonction mais ça fait échouer un appel à CoCreateInstance() avec la valeur de retour bizarre 0x804F4C45, qui est inconnue au bataillion sous Windows.
    Et sans breakpoint, ça marche nickel.

    J'ai joint le projet dans un ZIP. Le timer est toujours réglé à dix secondes (en usage normal, je mets une seconde à la place).

    Edit: Et apparemment, je ne suis pas le seul à avoir ce problème.
    Fichiers attachés Fichiers attachés
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Je crois que ca fais plus de 10 ans que j'avais pas vu du code comme ca

    Je viens d'ouvrir le projet sous vs2012U2 histoire de voir.
    Je suis pas sur de comprendre ou mettre le breakpoint, tu peux me donner un endroit precis ou tu as le probleme, voir si j'arrive a le reproduire?

  17. #17
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu vois la fonction EnumShellWindows() que j'ai postée? Tu mets un breakpoint sur sa première ligne if(enumProc==NULL), et ça excepte dessus quand tu steppes avec F10 ou F11.

    D'un autre côté, les problèmes ont disparu aussi bien en 32 qu'en 64 quand j'ai suivi le conseil sur StackOverflow et décoché l'option "Enable RPC debugging".
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #18
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Je n'ai pas encore verifie (trop de boulot, E3 a tue mon sommeil , etc.) mais j'etais en train de me dire qu'il se peut que CMake force la bonne config des le depart et que du coup je ne peut pas voir le probleme dans mes projets actuels. A verifier.

  19. #19
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ce n'est pas dans le projet, mais dans Visual lui-même.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 10
    Dernier message: 08/04/2009, 11h37
  2. [MEX] Compilateur C gratuit pour MATLAB sur Windows XP 64 bits ?
    Par marjobarjo dans le forum MATLAB
    Réponses: 7
    Dernier message: 27/03/2009, 11h35
  3. Compiler pour utilisation sur Windows
    Par bit_o dans le forum Linux
    Réponses: 3
    Dernier message: 25/04/2007, 21h07
  4. Problème connection à Linux sur Windows via Putty
    Par xionis dans le forum Réseau
    Réponses: 2
    Dernier message: 13/04/2007, 10h48
  5. [Struts] Problème pour itérer sur un vecteur
    Par vallica dans le forum Struts 1
    Réponses: 5
    Dernier message: 24/04/2006, 15h45

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