Mercurial > hg > Document > Growi
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の実装 - 変数の変更が誰によって行われたかがわかるようにする。 ## その他