web-dev-qa-db-ja.com

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"でビルドすると、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はうまく機能します。どうして?

5
DarkHorse

Shell変数が存在しないファイルに設定されているようです。以下を試してください:

export Shell=/bin/sh
gdb test

/bin/shが存在し、実行可能であることを確認します。これはsuを介して機能します。これは、rootの権限が原因ではなく、suShell環境変数をリセットするためです。 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_fileargv[0]は同じであるため、構築されたエラーメッセージは正しいように見えます。

4
Steven D