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 Discussion :

Erreur Memory windows => SQLHANDLE


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Par défaut Erreur Memory windows => SQLHANDLE
    Bonjour à tous !

    Je suis un débutant dans la programmation C (un peu moins d'un an).
    Jusqu'a peu de temps je développais des petits binaires sous Unix.

    Il y a à peu près une semaine on m'a demandé de redévelopper quelques binaires sous windows.

    Et là, rien ne va plus.
    Je vous explique mon problème (j'ai posté aussi sur le forum DB2 mais on ne sait jamais).

    Je tente de lire des tables sur une base de données (DB2). Pour ce faire j'utilise des programmes d'exemples fournis par IBM.

    La compilation se passe correctement (j'utilise Dev C++). Tous les includes, les lib sont correctement linkés.

    Le problème c'est qu'à l'execution de mon programme windows me sort une erreur mémoire, la voici :

    The instruction at "0x80000049" referenced memory at "0X80000049". The memory could not be "read".

    J'ai essayé de voir ou cela buggais. J'ai à peu près trouver la fonction en erreur, voici le code :

    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
    22
    int CLIAppInit(char dbAlias[],
                   char user[],
                   char pswd[],
                   SQLHANDLE *pHenv,
                   SQLHANDLE *pHdbc,
                   SQLPOINTER autocommitValue)
    {
      SQLRETURN cliRC = SQL_SUCCESS;
      int rc = 0;
     
      printf("INIT CLIAPPInit");
      /* allocate an environment handle */
      cliRC = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, pHenv);
      if (cliRC != SQL_SUCCESS)
      {
        printf("\n--ERROR while allocating the environment handle.\n");
        printf("  cliRC             = %d\n", cliRC);
        printf("  line              = %d\n", __LINE__);
        printf("  file              = %s\n", __FILE__);
        return 1;
     
      }
    J'ai par la suite commenté cette fonction. Après recompilation et execution windows me lache la même erreur dans une fonction différente.

    Je me demande donc d'ou le probleme peut venir.

    Voici l'appel de la fonction dans mon main :

    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
    22
    23
    24
    25
    char dbAlias[SQL_MAX_DSN_LENGTH + 1];
      char user[MAX_UID_LENGTH + 1];
      char pswd[MAX_PWD_LENGTH + 1];
     
      /* check the command line arguments */
      rc = CmdLineArgsCheck1(argc, argv, dbAlias, user, pswd);
      if (rc != 0)
      {
        return rc;
      }
     
      printf("\nTHIS SAMPLE SHOWS HOW TO READ DATA FROM TABLES.\n");
     
      /* initialize the application by calling a helper
         utility function defined in utilcli.c */
      rc = CLIAppInit(dbAlias,
                      user,
                      pswd,
                      &henv,
                      &hdbc,
                      (SQLPOINTER)SQL_AUTOCOMMIT_ON);
      if (rc != 0)
      {
        return rc;
      }
    Une idée ?

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    L'appel de ton SQLAllocHandle() semble correct. Je dirai que si cela crash à cet endroit, c'est que ton code ailleurs a déjà foutu le bazard dans la mémoire.

    Il faut chercher et debugger.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Par défaut
    J'ai fait des printf pour savoir ce que je passais a SQLAllocHandle, voici le résutlat :

    pHenv : $x
    SQL_HANDLE_ENV : 1
    SQL_NULL_HANDLE : 0

    Par contre, je ne vois pas comment je peux mettre le bazar dans la mémoire avant, vu le peu de code qu'il y a :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    /*******************************************************************
    ** main
    *******************************************************************/
    int main(int argc, char *argv[])
    {
      SQLRETURN cliRC = SQL_SUCCESS;
      int rc = 0;
      SQLHANDLE henv; /* environment handle */
      SQLHANDLE hdbc; /* connection handles */
     
      char dbAlias[SQL_MAX_DSN_LENGTH + 1];
      char user[MAX_UID_LENGTH + 1];
      char pswd[MAX_PWD_LENGTH + 1];
     
      /* check the command line arguments */
      /*rc = CmdLineArgsCheck1(argc, argv, dbAlias, user, pswd);
      if (rc != 0)
      {
        return rc;
      }*/
     
      printf("\nTHIS SAMPLE SHOWS HOW TO READ DATA FROM TABLES.\n");
     
      /* initialize the application by calling a helper
         utility function defined in utilcli.c */
      rc = CLIAppInit(dbAlias,
                      user,
                      pswd,
                      &henv,
                      &hdbc,
                      (SQLPOINTER)SQL_AUTOCOMMIT_ON);
    J'ai commenté la fonction CmdLineArgsCheck1, mais que je commente ou pas c'est le même problème.

    Ce que je remarque par ailleurs, c'est que mon SQLHANDLE henv n'est jamais initialisé.
    Sachant que le SQLHANDLE est défini en tant que SQLINTEGER soit un int...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    À en juger par le message d'erreur, on dirait que le programme essaie d'exécuter du code à une adresse complètement invalide. En clair, c'est le pointeur d'instruction (aussi appelé compteur programme) qui est corrompu.

    Ce qui arrive généralement dans le cas d'un débordement de buffer sur la pile: Si l'adresse de retour est écrasée, c'est cette nouvelle valeur qui se retrouve dans le pointeur d'instruction (ce qui en fait un vecteur d'attaque connu pour les pirates informatiques).
    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 régulier
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    À en juger par le message d'erreur, on dirait que le programme essaie d'exécuter du code à une adresse complètement invalide. En clair, c'est le pointeur d'instruction (aussi appelé compteur programme) qui est corrompu.

    Ce qui arrive généralement dans le cas d'un débordement de buffer sur la pile: Si l'adresse de retour est écrasée, c'est cette nouvelle valeur qui se retrouve dans le pointeur d'instruction (ce qui en fait un vecteur d'attaque connu pour les pirates informatiques).
    Je ne comprend pas très bien ce que tu essaye de m'expliquer
    Ce que moi j'ai compris et ce que j'en tire comme explication :

    Il y a un SQLHANDLE défini mais pas initialisé. Je l'envoi dans une fonction qui permet d'allouer un HANDLE (SQLAllocHandle). Malheureusement cette allocation de HANDLE essayer de se faire sur une adresse invalide. Donc pas d'allocation et windows ne se cache pas pour me le faire savoir.

    Pourtant ce code provient de IBM, je doute qu'il soit buggé, mais je ne comprend pas pourquoi cette allocation ne se fait pas correctement. Au vu du code du main que j'ai copier au dessus, je ne vois pas comment j'influs sur cette tentative d'allocation...sa devient très compliqué cette histoire, j'ai peur que cela commence à me dépasser

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je pensais surtout à des problèmes autour de dbalias, user, pswd...
    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. [mono] Compilation sous linux, erreur dans windows
    Par AlexandreP dans le forum Mono
    Réponses: 6
    Dernier message: 18/08/2006, 19h56
  2. Réponses: 4
    Dernier message: 09/08/2006, 22h28
  3. comment exploiter les codes d'erreurs sous windows xp?
    Par lejum2005 dans le forum Windows XP
    Réponses: 4
    Dernier message: 03/03/2006, 17h26
  4. Erreur fichier"\windows\system32\config\system" in
    Par mzt.insat dans le forum Windows XP
    Réponses: 3
    Dernier message: 22/02/2006, 10h30
  5. Personnaliser un rapport d'erreur sous Windows XP
    Par Neilos dans le forum Windows
    Réponses: 5
    Dernier message: 21/11/2003, 18h13

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