私のコンピュータは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.txt という結果ファイルが生成されます。次に、デバッグのために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は正しく機能します。なぜ?
答え1
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
印刷されません。したがって、execvp
見つからないファイルは決して見えません。
.
また、実際に渡された引数の1つではなく末尾を印刷し、execvp
おそらくメッセージを完全な文にするためのものです。
最後に、呼び出しによって返されたエラーexecvp
、つまり実行可能ファイルが見つからないというエラーを印刷します。
gdb
このエラーは、コマンドを直接実行しようとしたときとシェルを使用したときにエラー処理コードが同じであるために発生する可能性があります。前者の場合、設定されたエラーメッセージはとがexec_file
等しいargv[0]
ため正しく表示されます。