view paper/text/gearsdebugger.tex @ 13:ae09749b0890 default tip

fix summary and add figs for debugger
author Takato Matsuoka <t.matsuoka@cr.ie.u-ryukyu.ac.jp>
date Tue, 15 Feb 2022 00:08:04 +0900
parents 538bcf79ca64
children
line wrap: on
line source

\chapter{GearsDebugger}
本研究では、GearsOSに特化したデバッガとしてGearsDebuggerの開発を行った。本章ではGearsDebuggerの持つ機能や仕組みについて説明する。

\section{GearsDebuggerの持つ機能}
GearsDebuggerの持つ機能として以下が挙げられる。

\subsection{ユーザーインプット機能}
ユーザーインプット機能はユーザーが行いたいデバッグ処理を指定するための機能で、プロンプトにより対話形式でデバッグコマンドを入力することでデバッグが可能になった。
デバッグコマンドは後述するnextやpdコマンドなどが存在する。ソースコード\ref{src:prompt_result}にユーザーへ入力を促すプロンプトを示す。
ソースコード\ref{src:prompt_result}の7行目に(Gears Debugger)とあるが、これが実際にユーザーへ入力を促すプロンプトである。ここで各デバッグコマンドを入力することでデバッグを行う。

\lstinputlisting[label=src:prompt_result, caption=ユーザーへ入力を促すプロンプト]{src/prompt_result.txt}

\subsection{CodeGear単位でのデバッグ}
GearsOSはCodeGearとDataGearを単位として実行される。そのためデバッグ時においては1つのCodeGearを実行した後の情報を見ることで、そのCodeGearによってどのDataGearがどのように変化したのかを見ることができる。そのため1つのCodeGear実行後にdebugMetaを呼ぶことによりCodeGear単位でのデバッグを実現している。
また、次のCodeGearを実行したい場合はnextもしくはn コマンドを入力することで次のCodeGearへと遷移する。

\subsection{DataGearの表示}
CbCのデータ単位であり、GearsOSの基本単位であるDataGearの表示が可能となった。
表示する際にはprint DataGearを意味するpdコマンドを入力する。また複数存在するDataGearの指定に対応するため、オプションでDataGear名を指定することで特定のDataGearの表示が出来る。表示の際には全てのDataGearの参照ができるcontextを経由して参照を行う。実際にDPPMCで使用されるDataGearであるPhilsの表示結果をソースコード\ref{src:pd_example}に示す。
ソースコード\ref{src:pd_example}の1行目でプロンプトにpdコマンドを入力することでPhilsの持つDataGear Addressやnextなどのメンバの値が表示される。

\lstinputlisting[label=src:pd_example, caption=pdコマンドを用いたPhilsの表示結果]{src/pd_example.txt}

\section{DebugWorker} \label{DebugWorker}
Debug用のWorkerとしてDebugWorkerの作成を行った。通常のWorkerと異なる部分として、debugMetaの実装が挙げられる。ソースコード\ref{src:debugMeta}がdebugMetaの定義の一部である。ソースコード\ref{src:debugMeta}の1行目の\_\_ncodeは、ユーザーが定義できるMetaCodeGearである。通常のCodeGearの定義はソースコード\ref{src:hello}の1行目のように\_\_codeを用いて定義を行う。この\_\_codeを使った定義の場合はトランスパイラによる変換時にノーマルレベルのCodeGearだと判断され、メタ計算を行うStubCodeGearがトランスパイラによって生成される。しかし\_\_ncodeを使ったCodeGearの定義はトランスパイラによってMetaCodeGearと判断され、Stubの生成などがされない。

GearsOSはノーマルレベルとメタレベルの分離を実現するため、ノーマルレベルのCodeGearからMetaDataGearであるContextへの参照を行わない。GearsDebuggerにおいてはデバッグ情報をContextから取得するため、デバッグ処理を行うCodeGearはノーマルレベルのCodeGearではなくMetaCodeGearである必要がある。そのため\_\_ncodeを用いてデバッグ用MetaCodeGearであるdebugMetaを作成している。

\lstinputlisting[label=src:debugMeta, caption=\_\_ncodeを用いたdebugMetaの定義]{src/debugMeta.cbc}
\lstinputlisting[label=src:hello, caption=通常の\_\_codeを用いたCodeGearの定義]{src/hello.cbc}

\section{DebugTaskManager}
Debug用のTaskManagerとしてDebugTaskManagerの作成を行った。
通常は\ref{TaskManager}で触れたTaskManagerを用いるが、GearsDebuggerにおいてデバッグする場合はDebugTaskManagerを用いる。通常のTaskManagerとの違いとしてはまずWorker生成部が挙げられる。デバッグ時には通常用いられるWorkerではなく、DebugWorkerを用いる。このWorkerの生成はTaskManagerで行うため、DebugTaskManagerにおいてはWorker生成時にDebugWorkerを生成する。
ソースコード\ref{src:createWorkers}が通常のTaskManager内のWorker生成部、ソースコード\ref{src:createDebugWorkers}がDebugTaskManager内のWorker生成部である。これを見ると、ソースコード\ref{src:createWorkers}の6, 11行目の通常のWorker生成を行う関数であるcreateCPUWorkerが、ソースコード\ref{src:createDebugWorkers}の6, 11行目のようにcreateDebugWorkerに変わっていることがわかる。

\lstinputlisting[label=src:createWorkers, caption=TaskManagerにおけるWorker生成]{src/createWorkers.cbc}

\lstinputlisting[label=src:createDebugWorkers, caption=DebugTaskManagerにおけるWorker生成]{src/createDebugWorkers.cbc}

2つ目の違いとしては、DebugTaskManagerはメモリ状態を保存するためのDBであるstateDBの情報を持つ。

\section{debugMeta} \label{debugMeta}
\ref{DebugWorker}でDebugWorker内にdebugMetaを作成したが、そのdebugMetaの行う処理について記述していく。
debugMetaはデバッグ処理におけるユーザーインプット部分を担うMetaCodeGearである。GearsDebuggerは1つのCodeGearの実行後にDataGearの表示などデバッグ情報を見たい。そのため、各CodeGearの呼び出し後にdebugMetaを呼び出すことでユーザーに入力を促す。これによって各CodeGear実行後にデバッグを行うことができる。

\newpage

\section{meta.pm}
\ref{debugMeta}にて各CodeGearの呼び出し後にdebugMetaを呼び出すと説明したが、その呼び出し方法としてmeta.pm\cite{meta.pm}というGearsOSのビルドシステムのAPIを用いている。通常はCodeGear実行後、次のCodeGearのStubCodeGearへと遷移するが、meta.pmを使うことでCodeGear実行後の遷移先を特定のMetaCodeGearへと変更することができる。図\ref{figs:insertDebugger}を見るとCodeGear1の呼び出し後にdebugMetaを呼び出していることがわかる。ソースコード\ref{src:meta.pm}にmeta.pmを示す。ソースコード\ref{src:meta.pm}の7行目にqr/HelloImpl/と正規表現がある。トランスパイラはこの正規表現にマッチしたCodeGearのgoto先を切り替えている。例でいうと、HelloImplという文字列を含むCodeGearがあった場合、ソースコード\ref{src:meta.pm} 13行目のサブルーチンgeneratedebugMetaを呼び出し、goto先をdebugMetaへと切り替えている。

\begin{figure}[htbp]
  \begin{center}
   \includegraphics[width=12cm]{./figs/debugMeta.png}
   \caption{debugMetaの呼び出し}
   \label{figs:insertDebugger}
   \end{center}
\end{figure}

\lstinputlisting[label=src:meta.pm, caption=meta.pm]{src/meta.pm}