0

PintOS コマンドを実行しようとしてpintos -fいます (PintOS に慣れていなくても心配しないでください)。内部的に、init.cプログラムが呼び出され、そのparse_options()関数は渡されたコマンド ライン引数を処理します。以下は、init.c の関連スニペットです。

static char **
parse_options (char **argv) 
{
   for (; *argv != NULL && **argv == '-'; argv++)
   {
      char *save_ptr;
      char *name = strtok_r (*argv, "=", &save_ptr); //fn to tokenise the string
      char *value = strtok_r (NULL, "", &save_ptr);
      if (!strcmp (name, "-h"))
        usage ();
      else if (!strcmp (name, "-q"))
        power_off_when_done = true;
      else if (!strcmp (name, "-r"))
        reboot_when_done = true;
      /*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/

      #ifdef FILESYS
      else if (!strcmp (name, "-f"))
        format_filesys = true;
      #endif

      /*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/
      else if (!strcmp (name, "-rs"))
        random_init (atoi (value));
      else if (!strcmp (name, "-mlfqs"))
        thread_mlfqs = true;
      #ifdef USERPROG
      else if (!strcmp (name, "-ul"))
        user_page_limit = atoi (value);
      #endif
      else
        PANIC ("unknown option `%s' (use -h for help)", name);
   }
   return argv;
}

$$$$セクション内のコードに従って、-f渡されたオプションは、FILESYS が定義されている場合にのみ処理されます。

を実行するmakeと、次のコマンドが実行されます

gcc -m32 -c ../../threads/init.c -o threads/init.o -g -msoft-float -O -fno-stack-    protector -nostdinc -I../.. -I../../lib -I../../lib/kernel -Wall -W -Wstrict-prototypes -Wmissing-prototypes -Wsystem-headers -DUSERPROG -DFILESYS -MMD -MF threads/init.d

ここでは、-DUSERPROG および -DFILESYS オプションを使用して FILESYS および USERPROG を定義し、コードの関連セクションを実行できるようにします。pintos -fただし、次のコマンド出力から明らかなように、何らかの形で FILESYS が定義されていません。

Kernel command line: -f
Kernel PANIC at ../../threads/init.c:261 in parse_options(): unknown option `-f' (use -h for help)

他のいくつかのテストでは、FILESYS が定義されていないことが問題であることを確認しています。私は gcc 構文をチェックし、gcc で -DNAME オプションをチェックするために次のダミー プログラムを作成しました。

DummyProg.c

#include "stdio.h"
int main()
{
#ifdef CHECK 
    printf("WORKING\n");
#endif
return 0;
}

gcc -DCHECK DummyProg.c./a.out、WORKING が画面に表示され、構文の妥当性などを確認しました。 使用している gcc のバージョンはgcc (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3 です。

誰かがこの問題を解決する方法を教えてください。

4

3 に答える 3

1

コンパイラはこれを理解するのに役立ちます。秘訣は、次の#defineステートメントを残して処理済みのコードをキャプチャすることです。

gcc -E -dD ...blah...

-cコンパイル コマンドからオプションとオプションを削除する必要があり-o <outfile>ますが、それ以外の場合は、2 つの新しいオプションを追加する以外はそのままにしておきます。

-E前処理ステップのみを実行し、画面に出力するように指示します。

-dD#defineand#undefディレクティブで終了するように指示します。

私の推測では、あなたのコードには#undef FILESYSどこかにディレクティブがあり、-DFILESYSオプションをオーバーライドしています。

于 2013-10-16T13:50:19.757 に答える
0

このような問題をデバッグするにはgcc-E. これは、プリプロセッサを通してコードを実行するだけcppです。出力ファイルを調べて、後処理ステップの後に C コンパイラの入力がどうなるかを確認します。

于 2013-10-16T13:08:47.727 に答える