2016-09-10 1 views
5

Je cours eclipse Neon1 RC1 sur une machine Win10, et il semble ajouter des guillemets simples autour de chaque argument/paramètre de ligne de commande que je passe pendant le débogage. Je vois ce spectacle en mémoire pour chaque argv.Pourquoi eclipse ajoute-t-il des guillemets simples à mes paramètres de ligne de commande C?

Curieusement, je ne peux pas produire ces citations à la console avec un printf (pendant RUN); le programme charge avec succès le fichier spécifié par les paramètres et les sorties vers la console.

Les arguments de ligne de commande sont SETIN l'onglet exécution de l'application config-> Paramètres, comme (une seule ligne, sans guillemets ajouté):

keyFile.txt inputFile.txt outputFile.txt 

Je ne vois pas ce comportement dans NetBeans (en fait ont changé temporairement).

Le problème est que cela semble causer des problèmes avec fopen lors du débogage: il ne trouve pas le fichier. Je suppose que les deux utilisent le même répertoire de travail, parce que si j'utilise un nom de fichier statique de "keyFile.txt", le débogage fonctionne bien.

Malheureusement, la sortie de ma console ne fonctionne pas dans le débogage, donc je suis un peu limité pour le moment.

Le code exemple est une version beaucoup dégrossi, pour démontrer:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char** argv) { 

    // arguments: keyfile.txt inputfile.txt outputfile.txt 

    char * firstArg = argv[1]; 
    char * secArg = argv[2]; // leaving these to show quotes on other inputs as well 
    char * thirdArg = argv[3]; 

    printf("First arg:\t%s\n", firstArg); 
    printf("Ptr Address, uint cast:\t0x%x\n", (unsigned int) firstArg); 
    printf("Ptr Address, void* cast:\t%p\n", (void *) firstArg); 
    printf("Char at Ptr:\t%c\n\n", (char) *(firstArg)); 

    printf("Second arg: \t%s\n", secArg); 
    printf("Third arg: \t%s\n", thirdArg); 

    FILE *fptr; 
    fptr = fopen(firstArg, "rb"); 
    if (fptr == NULL) 
    { 
     perror("Error"); 
     return -1; 
    } 

    int kLength=0; 
    int inputChar; 
    unsigned char keyin[256]; 

    printf("\nData from file:\n"); 
    while ((inputChar = fgetc(fptr))!=EOF)  // read KEYFILE 
    { 
     if ((kLength%8)==0) { printf("\n"); } 
     keyin[kLength++] = (unsigned char) inputChar; 
     printf("0x%x\t",inputChar); 
    } 

    return 0; 
} 

Sur Run sortie comme prévu/suit:

First arg: keyFile.txt 
Ptr Address, uint cast:  0x6b1748 
Ptr Address, void* cast: 006B1748 
Char at Ptr: k 

Second arg:  inputFile.txt 
Third arg: outputfile.txt 
current Path: C:\Users\***\Google Drive\***\eclipse workspace\argTest 
Data from file: 

0x59 0x45 0xba 0x1e... 
... 
(data I expect is displayed from file ...) 

Mais au cours de débogage, je reçois pris au piège par un nul fptr, et je vois les citations en mémoire:

Debug memory: firstArg points to 0x6E1760

En regardant les traces de gdb, je vois aussi les guillemets simples. Ci-dessous, tout ayant mené à ce point:

311,234 2-gdb-version 
311,239 ~"GNU gdb (GDB) 7.6.1\n" 
311,240 ~"Copyright (C) 2013 Free Software Foundation, Inc.\n" 
311,240 ~"License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\nThis is fre\ 
e software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitt\ 
ed by law. Type \"show copying\"\nand \"show warranty\" for details.\n" 
311,240 ~"This GDB was configured as \"mingw32\".\nFor bug reporting instructions, please see:\n" 
311,240 ~"<http://www.gnu.org/software/gdb/bugs/>.\n" 
311,240 2^done 
311,241 (gdb) 
311,243 3-environment-cd "C:/Users/***/Google Drive/***/workspace/argTest"\ 
311,250 3^done 
311,250 (gdb) 
311,251 4-gdb-set breakpoint pending on 
311,260 4^done 
311,260 (gdb) 
311,261 5-gdb-set detach-on-fork on 
311,270 5^done 
311,270 (gdb) 
311,271 6-enable-pretty-printing 
311,280 6^done 
311,280 (gdb) 
311,281 7-gdb-set python print-stack none 
311,290 7^done 
311,290 (gdb) 
311,291 8-gdb-set print object on 
311,300 8^done 
311,300 (gdb) 
311,301 9-gdb-set print sevenbit-strings on 
311,310 9^done 
311,310 (gdb) 
311,311 10-gdb-set host-charset UTF-8 
311,320 10^done 
311,320 (gdb) 
311,321 11-gdb-set target-charset WINDOWS-1252 
311,330 11^done 
311,330 (gdb) 
311,331 12-gdb-set target-wide-charset UTF-16 
311,340 12^done 
311,340 (gdb) 
311,342 13source .gdbinit 
311,350 &"source .gdbinit\n" 
311,350 &".gdbinit: No such file or directory.\n" 
311,350 13^error,msg=".gdbinit: No such file or directory." 
311,350 (gdb) 
311,351 14-gdb-set target-async off 
311,360 14^done 
311,360 (gdb) 
311,361 15-gdb-set auto-solib-add on 
311,370 15^done 
311,370 (gdb) 
311,379 16-file-exec-and-symbols --thread-group i1 Debug/argTest.exe 
311,384 16^done 
311,384 (gdb) 
311,385 17-gdb-set --thread-group i1 args 'keyFile.txt' 'inputFile.txt' 'outputFile.txt' 
311,394 17^done 
311,394 (gdb) 
... 
+0

La question évidente première: avez-vous vérifié (triple) que vous n'avez pas ajouté vous-même ces guillemets? –

+0

Ensuite, la question plus importante: Donc, lors de l'exécution de débogage, le printf * ne * pas * afficher les guillemets? Pouvez-vous mettre un deuxième printf (impression de la direction) derrière ces trois déclarations printf? Est-ce que * that * inclut les guillemets? –

+2

Ensuite: main retourne un int. –

Répondre

3

C'est un bug connu dans Eclipse, suivi ici:

+0

Génial, merci Ben. J'ai vu une référence à un bug similaire dans ma recherche, mais c'était il y a longtemps et je ne m'attendais pas à ce qu'un tel problème soit présent dans une idée dominante ... – NEJames

1

Ma solution consiste à définir les arguments. Fichier gdbinit au lieu de définir dans l'onglet Arguments (dans les configurations de débogage), il suffit de mettre la ligne comme:

set args arg1 arg2

Et puis, ça marche bien!