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 :

Comprendre ce SIGTRAP!


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de cpcdos
    Homme Profil pro
    Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Inscrit en
    Mai 2010
    Messages
    589
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 589
    Billets dans le blog
    1
    Par défaut Comprendre ce SIGTRAP!
    Bonjour à tous,
    ça fais plusieurs fois que lors de l'exécution d'un simple programme compilé avec GCC 4.7.3 en C sous DOS avec l'étendeur DPMI, je tombe sur le signal SIGTRAP.
    Je n'es pourtant pas mis de breakpoint/int3 comme explique plusieurs sites internet. Pour que ça sois plus facile, un simple copier coller de ce 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    #include <stdio.h> /* printf, sprintf */
    #include <stdlib.h> /* read, write, close */
    #include <string.h> /* memcpy, memset */
    #include <sys/socket.h> /* socket, connect */
    #include <netinet/in.h> /* struct sockaddr_in, struct sockaddr */
    #include <netdb.h> /* struct hostent, gethostbyname */
     
    void error(const char *msg) { perror(msg); exit(0); }
     
    int main(int argc,char *argv[])
    {
        /* first what are we going to send and where are we going to send it? */
        int portno =        80;
        char *host =        "api.somesite.com";
        char *message_fmt = "POST /apikey=%s&command=%s HTTP/1.0\n\n";
     
        struct hostent *server;
        struct sockaddr_in serv_addr;
        int sockfd, bytes, sent, received, total;
        char message[1024],response[4096];
     
        if (argc < 3) { puts("Parameters: <apikey> <command>"); exit(0); }
     
        /* fill in the parameters */
        sprintf(message,message_fmt,argv[1],argv[2]);
        printf("Request:\n%s\n",message);
     
        /* create the socket */
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (sockfd < 0) error("ERROR opening socket");
     
        /* lookup the ip address */
        server = gethostbyname(host);
        if (server == NULL) error("ERROR, no such host");
     
        /* fill in the structure */
        memset(&serv_addr,0,sizeof(serv_addr));
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_port = htons(portno);
        memcpy(&serv_addr.sin_addr.s_addr,server->h_addr,server->h_length);
     
        /* connect the socket */
        if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
            error("ERROR connecting");
     
        /* send the request */
        total = strlen(message);
        sent = 0;
        do {
            bytes = write(sockfd,message+sent,total-sent);
            if (bytes < 0)
                error("ERROR writing message to socket");
            if (bytes == 0)
                break;
            sent+=bytes;
        } while (sent < total);
     
        /* receive the response */
        memset(response,0,sizeof(response));
        total = sizeof(response)-1;
        received = 0;
        do {
            bytes = read(sockfd,response+received,total-received);
            if (bytes < 0)
                error("ERROR reading response from socket");
            if (bytes == 0)
                break;
            received+=bytes;
        } while (received < total);
     
        if (received == total)
            error("ERROR storing complete response from socket");
     
        /* close the socket */
        close(sockfd);
     
        /* process response */
        printf("Response:\n%s\n",response);
     
        return 0;
    }
    provenant d'ici fonctionne parfaitement, mais me génère un SIGTRAP à la fin de l'exécution.

    ça pourrait être tout bête, mais si quelqu'un pourrait m'éclairer sur ce phénomène que je n'arrive pas à comprendre..

    Merci, bonne journée
    Sébastien FAVIER
    Felly-software Autonomous vehicle software for everyone.
    co-kernel Cpcdos OSx un noyau 32bits simplifié et complet.. ou presque - Le fofo officiel c'est par ici.
    Les cours sur les systèmes c'est par là

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 489
    Par défaut
    Oulà, j’espère que vous de très très bonne raison de travaille sur de telles antiquités et en n'utilisant pas toute la ribambelle de bibliothèques qui ferait ce trucs de manière bien plus simple, plus concise, plus efficacement et bien plus sûre.

    SIGTRAP est un enrobage UNIX/POSIX de plusieurs sources possibles, int3 (opcode 0xCC) en n'est que la cause la plus probable, mais les architectures INTEL "récentes" disposent de plusieurs registres pour déclencher des interruptions en cas de modification de cases mémoires.
    Il est même probable que SIGTRAP englobe d'autres scénarios.

    Le débugging en mode pas à pas de l'application devrait donner le fin mot de l'histoire, non ?

  3. #3
    Membre Expert
    Avatar de cpcdos
    Homme Profil pro
    Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Inscrit en
    Mai 2010
    Messages
    589
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 589
    Billets dans le blog
    1
    Par défaut
    Bonsoir, merci pour votre réponse

    Oui j'ai de bonnes raisons

    Le débugging en mode pas à pas de l'application devrait donner le fin mot de l'histoire, non ?
    Je suis très confus..

    Je viens un instant de tester le GDB en compilant avec le paramètre -g je teste pas à pas, tout fonctionne sans avoir ce SIGTRAP
    Alors je me suis dit que c'était l'organisation de la mémoire ram/exécution qui est différente avec ce GDB en main-process, donc je teste sans GDB et je n'es pas non plus ce SIGTRAP.
    DONC je recompile sans le paramètre -g histoire de revenir sur le code d'origine et bon dieu je n'es pas non plus ce SIGTRAP!
    J'avais eu ce signal sur un ACER ASPIRE x1700 Processeur Intel Pentium Dual-Core E2220

    Es-ce la mémoire RAM endommagée qui par hasard contient "1100 1100" dans le segment de mon code ?
    Sébastien FAVIER
    Felly-software Autonomous vehicle software for everyone.
    co-kernel Cpcdos OSx un noyau 32bits simplifié et complet.. ou presque - Le fofo officiel c'est par ici.
    Les cours sur les systèmes c'est par là

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    À ce moment là, il faut utiliser valgrind, pour voir si vous ne faites pas n'importe quoi avec la mémoire (lecture/écriture dans des zones qui ne vous appartiennent pas, saut sur des variables non initialisées...).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre Expert
    Avatar de cpcdos
    Homme Profil pro
    Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Inscrit en
    Mai 2010
    Messages
    589
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 589
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Merci pour votre réponse, concernant Valgrind, apparemment il ne ferons pas de versions compatible NT, je peux installer une VM d'ubuntu, mais avant j'aimerai commencer par le plus simple, il y aurait-il donc pas une semblable mais pour Windows (ou DOS) ?
    Merci
    Sébastien FAVIER
    Felly-software Autonomous vehicle software for everyone.
    co-kernel Cpcdos OSx un noyau 32bits simplifié et complet.. ou presque - Le fofo officiel c'est par ici.
    Les cours sur les systèmes c'est par là

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 489
    Par défaut
    J'ai du louper un truc, vous faites un DOS extender, donc DOS et en aucun cas NT et vous vous souciez de la compatibilité d'un outil avec Windows NT ???
    L'option -g change pas mal de chose dans l'exécutable, je crois. Cela peut donc neutraliser involontairement un bug latent.
    Normalement, vous devriez quand même pouvoir débugger sans -g, juste avec le code assembleur.

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Citation Envoyé par cpcdos Voir le message
    Bonjour,
    Merci pour votre réponse, concernant Valgrind, apparemment il ne ferons pas de versions compatible NT, je peux installer une VM d'ubuntu, mais avant j'aimerai commencer par le plus simple, il y aurait-il donc pas une semblable mais pour Windows (ou DOS) ?
    Merci
    Pour Windows : Dr Memory. Cela fait exactement la même chose que valgrind, donc tout ira bien.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/02/2005, 10h42
  2. Réponses: 12
    Dernier message: 08/02/2005, 23h42
  3. [langage] comprendre une syntaxe particulière
    Par mat21 dans le forum Langage
    Réponses: 4
    Dernier message: 08/12/2004, 18h12
  4. [Concept][JavaBeans] Comprendre ?
    Par nicoo dans le forum Langage
    Réponses: 15
    Dernier message: 08/12/2004, 08h01
  5. [Procédure][java] A n'y rien comprendre
    Par Stessy dans le forum SQL
    Réponses: 2
    Dernier message: 18/03/2004, 15h05

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