none
une aide sur les codes d'exécution RRS feed

  • Question

  • J'ai trouvé sur msdn une documentation générique sur les code d'erreur d'exécution ici

    mais je n'ai rien trouvé qui ressemble à ce que j'ai vu:

    J'ai un bloc de 7 fichiers que je ne peut intégrer qu'ensemble

    quand ils sont intégrés l'application se termine avec le code (0xc0000409)

    quand je retire les 7 fichiers l'application fonctionne bien

    ou puis je trouver la raison de ce code d'erreur qui se produit après l’exécution du premier constructeur.

    En fait il se produit dans le constructeur d'un des 7 fichiers sur une action applicative. Je vais donc inventorier le problème.


    Jean Noël Martin


    • Modifié JeanNoel53 jeudi 20 septembre 2012 16:39
    jeudi 20 septembre 2012 16:32

Réponses

Toutes les réponses

  • C'est programmé comme des cochons.

    http://social.msdn.microsoft.com/Forums/en/vsdebug/thread/c886be25-444d-46a9-bb40-2b9d15b12f25

    Le système a détecté que la pile d'exécution est compromise.

    Il y a donc un gros bug dans un ou plusieurs de ces 7 fichiers.

    Le débuggeur est ton ami.


    Paul Bacelar, Ex - MVP VC++

    jeudi 20 septembre 2012 16:54
    Modérateur
  • c'est sur un instruction précise d'un fichier.:

    wcscpy_s( TempString, 2*len, wsValue.c_str());

    J'ai eu beau augmenter la taille, ça ne change rien. il y a peut être un lien avec la taille de l'application. Je vais essayer un step into sur la fonction.

    et wsValue = "d:\program file\borland\interbase\bin"


    Jean Noël Martin


    • Modifié JeanNoel53 jeudi 20 septembre 2012 18:56
    jeudi 20 septembre 2012 18:53
  • J'ai donc diminué la taille en donnant juste 1 mot de marge pour le 0 terminal. il semble que wcscpy_s ne supporte pas les transferts de grande taille (plus de 100 caractères)?

    Jean Noël Martin


    jeudi 20 septembre 2012 19:16
  • Il est bien plus probable que vous envoyé n'importe quoi à cette fonction.

    C'est quoi ce "2*len" tout pourri, LISEZ LA DOCUMENTATION.


    Paul Bacelar, Ex - MVP VC++

    jeudi 20 septembre 2012 19:26
    Modérateur
  • J'avais mis une taille volontairement plus grande en disant que je définissait la taille max. Ça marchait sur le début, mais ca plantait dès que la taille dépassait 100 caractères.

    la séquence qui marche est ci dessous:

              len = wcslen( itListOption->sValue.c_str());
    	  len = len + 1;
              std::wstring wsValue;
              wsValue.append( itListOption->sValue.c_str());
    	  int error = wcscpy_s( TempString, len, wsValue.c_str());
              len = wcslen( TempString);
              TempString[len-1] = 0;
              psStrValue->assign( TempString);

    Ce code est un peu verbeux pour laisser une large place à l'observabilité. Il pourrait être compacté: les lignes 3,4,et 5 peuvent être faites en 1 ligne. Mais l'observabilité est aussi une qualité.

    J'ai observé un autre phénomène. sur la fabrication de chaine de caractère wcslen donne la taille n caractère + 1 pour  le zéro terminal. mais wcscopy_s prend en deuxième argument la longueur de la chaine et je suppose qu'il test que la valeur de len-1 est un zéro, donc il faut lui donner len+1.


    Jean Noël Martin




    jeudi 20 septembre 2012 20:44
  • C'est surtout un nid à bug votre usine à gaz.

    Vous mélangez allègrement des std::string avec des primitives C travaillant sur des buffers de "char", tout ça pour faire un truc bien moins fiable que juste :

    psStrValue->assign(itListOption->sValue);


    Paul Bacelar, Ex - MVP VC++

    vendredi 21 septembre 2012 18:42
    Modérateur
  • C'est bon

    Jean Noël Martin

    • Marqué comme réponse JeanNoel53 samedi 22 septembre 2012 12:11
    • Non marqué comme réponse Paul BacelarModerator lundi 24 septembre 2012 11:26
    • Marqué comme réponse JeanNoel53 lundi 24 septembre 2012 13:36
    samedi 22 septembre 2012 12:11