Next: トレースの制御と情報入手
Up: トレーサ
Previous: リンク時のトレース指定
KLICでは一般的には実行コードにしてしまえば、その述語名、モジュール名は
もはや必要はない。しかしながら、KLICのトレーサでは、
それらの情報をユーザに提示するし、モジュール、述語を特定させる必要があるため、
名前情報を保持している必要がある。
KLICでは、トレース時のみリンクされるような
データベースを持つことにより管理を行っている。
- 名前管理のため、以下の表が生成される。
- 述語表:
- すべてのpte(pred_table_entry)の配列を保持する、
変数pred_table。
- 述語ハッシュ表:
- pteの配列を検索するための述語構造体、
pteへのポインタの表で、変数pred_hash。
- モジュール表:
- モジュール情報(mte: mod_table_entry)を持つ表、変数mod_table。
- モジュールエントリ表:
- モジュール情報へのポインタの表。
変数mod_index。
なお、構造体pred_table_entry、module_table_entry は以下に示す
構造を持つ。
struct pred_table_entry {
Const struct predicate *pred; /* 述語情報 */
Const struct mod_table_entry *mte; /* 所属するモジュールのmte */
Const unsigned char *name; /* 述語名 */
char spied; /* 述語としてスパイされているかどうか */
char default_trace; /* デフォルトのトレースフラグ */
};
struct mod_table_entry {
module (*func)(); /* そのモジュールを実現する関数へのポインタ */
Const unsigned char *name; /* モジュール名 */
};
- これら名前表は、make_name_tables() (runtime/trace.c)
により以下のように生成される。
- 1.
- 配列defined_modulesを嘗め、全モジュールの数を数える。
さらに、defined_modulesより述語表を嘗め、全述語数を数える。
このdefined_modulesは、KLICコンパイラにより生成されるデータであり、
predicates.cに定義されている。
- 2.
- 得られた述語数を用い、述語エントリを割り付け、
得られた述語数より少々大め(述語数の1.5倍を越える2羃程度)に
ハッシュエントリ表を割り付け、
hash_maskを決め、すべてのエントリを0で初期化する。
- 3.
- 全てのモジュール表を嘗め、さらに、それを経由して
全ての述語を嘗め、述語エントリ(pte)を初期化する。pteは以下の形式を持つ。
| エントリ名 |
説明 |
| Const struct predicate *pred |
述語構造体 |
| Const struct mod_table_entry *mte |
所属するモジュールのmte |
| Const unsigned char *name |
述語名 |
| char spied |
spy中かどうかのフラグ。初期的にはoffにする。 |
| char default_trace |
デフォルトのトレースフラグ。初期的にはonにする。 |
- 4.
- 調べたモジュール数より、モジュール表、
モジュールエントリ表を割り付ける。
- 5.
- 全てのモジュールを嘗め、モジュール表を初期化する。
出現順にモジュールエントリ表も初期化する。
- 6.
- モジュール表は名前順にソートし、モジュールエントリ表は
モジュール関数順にソートする。
- 7.
- モジュール表を検索しながら、述語表のmteを初期化する。
- 8.
- 述語表を述語名順にソートする。
- 9.
- 全述語を、述語構造体アドレスで検索できるようにハッシュテーブルに
登録する。
また、pte, mteを、pred構造体から
検索する関数として、get_pte(), get_mte()が
各々定義されている。
Sekita Daigo
1998-05-18