私のコンピュータはUbuntu 14.04で動作します。 GDBは別のアカウントで異常のようです。たとえば、私は非常に簡単なテストを行います。次のように~/test/test.c
でファイルを書き込みます。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
printf("hello,world");
return 0;
}
コマンド"gcc -g test.c -o test"でビルドすると、testという名前の結果ファイルが得られます。次のステップでは、gdbを実行してデバッグします。現在のアカウントは自分のユーザーであることに注意してください。
$gdb test
(gdb)l //work well
(gdb) b 6 //work well
(gdb) r //error: Cannot exec /home/xxx/test/test -c exec /home/xxx/test/test .
//Error: No such file or directory
しかし、コマンド「su」でrootアカウントに変更すると、gdbはうまく機能します。どうして?
Shell変数が存在しないファイルに設定されているようです。以下を試してください:
export Shell=/bin/sh
gdb test
/bin/sh
が存在し、実行可能であることを確認します。これはsu
を介して機能します。これは、rootの権限が原因ではなく、su
がShell
環境変数をリセットするためです。 suマニュアルページ :
環境のデフォルトの動作は次のとおりです。
$ HOME、$ Shell、$ USER、$ LOGNAME、$ PATH、および$ IFS環境変数がリセットされます。
「次のエラーメッセージからどうやってそれを知ることができたのですか?」
//error: Cannot exec /home/xxx/test/test -c exec /home/xxx/test/test .
//Error: No such file or directory
あなた一人じゃありません。これは、gdb
からのエラー報告が不十分であるようです。 gdb
は、シェルを使用してコマンドを実行する必要があると判断すると、次の形式でコマンドを作成します。
/path/to/Shell -c exec /path/to/executable
ただし、エラーメッセージが出力されると、次のようになります。
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);
ここでexec_file
は、コマンドラインで渡したファイルの展開パスです。最初にexec_file
を出力し、次に最初のインデックスから始まるargv
の要素を出力します。 argv
には、execvp
に渡した引数が含まれています。
残念ながら、使用しようとしているシェルはargv
の0番目の要素にあり、印刷されません。したがって、execvp
が見つけられなかったファイルは表示されません。
さらに、末尾の.
を出力しますが、これは実際にexecvp
に渡した引数の1つではなく、おそらくメッセージを完全な文にするためにそこにあります。
最後に、execvp
への呼び出しから返されたエラーを出力します。これは、実行可能ファイルが見つからなかったことを意味します。
このバグは、このエラー処理コードが、gdb
がコマンドを直接実行しようとする場合と、シェルを使用する場合とで同じであることが原因で発生する可能性があります。前者の場合、exec_file
とargv[0]
は同じであるため、構築されたエラーメッセージは正しいように見えます。