GDBは私のテストプログラムを実行できません

GDBは私のテストプログラムを実行できません

私のコンピュータは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

あなたは一人ではありません。これはバグレポートからのようですgdbgdbコマンドを実行するためにシェルを使用する必要があると判断したら、次の形式でコマンドを構成します。

/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要素を印刷します。渡されるパラメータを含みます。argvargvexecvp

残念ながら、使用したいシェルはゼロ番目の要素にあり、argv印刷されません。したがって、execvp見つからないファイルは決して見えません。

.また、実際に渡された引数の1つではなく末尾を印刷し、execvpおそらくメッセージを完全な文にするためのものです。

最後に、呼び出しによって返されたエラーexecvp、つまり実行可能ファイルが見つからないというエラーを印刷します。

gdbこのエラーは、コマンドを直接実行しようとしたときとシェルを使用したときにエラー処理コードが同じであるために発生する可能性があります。前者の場合、設定されたエラーメッセージはとがexec_file等しいargv[0]ため正しく表示されます。

関連情報