view user/pine/note/2021/10/19.md @ 97:edf8ac727c05

backup 2021-10-20
author autobackup
date Wed, 20 Oct 2021 00:10:04 +0900
parents
children
line wrap: on
line source

# 研究目的
- アプリケーションの信頼性を保証するために、アプリケーションが動作するOSの信頼性を高める必要がある。

- 本研究室では、Continuation Based C(CbC)を用いて、信頼性と拡張性を両立するOSであるGearsOSを開発している。

- ソフトウェア開発においてエラー・バグは付き物であり、その発見が重要である。現在GearsOSにはデバッガーが未実装であるため、円滑なOS開発を行うために、GearsOSのデバッガーを作成する。

## やったこと
- 実行時に`-debug`オプションを指定できるようにした。
- プロンプトの実装

## 作業ログ
DPPMCのmain.cbc内のinit()で`-debug`オプションを受け取れる用に変更。
```
void init(int argc, char** argv) {
    for (int i = 1; argv[i]; ++i) {
        if (strcmp(argv[i], "-cpu") == 0)
            cpu_num = (int)atoi(argv[i+1]);
        else if (strcmp(argv[i], "-cuda") == 0) {
            gpu_num = 1;
            CPU_CUDA = 0;
        } else if (strcmp(argv[i], "-debug") == 0) {
            printf("get -debug option in main function\n");
            DEBUG_OPTION = 1;
        }
    }
}
```

また、mcMetaのgoto先を`-debug`オプションの有無で変更している。
```
    if (DEBUG_OPTION == 0) {
        printf("DEBUG_OPTION: %i, goto meta\n", DEBUG_OPTION);
        goto meta(context, context->next);
    } else {
        printf("DEBUG_OPTION: %i, goto debug\n", DEBUG_OPTION);
        goto debugMeta(context, context->next);
    }
```

`./DPPMC`で実行すると、通常のModelCheckingが行われる。

`./DPPMC -debug`で実行すると、debugMetaにgotoされる。

debugMeta内でプロンプトの表示を行っている。

また、プロンプトの入力によって異なる処理をさせるようにしている。

```
__ncode debugMeta(struct Context* context, enum Code next) {
    context->next = next; // remember next Code Gear

    while(1) {
        char user_input_buffer[256];
        size_t length;

        printf("-----------------------\n\n");
        printf("(Gears Debugger) ");

        // delete new line
        fgets(user_input_buffer, 256, stdin);
        length = strlen(user_input_buffer);
        if (user_input_buffer[length - 1] == '\n') {
            user_input_buffer[--length] = '\0';
        }

        printf("user_input: %s\n", user_input_buffer);

        if (strcmp(user_input_buffer, "n") == 0) {
            goto meta(context, context->next);
        } else if (strcmp(user_input_buffer, "q") == 0) {
            printf("quit program\n");
            exit(0);
        } else if (strcmp(user_input_buffer, "pd") == 0){
            // TODO: create and call CodeGear for print DataGear
            printf("print DataGear\n");
            printf("DataGear Address: %p\n", context->data);
            printf("Phils\n");
            printf("putdown_lfork: %i\n", context->data[D_Phils]->Phils.putdown_lfork);
            printf("putdown_rfork: %i\n", context->data[D_Phils]->Phils.putdown_rfork);
            printf("thinking: %i\n", context->data[D_Phils]->Phils.thinking);
            printf("pickup_lfork: %i\n", context->data[D_Phils]->Phils.pickup_lfork);
            printf("pickup_rfork: %i\n", context->data[D_Phils]->Phils.pickup_rfork);
            printf("eating: %i\n", context->data[D_Phils]->Phils.eating);
            printf("next: %i\n", context->data[D_Phils]->Phils.next);
        } else {
            printf("invalid input\n");
            continue;
        }
    }
}
```

`n`を入力すると、次の処理を行う。
```
(Gears Debugger) n
user_input: n
ffffffff ffffffff ffffffff ffffffff 04000000 46000000 01000000 46000000 46000000 46000000  flag 0 0x7fcff4d043a0 -> 0x7fcff4d04610 hash b385a087 iter 5
DEBUG_OPTION: 1, goto debug
-----------------------

(Gears Debugger) n
user_input: n
4: eating
04000000 ffffffff ffffffff ffffffff 04000000 46000000 2a000000 46000000 46000000 46000000  flag 0 0x7fcff4d04610 -> 0x7fd10b405bd0 hash 2235d9fd iter 5
DEBUG_OPTION: 1, goto debug
-----------------------
```

`pd`を入力すると、DataGearの表示を行う。

なお現状はPhilsの型とかをハードコーディングしてるので、Philsの表示しかできないが、今後Impl名などを指定して出せるようにしたい。
```
(Gears Debugger) pd
user_input: pd
print DataGear
DataGear Address: 0x7fca0b400000
Phils
putdown_lfork: 0
putdown_rfork: 0
thinking: 0
pickup_lfork: 0
pickup_rfork: 0
eating: 0
next: 10
-----------------------
```

`q`を入力すると、プログラムを終了する。
```
(Gears Debugger) q
user_input: q
quit program
```

現状は`n`, `pd`, `q`の3種類のみを実装している。

中間報告提出まであと10日くらいなのでそれくらいで終わるのをやりたい。

## やること
- プロンプトで名前を指定してDataGearの表示
- CodeGearの表示
- ブレークポイントを設定できるようにする
- backtrace, forwardtraceの実装
- 変数の変更が誰によって行われたかがわかるようにする。

## その他