Parece que sua variável SHELL está definida para um arquivo que não existe. Tente o seguinte:
export SHELL=/bin/sh
gdb test
garantindo que /bin/sh
exista e seja executável. Isso funciona por meio de su
não por causa das permissões raiz, mas porque su
redefine a variável de ambiente SHELL
. Por su manual page :
Note that the default behavior for the environment is the following:
The $HOME, $SHELL, $USER, $LOGNAME, $PATH, and $IFS environment variables are reset.
Discussão adicional
Se você está se perguntando: "Como eu poderia saber isso da seguinte mensagem de erro?":
//error: Cannot exec /home/xxx/test/test -c exec /home/xxx/test/test .
//Error: No such file or directory
Você não está sozinho. Este parece ser um relatório de erros insuficiente de gdb
. Quando gdb
decide que precisa executar seu comando usando um shell, ele constrói um comando no seguinte formato:
/path/to/shell -c exec /path/to/executable
No entanto, quando ele imprime a mensagem de erro, ele faz isso:
save_errno = errno;
fprintf_unfiltered (gdb_stderr, "Cannot exec %s", exec_file);
for (i = 1; argv[i] != NULL; i++)
fprintf_unfiltered (gdb_stderr, " %s", argv[i]);
fprintf_unfiltered (gdb_stderr, ".\n");
fprintf_unfiltered (gdb_stderr, "Error: %s\n",
safe_strerror (save_errno));
gdb_flush (gdb_stderr);
Aqui exec_file
é o caminho expandido do arquivo que você passou na linha de comando. Ele imprime exec_file
primeiro, seguido pelos elementos argv
, começando no primeiro índice. argv
contém os argumentos passados para execvp
.
Infelizmente, o shell que ele está tentando usar está no 0º elemento de argv
, que nunca é impresso. Assim, você nunca verá o arquivo que execvp
não conseguiu encontrar.
Além disso, ele imprime um .
à direita que não é, na verdade, um dos argumentos passados para execvp
e, presumivelmente, está lá para tornar a mensagem uma sentença completa.
Finalmente, imprime o erro que recebemos de nossa chamada para execvp
, que é que o arquivo executável não pôde ser encontrado.
Esse erro provavelmente é causado pelo fato de que esse código de tratamento de erros é o mesmo para o caso em que gdb
tenta executar o comando diretamente e para o caso em que ele usa o shell. No primeiro caso, a mensagem de erro construída pareceria correta, pois exec_file
e argv[0]
seriam os mesmos.