Debogage et portage d'une biblio de linux vers windows

elhajjajireda Messages postés 34 Date d'inscription mercredi 3 juin 2009 Statut Membre Dernière intervention 20 juin 2011 - 22 avril 2011 à 20:43
elhajjajireda Messages postés 34 Date d'inscription mercredi 3 juin 2009 Statut Membre Dernière intervention 20 juin 2011 - 8 mai 2011 à 21:36
Bonjour tous le monde
je travail sur l'optimisation et le portage d'un bibliothèque de linux vers windows, cette biblio fonctionne correctement sous linux mais il n'a pas le meme comportement sous windows ,donc j ai commencé le débogage sur les 2 plateforme
et là j'ai remarqué que sur le même bloc , je n'ai pas les même valeurs sur certain objets ou bien variables , sous linux comme sous Windows.
D'autre part quand je recompile sous Windows j'obtiens chaque fois des nouveaux valeurs comme si je travail avec des nouveaux arguments ou bien des nouveaux photos
alors que sous Linux le comportement est normale et sur chaque compilation j'obtiens les même valeurs.

Ce que j'ai pu remarqué aussi , c'est surtout les variables en hexadécimale qui posent des problèmes et ce que j'ai trouvé encore pire:sous linux ils sont sur 32 bit(8 caractères hexa) et sous windows ils sont sur 24 bit

si le vous plait , est qu'il y quelqu'un qui a une explication ?!!!!

NB: j'ai enregistré les résultats du debogage sur les deux système pour qu'on puisse mieux comparer , mais je ne sais pas comment faire pour l'importer sur ce forum ?

18 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 avril 2011 à 21:43
"...et sous windows ils sont sur 24 bit"
Sérieusement, c'est du grand nimporte quoi. Si tu veux un sortie 8 char ben faut en écrire 8.

A te lire, je crains fort que l'optimisation dont tu parles au début ne passe à la trappe.

ciao...
BruNews, MVP VC++
0
elhajjajireda Messages postés 34 Date d'inscription mercredi 3 juin 2009 Statut Membre Dernière intervention 20 juin 2011
22 avril 2011 à 22:02
écoute l'ami au lieu de trainer dans le coin pour dire n'importe quoi ,vaut mieux poser des questions et demander plus d'explication si t 'as vraiment l'intérêt d'aider les gens !!!!!
je te donne un exemple pour le même variable

sous Linux : MAP=0x12b0030
Windows : Map=0xb7266010
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
22 avril 2011 à 23:27
salut,

Le problème, c'est surtout que ce que tu expliques est incompréhensible et qu'il est évident que Windows gère le 32/64 bits aussi bien que Linux.

Vu qu'en code source, tu nous montres nada, comment veux-tu qu'on t'aides en quoi que ce soit ?



@++
0
elhajjajireda Messages postés 34 Date d'inscription mercredi 3 juin 2009 Statut Membre Dernière intervention 20 juin 2011
22 avril 2011 à 23:49
il y a plus ce que 30 fichier, et par fois ça dépasse 3000 lignes ,
et chaque fonction te transmet a une autre sur un nouveau fichier
je peu rien montrer là , sauf une photo que j ai pu enregistré pour que vous puissiez constater la différence sur le debug des 2 plateformes

donc dites moi si vous savez comment je peux joindre une photo a un message sur le forum
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
23 avril 2011 à 00:35
re,

Une photo ne servira à rien.

Tu veux convertir un source Linux en source Windows. Ces deux systèmes n'ont pas le même fonctionnement et pas les mêmes fonctions. Ce n'est pas un déboggage que tu dois faire mais une traduction qui fera que le source compilera pour l'un et l'autre système. Beaucoup sera à faire au niveau du préprocesseur avec des #ifdef.

Soit tu sais comment traduire un bout de code incompatible entre les deux systèmes soit non et tu nous postes le code source si tu veux de l'aide. Hors de question que je te fasse tout ton boulot de toutes manières.

@++
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
23 avril 2011 à 16:44
sous linux ils sont sur 32 bit(8 caractères hexa) et sous windows ils sont sur 24 bit
De quoi tu parles ? Structures, variables, objets ?

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
elhajjajireda Messages postés 34 Date d'inscription mercredi 3 juin 2009 Statut Membre Dernière intervention 20 juin 2011
23 avril 2011 à 20:30
J'ai déjà donné l'exemple se sont des variables !!!
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
23 avril 2011 à 20:56
Si tu compiles sous la même architecture y'a pas de raisons que la taille de tes variables changent ... Tu parles d'int ?

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
elhajjajireda Messages postés 34 Date d'inscription mercredi 3 juin 2009 Statut Membre Dernière intervention 20 juin 2011
23 avril 2011 à 21:32
oui c'est bien ça ce qui me casse la tete !!!!!
les variables sont des: int , char et float
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
23 avril 2011 à 23:30
Quel compilateur sous Windows ?

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
elhajjajireda Messages postés 34 Date d'inscription mercredi 3 juin 2009 Statut Membre Dernière intervention 20 juin 2011
23 avril 2011 à 23:48
CODE::Blocks
0
elhajjajireda Messages postés 34 Date d'inscription mercredi 3 juin 2009 Statut Membre Dernière intervention 20 juin 2011
24 avril 2011 à 23:18
j'ai creusé un peu dans le code et j'ai trouvé un fichier qui a utilisé des instructions spécifiques à l'architecture comme vous l'avez signalé .
je donne juste un peti exemple par ce qu'il y en a beaucoup et que j'ai rien compris ce qu'il veut faire
-je n'ai pas compris aussi votre question "La gestion des noms des fichiers est différentes entre windows et linux"
-d'autre parts la taille de certains variables est différente sur les 2 systemes
#ifdef ARCH_X86
            static mmx_t mmx_ffffffff={0xffffffffffffffffull};
            movq_m2r (mmx_ffffffff,mm0);
            movq_m2r (mmx_ffffffff,mm1);
            switch (BorderSize) {
                case 1: psllq_i2r (8,mm0);  psrlq_i2r (8,mm1);  break;
                case 2: psllq_i2r (16,mm0); psrlq_i2r (16,mm1); break;
                case 3: psllq_i2r (24,mm0); psrlq_i2r (24,mm1); break;
                case 4: psllq_i2r (32,mm0); psrlq_i2r (32,mm1); break;
                case 5: psllq_i2r (40,mm0); psrlq_i2r (40,mm1); break;
                case 6: psllq_i2r (48,mm0); psrlq_i2r (48,mm1); break;
                case 7: psllq_i2r (56,mm0); psrlq_i2r (56,mm1); break;
            };
            unsigned char *OutLeft= yuv, *OutRight= yuv+x__-8;
            for (int yy= y__; yy; yy--)
            {
                movq_m2r   (*OutLeft,mm2);
                movq_m2r   (*OutRight,mm3);
                pand_r2r   (mm0,mm2);
                pand_r2r   (mm1,mm3);
                #ifdef __WITH_MOVNTQ__
                movntq_r2m (mm2,*OutLeft);
                movntq_r2m (mm3,*OutRight);
                #else
                movq_r2m (mm2,*OutLeft);
                movq_r2m (mm3,*OutRight);
                #endif
                OutLeft+=  x__;
                OutRight+= x__;
            };
            Memms();
        #endif
0
elhajjajireda Messages postés 34 Date d'inscription mercredi 3 juin 2009 Statut Membre Dernière intervention 20 juin 2011
24 avril 2011 à 23:21
d'autre part pour mieux comprendre je vais essayer de faire un petit exemple
#include "MCharImage.h"
#include "MDetecteur.h"
#include "MListePI.h"
//#include "MListeCouples.h"
#include "MUtils.h"
using namespace std;
using namespace local_vis_eric;
int main (int argc,char** argv)
{
  if (argc==3)
  {
    //Ouverture des images
        cout << "ouverture des images" << endl;
        MCharImage Image1,Image2;                       //raz
        Image1.Load(argv[1]);
               ................
}

int IsColored= 0;
  //ifstream Image(PpmOrPgm); // créer un flot d'entrée associé à un fichier
  ifstream Image(PpmOrPgm,ios::in); //  ajouté
  if (Image.bad())                                     //** test la valeur de badbit pour savoir si le flot est dans un état irrécupérable
    return 0;
  char C;                   //**  Image.get() extrait un caractère du flot d'entrée et en renvoie la valeur (sous forme d'un entier) ; fournit EOF en cas de fin de fichier
  while ((C Image.get()) '#') { do C = Image.get(); while (C != '\n'); };
  Image.putback(C);         //** Le caractère passé en paramètre de cette fonction est ajouté à la fin du flux fonctionne correctement, le caractère réinséré doit être le dernier caractère lu,

  char Tmp[256];
  Image.get(Tmp, 256, '\n'); //**extrait 255 caractères du flot et les place à l'adresse Tmp (le tampon). La lecture s'arrête éventuellement après le délimiteur s'il est rencontré.
  Image.get();
  if (!strcmp(Tmp, "P5"))                            IsColored= 0;
  else if (!strcmp(Tmp, "P6") || !strcmp(Tmp, "P3")) IsColored= 1;
  else return 0;

  while ((C Image.get()) '#') { do C = Image.get(); while (C != '\n'); };
  Image.putback(C);

  int xx, yy, zz;
  Image >> xx >> yy >> zz;
  if ((xx <= 0) || (yy <= 0) || (zz!= 255 && zz!= 254))
    return 0;
  SetSize(xx,yy);
  Image.get();

  int L= x__*y__;      // X__=xx  y__=yy
  if (!IsColored)
  {
    Image.read((char*)yuv, L);
  }
  else if (!strcmp(Tmp, "P6"))
  { // color binary
    char* Tmp2= new char[3*L];
    Image.read(Tmp2, 3*L);
    for (int i= 0; i< L; i++)
      yuv[i]= Tmp2[3*i+1];
    delete[] Tmp2;
  }
  else if (!strcmp(Tmp, "P3"))
  { // color ascii
    int R, G, B;
    for (int i= 0; i< L; i++) {
      Image >> R >> G >> B;
      yuv[i]= G;
    };
  };
  return 1;
}

après voila le résultat que j'ai eu pour le même objet sur les 2 plateformes :
-sous Windows
x__=1024
y__=768
  yuv = 0x2e0030 "\f\f\r\016\r\017\v\016\016\r\r\016\017\020\016\020\020\020\020\021\022\022\022\024\025\024\024\025\025\025\026\026\027\026\027\027\027\027\030\030\031\032\031"

- sous Linux:
(gdb) print Image1
$1 {x__ 1024, y__ = 768, 
  yuv 0xb7f2b010 "\f\f\r\016\r\017\v\016\016\r\r\016\017\020\016\020\020\020\020\021\022\022\022\024\025\024\024\025\025\025\026\026\027\026\027\027\027\027\030\030\031\032\031\032\032\033\033\033\033\034\034\034\034\034\033\036\034\035\036\037\037\037\037 \037\037\036\037\036\037\036\036 \037\037\037\036\036"#"!$%#""!#"""##""$%&"! \037   ""\..., ReadOnly false}
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
25 avril 2011 à 11:29
L'adresse est différente, et ? D'un côté, on a 0x002e0030 et de l'autre, 0xb7f2b010. Je vois vraiment pas le problème !

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
25 avril 2011 à 18:30
re,

#ifdef ARCH_X86
    static mmx_t mmx_ffffffff={0xffffffffffffffffull};
    movq_m2r (mmx_ffffffff,mm0);
    movq_m2r (mmx_ffffffff,mm1);
    switch (BorderSize) {
        case 1: psllq_i2r (8,mm0);  psrlq_i2r (8,mm1);  break;
        case 2: psllq_i2r (16,mm0); psrlq_i2r (16,mm1); break;
        case 3: psllq_i2r (24,mm0); psrlq_i2r (24,mm1); break;
        case 4: psllq_i2r (32,mm0); psrlq_i2r (32,mm1); break;
        case 5: psllq_i2r (40,mm0); psrlq_i2r (40,mm1); break;
        case 6: psllq_i2r (48,mm0); psrlq_i2r (48,mm1); break;
        case 7: psllq_i2r (56,mm0); psrlq_i2r (56,mm1); break;
    };
    unsigned char *OutLeft= yuv, *OutRight= yuv+x__-8;
    for (int yy= y__; yy; yy--)
    {
        movq_m2r   (*OutLeft,mm2);
        movq_m2r   (*OutRight,mm3);
        pand_r2r   (mm0,mm2);
        pand_r2r   (mm1,mm3);
        #ifdef __WITH_MOVNTQ__
            movntq_r2m (mm2,*OutLeft);
            movntq_r2m (mm3,*OutRight);
        #else
            movq_r2m (mm2,*OutLeft);
            movq_r2m (mm3,*OutRight);
        #endif
            OutLeft+=  x__;
            OutRight+= x__;
        };
        Memms();
#endif


Pour ce passage, tu manipules des qwords (64 bits). Je ne sais pas comment tu implémentes les instructions mmx avec code::blocks (certainement des équivalences asm). Cependant, un long long int fait aussi 64 bits.

movq_m2r (mmx_ffffffff,mm0);
psllq_i2r (8,mm0);
psrlq_i2r (8,mm1);

Cette fonction (!!! sous Linux, en général, on a source, dest car synthaxe AT&T, sous Windows, on aura plutôt dest, source car synthaxe Intel) envoie un quad word de la mémoire vers un registre mmx. Tu devrais plutôt chercher l'implémentation de ces fonctions car c'est cette implémentation que tu devras traduire.

@++
0
elhajjajireda Messages postés 34 Date d'inscription mercredi 3 juin 2009 Statut Membre Dernière intervention 20 juin 2011
1 mai 2011 à 23:14
Bonjour,
bien évidement sont des pointeurs (char ,float ...) que j ai trouvé sur le débogage qui sont diffèrent,alors j'ai essayé de rentrer sur ces casses mémoires et vérifier si ça contient les même valeurs sur les deux plateformes, et là j'ai trouvé que c'est le même contenu.
donc si le vous plait est ce qu'il y a quelqu'un qui a une autre idée , par ce que là je ne trouve aucun piste à suivre !!!
- patataloet vous avez parlé d'une traduction et que je dois me soucier pour les préprocesseur avec des #ifdef si le vous plait est ce que vous pouvez m en parler plus et me dire comment je dois réécrire tous ça !!
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
5 mai 2011 à 20:04
re,

Si tu prends l'exemple sur une fonction simple de lecture de fichier.

Sous Linux: int read(int fd, void *buf, int cnt);
Sous Windows: BOOL ReadFile(HANDLE fd, void *buf, int cnt, int *lpread, LPOVERLAPPED *ov);

Ces deux fonctions liront un fichier mais pour les rendre compatibles, il faudrait que ReadFile retourne le nombre de caractères lus.

#ifdef __WIN32__
int read(f, b, c)
{
int retc;
if (ReadFile(f, b, c, &retc, NULL)) return retc;
else return 0;
}
#endif

Dans le code, la fonction r = read(f,b,c) sera compatible entre Windows et Linux.

@++
0
elhajjajireda Messages postés 34 Date d'inscription mercredi 3 juin 2009 Statut Membre Dernière intervention 20 juin 2011
8 mai 2011 à 21:36
Bonjour,
patatalo je crois aussi que le problème dans les fonctions qui traite les fichiers donc avec le le debugger de DDD et Kdevlop j'ai pu trouver que le problème était au niveau de la fonction qui permet de charger les photos avant de suivre le reste du traitement (filtrage,double filtrage, gradient .........extraction des points d'intérêt ),et là je vais vous montrer le code de cette fonction, pcq sous windows quand j'ai verifié j'ai trouvé que l'objet qui est censé de contenir l'image est entièrement null
int main (int argc,char *argv[])
{
        MCharImage Image1,Image2;
        Image1.Load(argv[1]);

}

int MCharImage::Load(const char* PpmOrPgm)           
{
  int IsColored= 0;
  ifstream Image(PpmOrPgm);  // créer un flot d'entrée associé à un fichier

  if (Image.bad())                                     //** test la valeur de badbit pour savoir si le flot est dans un état irrécupérable
    return 0;
  char C;                   
  while ((C Image.get()) '#') { do C = Image.get(); while (C != '\n'); };
  Image.putback(C);         
  char Tmp[256];
  Image.get(Tmp, 256, '\n'); 
  Image.get();
  if (!strcmp(Tmp, "P5"))                            IsColored= 0;
  else if (!strcmp(Tmp, "P6") || !strcmp(Tmp, "P3")) IsColored= 1;
  else return 0;

  while ((C Image.get()) '#') { do C = Image.get(); while (C != '\n'); };
  Image.putback(C);

  int xx, yy, zz;
  Image >> xx >> yy >> zz;
  if ((xx <= 0) || (yy <= 0) || (zz!= 255 && zz!= 254))
    return 0;
  SetSize(xx,yy);
  Image.get();

  int L= x__*y__;      // X__=xx  y__=yy
  if (!IsColored)
  {
    Image.read((char*)yuv, L);
  }
  else if (!strcmp(Tmp, "P6"))
  { // color binary
    char* Tmp2= new char[3*L];
    Image.read(Tmp2, 3*L);
    for (int i= 0; i< L; i++)
      yuv[i]= Tmp2[3*i+1];
    delete[] Tmp2;
  }
  else if (!strcmp(Tmp, "P3"))
  { // color ascii
    int R, G, B;
    for (int i= 0; i< L; i++) {
      Image >> R >> G >> B;
      yuv[i]= G;
    };
  };

  return 1;

}
0
Rejoignez-nous