En una terminal de Linux, escribí el comando por qué (este comando no existe) y obtuve esta respuesta

No command 'why'found, did you mean:
 ....
why: command not found

Para obtener el código de salida, esto es lo que escribí:

$?

Y obtuve la respuesta:

127: command not found

Supongo que cuando la mayoría de los comandos se ejecutan, devuelven códigos. Ahora, con gdb, después de ejecutar la siguiente línea del programa C que se está depurando, ¿devuelve algún código? Y si es así, ¿cómo obtengo esos códigos (un comando como $? en gdb? - No he encontrado una documentación en las páginas de man gdb de dicho comando.

* En cualquier caso, gdb debería saber (y probablemente registrar) si la línea se ejecutó correctamente y si no, qué salió mal.

0
kosgei 25 ene. 2016 a las 19:58

2 respuestas

La mejor respuesta

No existe tal cosa como una línea de código que se ejecute con éxito, al menos no de la misma manera que lo hacen los comandos dados al shell.

Cuando estás en el shell, estás ingresando el nombre de un comando de shell interno o un programa externo. En el caso de un programa externo, el valor de $? es el valor que el programa pasó a la llamada al sistema exit. Si el shell no puede encontrar un programa o comando con ese nombre, le da el mensaje de error que describió.

En un programa C compilado, no se devuelven "códigos" después de que se ejecuta una instrucción. Solo hay un cambio de estado en el programa. Por ejemplo, si una declaración es i = i + 1;, entonces el valor de i es 1 mayor que su valor antes de la ejecución de la declaración.

1
dbush 25 ene. 2016 a las 17:09

Los procesos Unix siempre devuelven un valor: su código de salida; llamado así porque la mayoría de los programas terminan con una llamada a exit (hay otras posibilidades pero sin importancia aquí). Tenga en cuenta que todos los procesos devuelven dicho código, no la mayoría . Los shells interpretan las líneas escritas por el usuario y las transforman en procesos. Cuando un proceso termina, el shel le permite conocer el valor del código de retorno del último proceso que controló. En bash, esta variable es $?. Si desea imprimirlo, puede usar echo $?. Si escribe $?, lo interpretará como un comando, pero 127 (el valor de salida del último comando) no es un comando. El estándar es tener un valor de retorno de 0 para procesos terminados correctamente, y cualquier valor no nulo para indicar que ocurrió un error en algún lugar de la lógica del programa.

Gdb también lanza procesos (para controlarlos) pero, al ejecutar una sola línea de código, no ejecuta un proceso, por lo que no hay código de salida después de ejecutar un paso de un código de programa. Cuando ejecuta, en gdb, algo que termina el proceso, su código de salida está disponible en una variable interna de gdb $_exitcode.

1
Jean-Baptiste Yunès 25 ene. 2016 a las 19:08