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 :

gdb et arguments multilignes


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut gdb et arguments multilignes
    Bonjour, bonsoir

    Je voudrais debogger mon programme qui, comme cela est explicité dans le titre, prend un argument de plusieurs lignes. Il s'agit en fait d'une chaîne d' hexa, genre \x01\x41\xff ect...
    Je ne sais pas pourquoi mais il doit y avoir \r ou \n ou les deux dans le lot.
    Résultat: l'argument que j'obtiens par ailleurs s'affiche sur plusieurs lignes dans le shell.

    J'ai essayé les démarches suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gdb monprog.c
    (gdb) r copier/coller de la chaîne que j'ai affiché dans un autre bash
    puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gdb --args monprog $(prog2)
    La sortie de prog 2 est l'argument de monprog bien thur.
    Il se passe que je trouve des intrus dans argv[1] par la suite. En effet, pas mal de \x20 (espace si je ne m'abuse) se sont incrustés.

    Je ne renacle pas à utiliser python ou bash.
    Cependant je dois dire je n'ai pas accès au paramètre --with-python dans gdb au cas
    où ce serait utile.

    Exemple de sortie de prog2 (j'ai mis des \r et \n exprès):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/usr/bin/env python
     
    buffer = "\xbf\xff\xfe\x33\x0atoto\x0dtiti\x0d\x0atutu"
    print buffer
    Merci pour avoir lu jusqu'ici.
    Merci pour vos réponses aussi

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 378
    Points : 23 673
    Points
    23 673
    Par défaut
    Hello,

    Sous gdb, la commande « r » ou « run » s'utilise de la même façon qu'en shell : tu peux utiliser les apostrophes « ' » ou les guillemets « " » pour encadrer une chaîne contenant des espaces ou des caractères spéciaux, et il faut utiliser un anti-slash « \ » comme caractère de fin de ligne (sans espace ni blanc après) pour poursuivre à la suivante et considérer le tout comme une seule et unique chaîne.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut Obsidian,

    Ca marche en effet, cela dit j'ai oublié de dire que j'ai à faire à des chaînes bien plus longues. S'il existe un autre moyen...

    J'ai essayé les tuyaux, ça ne fonctionne pas (BROKEN PIPE).

    Enfin s'il existe une solution miracle...

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 378
    Points : 23 673
    Points
    23 673
    Par défaut
    Tu peux aussi utiliser le résultat d'une commande, comme en shell, avec les symboles « ` » ou « $(…) », et encadrer ces symboles avec des guillemets « " » pour être sûr que le résultat sera considéré comme une chaîne unique. Du coup, tu peux mettre ta chaîne dans un fichier et l'insérer en argument pendant une session gdb avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (gdb) r programme "$(cat fichier.txt)"
    Seulement, passer des arguments kilométriques de cette manière à un programme, c'est particulièrement sale ! Il est même probable que les arguments eux-mêmes ne soient pas conçus pour admettre des chaînes aussi longues.

    Si ce que tu passes en argument, ce sont justement les données à traiter, alors la manière normale de procéder est de passer par l'entrée standard. Ça se gère comme un fichier, tu reçois le signal EOF lorsque la fin des données est atteinte, et tu n'as pas besoin de t'occuper de l'ouverture et de la re-fermeture. Ça permet également à l'utilisateur de piper ta commande avec une autre ou de passer directement le fichier en question à l'entrée standard avec « < ».

    J'ai essayé les tuyaux, ça ne fonctionne pas (BROKEN PIPE).
    A priori, tu n'as pas besoin d'ouvrir explicitement un tube pour ce faire. Si tu as obtenu ce message en exploitant l'entrée standard, c'est probablement parce qu'il a été émis par l'autre programme qui, lui, s'est retrouvé confronté à un tube vide quand il cherchait à ÉCRIRE dedans. Fort probablement parce que ton programme s'est terminé avant d'avoir lu tout ce qu'il y avait à lire.

Discussions similaires

  1. Arguments pour et contre Access ?
    Par bottura dans le forum Sondages et Débats
    Réponses: 240
    Dernier message: 23/03/2018, 23h25
  2. StringGrid, multiligne et word wrap
    Par Dajon dans le forum C++Builder
    Réponses: 7
    Dernier message: 17/09/2003, 17h15
  3. Récuperer Arguments sur la ligne de commande ?
    Par Muetdhiver dans le forum x86 16-bits
    Réponses: 9
    Dernier message: 20/01/2003, 21h01
  4. fonction renvoyant un tableau en argument
    Par Jones dans le forum Langage
    Réponses: 6
    Dernier message: 30/09/2002, 18h20
  5. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08

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