TrickLibrary
  1. http://tricklib.com/
  2. cxx/
  3. ex/
  4. bugbeard/

バグベアード -bugbeard-

about バグベアード -bugbeard-

バグベアード -bugbeard-

簡潔かつ乱暴に説明すると、このモジュールは printf デバッギングを簡単且つゴージャスに行う為のものです。

バグベアードはC++プログラマの目となり、その膨大なログで大半のバグを丸裸にします。

Wraith the Trickster

2008-02-24 "Coming soon..." などと謳いつつ5年近くほったらかしにしてましたが、ついに正式版のリリースです。 作者が言うのなんですが、このモジュールは非常に強力且つ凶悪です。ご利用いただければあなたの C++ プログラミングにおけるデバッグシーンに劇的な変化をもたらすであろうことお約束します。

2008-02-25 inline指定が抜けてて複数のコンパイル単位から利用するとリンク時にシンボルが衝突する問題を修正。

2008-03-10 以下の点を修正。

2008-04-01 以下の点を修正。

2008-06-05 以下の点を修正。

2008-09-23 以下の点を修正。

2008-11-01 以下の点を修正。

2010-02-14 以下の点を修正。

2011-03-21 ステートメントハックを一度有効化した後、無効化できなくなっていた問題を修正

contents

why バグベアード?

なぜ、ビ○ルダーでもゲイザーでもスズキドゲザエモンでもアスコモイドでもスカイラインでもなくバグベアードなのか? それはもちろん "不具合" という意味と "盗聴器" という意味を持つ "bug" をその名に含むからです。 って、そーじゃなくて、なぜ、デバッガじゃなく良識あるプログラマには一般的に悪しき事とされる printf デバッギング用ロガーであるバグベアードなのか? ということについて少々説明しておきます。

最初に断っておきますが、「バグベアードがあればデバッガは不要」などと言うつもりもありませんし、情報収集のアスペクトが直交する(※)関係になるのでむしろデバッギングツールとしては相補する関係になると考えます。

Wraith the Trickster

※ある瞬間のシステム全体の情報...いわば空間に対して強いデバッガと、時間に対して強いバグベアードはその情報収集のアスペクトが直交します。

デバッガにはデバッギングの為のツールとしてはあまり頂けない次のような問題があります。

見ようとしたものしか見えない。
デバッガによるデバッグでは一般的にプログラマ自身が見ようとした情報しか得られません。プログラマが見ようとした情報の直近であからさまにおかしい挙動があってもプログラマにはそれが伝わらないのです。これでは目隠しされて手探りしているようなものです。 多くの場合、デバッガを利用してのデバッグではバグの原因を突き止めるに足る決定的なポイントを捕らえる必要があるにも関わらず、そのポイントを捕らえる為の情報はこのような手探りで積み重ねていかねばなりません。
処理の流れを把握しづらい。
デバッガにはステップ実行や逆実行などの機能もありますが、それでもデバッガでは常にある特定の瞬間のデータしか扱えず、これではなかなか処理の流れを把握できません。 この為、ステップ実行をやってる最中に明らかにおかしい分岐に入ってもそれがその時に注意を傾けているポイントでなければうっかり見過ごしてしまうのも無理のないことです。 また、処理の流れが可視化されていない為、デバッガでは正常な場合の処理の流れと異常な場合の処理の流れの比較に困難がつきまといます。
エンドユーザ環境では無力。
特定のエンドユーザ環境でしか再現しないバグというのは普通によくある話であるにも関わらずデバッガはこの種の再現条件を抱えるバグに対して全く無力です。

他のも問題はあるでしょうがこれらの問題に対しバグベアードでは次のようになります。

見ようとしたもの以外の情報も見える。
裏を返せば見たくもないものを見せられたり肝心な情報がその他の情報に埋もれてしまうリスクもあるわけですが、バグベアードでは意識して見ようとした以外の情報も見える為、バグの痕跡を発見しやすくなります。
処理の流れを把握しやすい。
特にツリー形式のログでは処理の流れを把握しやすく、テキストデータの形になっているので正常の場合の処理の流れと異常な場合の処理の流れの比較も容易です。
エンドユーザ環境でも利用可能。
エンドユーザにログ上のソースコード断片を見られてしまったり、膨大なログをどうやってエンドユーザに送り返してもらうのかで困ったりすることはあるかもしれませんが、エンドユーザ環境であってもバグベアードは利用できます。

またバグベアードを利用すればソースコード修正後の動作確認もステップ実行の代わりにただ実行してログを確認するだけで済ませるというお手軽なスタイルを採用することもできます。

バグベアード固有の問題についても以下に挙げておきます。

ログがでかすぎ。
『とにかくログでかすぎ。時間あたりのログ出力量が動画ファイルを余裕で上回るとかね、もう馬鹿?って感じ。』 『エンドユーザ環境でも利用可能?こんなでかいログどうやってユーザから送ってもらうのよ?』 ...とでも言いたくなるようなログ出力量になり、バグベアードを利用してのデバッグはバグの原因を特定する為に必要なほんの数行を見つけ出す為に数十万行のログを追いかけるようなものとなります。 そのログのサイズは時には数百万行あるいは数千万行以上の非常に膨大なサイズに達することでしょう。 バグベアードは昨今のPCの強力なパワーがあって初めて実用的なデバッグの手段となり得ます。
ソースコード漏洩
断片的ではあるのですが相当量のソースコードがログに含まれます。 エンドユーザ環境などでテストしてもらった際にソースコードが漏洩するリスクを考慮する必要があります。
バグベアードをロードしていると実行形式ファイルが馬鹿でかくなる。
ログの膨大さに比べれば全然カワイイものですが、バグベアードをロードしていると実行形式ファイルが馬鹿でかくなります。 大きすぎてメールの添付ファイルで送れなくて困るといったこともあるかもしれません。

Wraith the Trickster

バグベアードにより出力されたログを追跡してデバッグする際は高速な検索ができるビューア(テキストエディタ)を使用することを強く推奨します。 バグベアードが出力するログは非常に膨大になりますので検索性能の差が残酷なまでに現れます。 例えば、約200MBのログの末尾に現れる文字列を Notepad++ で検索したところ約 3 分 30 秒もかかってしまいましたが、同じ環境下でサクラエディタで検索すれば 2 秒もかかりませんでした。その性能差は実に100倍以上にすら及びます。

ログ出力サンプル

┌──────────────────────────────────────
│日付&時刻:2008-02-24(日) 23:26:11.874
└─────┬────────────────────────────────
23:26:11.874├┬▽if (1 < current) == true; <tree.cpp>#104
23:26:11.874│├・while (1 < current) == true; <tree.cpp>#109
23:26:11.874│├┬▽if (current %p) == true; <tree.cpp>#111
23:26:11.874││├┬▽if (pn) == false; <tree.cpp>#113
23:26:11.874│││└△if (pn) == false; <tree.cpp>#113
23:26:11.874││├・p(0x00D8FC5C) = 3(0x00000003) <tree.cpp>#126
23:26:11.874││└△if (current %p) == true; <tree.cpp>#111
23:26:11.874│├・while (1 < current) == true; <tree.cpp>#109
23:26:11.874│├┬▽if (current %p) == true; <tree.cpp>#111
23:26:11.874││├┬▽if (pn) == false; <tree.cpp>#113
23:26:11.874│││└△if (pn) == false; <tree.cpp>#113
23:26:11.874││├・p(0x00D8FC5C) = 5(0x00000005) <tree.cpp>#126
23:26:11.874││└△if (current %p) == true; <tree.cpp>#111
23:26:11.874│├・while (1 < current) == true; <tree.cpp>#109
23:26:11.874│├┬▽if (current %p) == true; <tree.cpp>#111
23:26:11.874││├┬▽if (pn) == false; <tree.cpp>#113
23:26:11.874│││└△if (pn) == false; <tree.cpp>#113

使用方法

いくつかのマクロを適宜定義し、bug.h をしかるべき場所で include しコンパイルするだけです。詳細についてはこのページの情報に一通り目を通してください。

"悪魔の契約" -EVIL CONTRACT-

邪道な技術により構築されたバグベアードは邪悪で忌むべき存在です。 またバグベアードの肝であるステートメントハックにより、さながらナノマシンの如くバグベアードのコードはユーザプログラムを隅々まで侵食します。 故にバグベアードの利用にあたっては以下のような注意が必要となります。

規格違反
バグベアードは「ステートメントのマクロでの置換」という最上級の規格違反を犯しています。 これによりバグベアードを利用したプログラムはあらゆる C++ コンパイラでの動作保証は得られなくなります。 ただし、これはバグベアードの「ステートメントハック」が有効になっている場合の話であり、バグベアードがロードされていない状態を含め「ステートメントハック」が無効になっている場合はその限りではありません。 そして通常、リリース版のプログラムではバグベアードをロードしないことをオススメします。
エラー情報の侵食
ユーザプログラムを隅々まで侵食するバグベアードのログ出力コードの影響により、エラー情報(Win32API の GetLastError()で得られるエラーコードやグローバル変数に保持されるC/C++標準ライブラリのエラーコード)が上書きされてしまう可能性があります。 前項と同様にこれはバグベアードをロードしている状態でのみ発生しうる問題であり、バグベアードをロードしていない状態であればこの問題は発生しません。
構文の制限
バグベアードのステートメントハックの実装の都合より...
if (int i = func) ...
switch(int i = func) ...
while(int i = func) ...
...のような形でステートメントに属する丸カッコで囲まれた箇所で変数を定義することができません。また...
void func(...) throw(...);
...のような例外仕様構文が一切使えません。 ただし、for ステートメントに関してはこの例外となり for(int i = 0;... などとしても問題ありません。 また、そもそもステートメントハックを適用しない箇所ではこの制限はありません。
動作不安定
バグベアードはオブジェクトの破棄のタイミングや operator や template 等がコンパイラによって意図通りに適用されるかどうかに強く依存する為、こちらで動作確認を行っていないコンパイラではあまり意図通りに機能することを期待できませんし、動作確認を行っているコンパイラでもバージョンによっては意図通りに機能しないかもしれません。
出力ログの変形
前項と同じく、バグベアードはオブジェクトの破棄のタイミングや operator や template 等がコンパイラによって意図通りに適用されるかどうかに強く依存する為、必ずしもは理想的な形でログを出力できない為に同じソースからコンパイルされたプログラムの出力ログがコンパイラ及びそのバージョンの違いにより変形してしまうことがあります。 具体的には return ステートメントのログ出力は return fucn(); のような場合、func() 関数の呼び出しが終了した段階で return ステートメントのログを出力するのが理想的ですが、そのような形で実装できない処理系では func(); 関数の呼び出しの前に return ステートメントのログ出力が行われます。 また別の例では switch ステートメントに対してはスコープ扱いでログを出力するのが理想的ですが、そのように実装できない処理系では switch ステートメントがスコープ扱いされません。
過剰な警告(ある意味、真っ当な警告)
バグベアードをロードしてコンパイルを行うとバグベアードを利用していなければ表示されることはないような警告が過剰に表示されることがあります。 これは通常、無視して構いません。 ただし、バグベアードをロードしていない時に表示される警告は通常通りに対処してください。
順序不安定
シングルプロセス×シングルスレッドでバグベアードを利用する場合は関係ない話ですが、マルチプロセスもしくはマルチスレッドでバグベアードを利用する場合、複数のプロセス/スレッドの各種処理のログは必ずしもそれらの処理が実行された順番とそのログ出力結果の順番が一致しないことがあります。 これはログに記録が残る処理が実行されてから実際にそのログ出力が行われるまでに一定時間ではないタイムラグがある為です。 もちろんこれは異なるプロセス・スレッド間での話であり、同一プロセス・スレッド上の処理が実行された順番とそのログ出力結果の順番は必ず一致します。
これらを踏まえてなお、悪魔の契約を締結するならばその意思表明として BUG_EVIL_CONTRACT マクロを定義してください。BUG_EVIL_CONTRACT はユーザプログラム全体に非常に強力な影響を及ぼすバグベアードのセーフティを解除する為のマクロです。 契約締結の暁にはバグベアードはさまざまな恩恵と災いをあなたにもたらすでしょう。

バグベアードをご利用に当たってのヒント

バグがあった場所のログ出力の為の埋め込みは消さない。
一度、なんらかのバグ追跡の為に埋め込んだログ出力用コードは基本的には全てソースコード上に残しておくことをオススメします。 実際にバグがあった箇所の埋め込みについては特に強くオススメします。 というのもバグというのは一度直したつもりでも修正が十分でなく完全に直ってなかったり、別のバグを埋め込んでしまったりというのもよくある話です。 また、バグというのは特定箇所に集中する傾向もあります。 この為、その時目的としていたバグの直しが完了した後も、バグ追跡の為に埋め込んだログ出力用コードは全てソースコード上に残しておくことをオススメします。 ログ出力量が過剰になってしまう場合は条件ディレクティブを使って必要な時以外は無効にしておくのがよいでしょう。
三項演算子のかわりに if を使用する。
通常であればむしろ三項演算子が適用できる場面であれば if の使用を控えるといったことが推奨されるかもしれませんが、あえて if を使用することで、バグベアード(のステートメントハック)で条件の判定結果を簡単にログに残せます。
明記が不要な場合でも return を記述する。
戻り型が void の関数やコンストラクタ、デストラクタでも return を記述しておくとその分ログ出力が増え、バグ追跡に役立ちます。
フィルタ機能を利用する。
マルチプロセス及びマルチスレッドによるログ出力を同じファイル等に対して行うと、特に tree 形式でのログ出力は追跡中のログが他のプロセス及び他のスレッドによる出力とごちゃ混ぜになって追跡し辛くなることがありますが、その場合は適宜そのログの表示に使ってるエディタもしくはビューアが有するフィルタ機能を使い、プロセスIDやスレッドIDで表示を絞り込むとよいでしょう。
デバッグ以外での利用。
バグベアードには環境および処理系にあまり依存せずに使えるスマートポインタ、スレッドローカルストレージ、ミューテックス等々さまざま機能を内包していますのでちょっとしたプログラムでそれらの機能を利用するのもよいでしょう。
Excel を *.tsv ログのビューアとして使用する場合は Excel2007 以降で。
Excel2003 以前では 65,536 行までしか扱えない為、極小規模なプログラムのログならどうにかなるかもしれませんが、かなり厳しいです。 Excel2007 以降であれば、1,048,576行まで扱えます。 ...それでもプログラムによっては全然足りないでしょうが。

サンプルコード

"Hello, Bugbeard!"

サンプルコード

/******************************************************************************
    バグベアード -bugbeard-
        サンプル "simple.cpp" ソースファイル
                                            Coded by Wraith in Feb 18, 2007.
******************************************************************************/



///////////////////////////////////////////////////////////////////////////////
//
//  includes
//

#include <stdio.h>
#include <stdlib.h>


///////////////////////////////////////////////////////////////////////////////
//
//  [BUG]bugbeard
//

#if defined(NDEBUG)
#define BUG_DISABLE_BUGBEARD    
//  リリース版ではバグベアードをロードしない
#endif

#define BUG_EVIL_CONTRACT       //  "悪魔の契約"
#include "bug.h"                //  ロガーを定義する為にステートメントハックを有効にしない状態で include

//  標準エラーにツリー形式の出力を行うロガーの定義
BUG_define_logger(new bugbeard::bug_tree_logger(new bugbeard::bug_file_writer_base(stderr)));

#define BUG_STATEMENT_HACK      //  ステートメントハックの設定
#include "bug.h"                //  ステートメントハックを有効にする為、再度 include


///////////////////////////////////////////////////////////////////////////////
//
//  user codes
//

int main(int argc, char *args[])
{
    
argc, args;                 //  警告除け

    
//  [BUG]固定メッセージをログ出力
    BUG_puts("Hello, Bugbeard!");
    
    
//  [BUG]コンパイル情報のログ出力
    BUG_exec(bugbeard::bug_compile_info(BUG_LOG));

    
//  [BUG]コマンドライン引数のログ出力
    BUG_exec(bugbeard::bug_arg_info(BUG_LOG, argc, args));
    
    
//  [BUG]変数をログ出力
    BUG_puts(BUG_VAL(args[0]));
    
    
//  [BUG]書式付ログ出力
    BUG_puts(BUG_FORM("このプログラムのファイル名:\"%s\"", args[0]));
    
    
return EXIT_SUCCESS;
}


/******************************************************************************
    □■□■                  Wraith the Trickster                  □■□■
    ■□■□ 〜I'll go with heaven's advantage and fool's wisdom.〜 ■□■□
******************************************************************************/

出力結果(標準エラー)

┌──────────────────────────────────────
│日付&時刻:2008-02-24(日) 18:06:13.739
└─────┬────────────────────────────────
18:06:13.743├・Hello, Bugbeard! <sample/simple.cpp>#46
18:06:13.744├┬▽Compile Information <bug.h>#2839
18:06:13.745│├・Compiler:Borland C++(0x0564) <bug.h>#2841
18:06:13.745│├・Compile Date:Feb 24 2008 / Compile Time:18:06:11 <bug.h>#2843
18:06:13.746│└△Compile Information <bug.h>#2839
18:06:13.747├┬▽Commandline Argument Information <bug.h>#2849
18:06:13.748│├・argc(0x0012F994) = 1(0x00000001) <bug.h>#2850
18:06:13.749│├・args[0]:o:\cxx\bugbeard\simple.exe <bug.h>#2853
18:06:13.750│└△Commandline Argument Information <bug.h>#2849
18:06:13.751├・args[0](0x00DE21C4) = "o:\cxx\bugbeard\simple.exe" <sample/simple.cpp>#55
18:06:13.752├・このプログラムのファイル名:"o:\cxx\bugbeard\simple.exe" <sample/simple.cpp>#58
18:06:13.753├・return <sample/simple.cpp>#60
┌─────┴────────────────────────────────
│日付&時刻:2008-02-24(日) 18:06:13.754
└──────────────────────────────────────

解説

このサンプルでの一番の肝は...
///////////////////////////////////////////////////////////////////////////////
//
//  [BUG]bugbeard
//

#if defined(NDEBUG)
#define BUG_DISABLE_BUGBEARD    
//  リリース版ではバグベアードをロードしない
#endif

#define BUG_EVIL_CONTRACT       //  "悪魔の契約"
#include "bug.h"                //  ロガーを定義する為にステートメントハックを有効にしない状態で include

//  標準エラーにツリー形式の出力を行うロガーの定義
BUG_define_logger(new bugbeard::bug_tree_logger(new bugbeard::bug_file_writer_base(stderr)));

#define BUG_STATEMENT_HACK      //  ステートメントハックの設定
#include "bug.h"                //  ステートメントハックを有効にする為、再度 include
...この部分ですが、まぁ、最初は所謂 "おまじない" の類だとでも思ってください。

BUG_define_logger() の行によりログの出力形式等を指定しています。

NDEBUG マクロが定義された場合の assert() マクロと同様に、BUG_DISABLE_BUGBEARD マクロが定義されると BUG_* な命名になっているコードは全て消え去ります。

なお、Windowsではデフォルトで標準エラーがアスキーモードになっている為、改行コード "\r\n" が無駄に拡張され "\r\r\n" になってしまうので標準エラーをファイルへリダイレクトすると不格好になります。Windowsでは bugbeard::bug_file_writer で直接ファイルに出力するか、bugbeard::bug_OutputDebugString_writer で OutputDebugString() で出力することを推奨します。

Windows用情報収集サンプル

サンプルコード

/******************************************************************************
    バグベアード -bugbeard-
        サンプル "win.cpp" ソースファイル
                                            Coded by Wraith in Feb 18, 2007.
******************************************************************************/



///////////////////////////////////////////////////////////////////////////////
//
//  includes
//

#include <stdio.h>
#include <stdlib.h>


///////////////////////////////////////////////////////////////////////////////
//
//  [BUG]bugbeard
//

#if defined(NDEBUG)
#define BUG_DISABLE_BUGBEARD    
//  リリース版ではバグベアードをロードしない
#endif

#define BUG_EVIL_CONTRACT       //  "悪魔の契約"
#include "bug.h"                //  ロガーを定義する為にステートメントハックを有効にしない状態で include

//  OutputDebugString() でツリー形式の出力を行うロガーの定義
BUG_define_logger(new bugbeard::bug_tree_logger(new bugbeard::bug_OutputDebugString_writer()));

#define BUG_STATEMENT_HACK      //  ステートメントハックの設定
#include "bug.h"                //  ステートメントハックを有効にする為、再度 include


///////////////////////////////////////////////////////////////////////////////
//
//  user codes
//

int main(int argc, char *args[])
{
    
argc, args;                 //  警告除け

    
puts("このサンプルでは Win32API の OutputDebugString() でログを出力しています。");
    
puts("ご利用のIDEのデバッグ出力表示機能や sysinternals の DebugView などで出力内容を確認できます。");
    
    
//  [BUG]コンパイル情報のログ出力
    BUG_exec(bugbeard::bug_compile_info(BUG_LOG));

    
//  [BUG]コマンドライン引数のログ出力
    BUG_exec(bugbeard::bug_arg_info(BUG_LOG, argc, args));
    
    
//  [BUG]Windowsバージョン情報のログ出力
    BUG_exec(bugbeard::bug_windows_version_info(BUG_LOG));
    
    
//  [BUG]Windowsシステム情報のログ出力
    BUG_exec(bugbeard::bug_windows_system_info(BUG_LOG));
    
#if 0x0500 <= WINVER
    //  各種モジュールバージョン情報のログ出力
    BUG_exec(bugbeard::bug_enum_module_version_info(BUG_LOG));
#endif
    
#if 0x0500 <= WINVER
    //  各種モジュールハッシュ値のログ出力
    BUG_exec(bugbeard::bug_enum_module_hash(BUG_LOG));
#endif
    
#if 0x0500 <= WINVER
    //  [BUG]メモリ情報のログ出力
    BUG_exec(bugbeard::bug_memory_info(BUG_LOG));
#endif

    
//  [BUG]ドライブ情報のログ出力
    BUG_exec(bugbeard::bug_enum_drive_info(BUG_LOG));

#if 0x0500 <= WINVER
    //  [BUG]モニター情報のログ出力
    BUG_exec(bugbeard::bug_enum_monitor_info(BUG_LOG));
    
//  [BUG]ディスプレイ情報のログ出力
    BUG_exec(bugbeard::bug_enum_display_info(BUG_LOG));
#endif

    
//  [BUG](全ての)環境変数情報のログ出力
    BUG_exec(bugbeard::bug_enum_env(BUG_LOG));
    
    
return EXIT_SUCCESS;
}


/******************************************************************************
    □■□■                  Wraith the Trickster                  □■□■
    ■□■□ 〜I'll go with heaven's advantage and fool's wisdom.〜 ■□■□
******************************************************************************/

出力結果(標準出力)

このサンプルでは Win32API の OutputDebugString() でログを出力しています。
ご利用のIDEのデバッグ出力表示機能や sysinternals の DebugView などで出力内容を確認できます。

出力結果(OutputDebugString())

Wraith the Trickster
※意図的に一部編集してます。
┌────────────────────────────────────── 
│日付&時刻:2008-09-23(火) 22:06:59.771 
└─────┬──────────────────────────────── 
22:06:59.772├┬▽Compile Information #4450 
22:06:59.772│├・Compiler:Borland C++(0x0564) #4452 
22:06:59.772│├・Compile Date:Sep 23 2008 / Compile Time:22:06:25 #4454 
22:06:59.772│└△Compile Information #4450 
22:06:59.772├┬▽Commandline Argument Information #4461 
22:06:59.772│├・argc(0x0012D500) = 1(0x00000001) #4462 
22:06:59.772│├・args[0]:O:\cxx\bugbeard\work\win.exe #4465 
22:06:59.772│└△Commandline Argument Information #4461 
22:06:59.773├┬▽Windows Version Information #4505 
22:06:59.773│├・Microsoft Windows Vista Business Edition, 32-bit #4508 
22:06:59.773│├・OSVERSIONINFO dwMajorVersion:6 / dwMinorVersion:0 / dwBuildNumber:6001 / dwPlatformId:2 / szCSDVersion:Service Pack 1 #4510 
22:06:59.773│├・OSVERSIONINFOEX wServicePackMajor:1 / wServicePackMinor:0 / wSuiteMask:256 / wProductType:1 / wReserved:30 #4514 
22:06:59.773│└△Windows Version Information #4505 
22:06:59.773├┬▽Windows System Information #4474 
22:06:59.773│├・wProcessorArchitecture:0 #4488 
22:06:59.773│├・wReserved:0 #4489 
22:06:59.773│├・dwPageSize:4096 #4490 
22:06:59.773│├・lpMinimumApplicationAddress:00010000 #4491 
22:06:59.773│├・lpMaximumApplicationAddress:7FFEFFFF #4492 
22:06:59.773│├・dwActiveProcessorMask:3 #4493 
22:06:59.773│├・dwNumberOfProcessors:2 #4494 
22:06:59.773│├・dwProcessorType:586 #4495 
22:06:59.773│├・dwAllocationGranularity:65536 #4496 
22:06:59.773│├・wProcessorLevel:6 #4497 
22:06:59.773│├・wProcessorRevision:3846 #4498 
22:06:59.773│└△Windows System Information #4474 
22:06:59.773├┬▽Module Version Information #4591 
22:06:59.773│├・module:"O:\cxx\bugbeard\work\win.exe" / no version information #4584 
22:06:59.773│├・module:"C:\Windows\system32\ntdll.dll" / language:041104b0 / FileDescription: NT レイヤ DLL / FileVersion: 6.0.6001.18000 (longhorn_rtm.080118-1840) / ProductName: MicrosoftR WindowsR Operating System / ProductVersion: 6.0.6001.18000 / CompanyName: Microsoft Corporation / OriginalFilename: ntdll.dll.mui #4577 
22:06:59.774│├・module:"C:\Windows\system32\kernel32.dll" / language:041104b0 / FileDescription: Windows NT ベース API クライアント DLL / FileVersion: 6.0.6001.18000 (longhorn_rtm.080118-1840) / ProductName: MicrosoftR WindowsR Operating System / ProductVersion: 6.0.6001.18000 / CompanyName: Microsoft Corporation / OriginalFilename: kernel32 #4577 
22:06:59.774│├・module:"C:\Windows\system32\ADVAPI32.DLL" / language:041104b0 / FileDescription: Advanced Windows 32 ベース API / FileVersion: 6.0.6001.18000 (longhorn_rtm.080118-1840) / ProductName: MicrosoftR WindowsR Operating System / ProductVersion: 6.0.6001.18000 / CompanyName: Microsoft Corporation / OriginalFilename: advapi32.dll.mui #4577 
22:06:59.774│├・module:"C:\Windows\system32\RPCRT4.dll" / language:041104b0 / FileDescription: リモート プロシージャ コール ランタイム / FileVersion: 6.0.6001.18000 (longhorn_rtm.080118-1840) / ProductName: MicrosoftR WindowsR Operating System / ProductVersion: 6.0.6001.18000 / CompanyName: Microsoft Corporation / OriginalFilename: rpcrt4.dll.mui #4577 
22:06:59.774│├・module:"C:\Windows\system32\VERSION.DLL" / language:040904b0 / FileDescription: Version Checking and File Installation Libraries / FileVersion: 6.0.6001.18000 (longhorn_rtm.080118-1840) / ProductName: MicrosoftR WindowsR Operating System / ProductVersion: 6.0.6001.18000 / CompanyName: Microsoft Corporation / OriginalFilename: VERSION.DLL #4577 
22:06:59.774│├・module:"C:\Windows\system32\msvcrt.dll" / language:040904b0 / FileDescription: Windows NT CRT DLL / FileVersion: 7.0.6001.18000 (longhorn_rtm.080118-1840) / ProductName: MicrosoftR WindowsR Operating System / ProductVersion: 7.0.6001.18000 / CompanyName: Microsoft Corporation / OriginalFilename: msvcrt.dll #4577 
22:06:59.775│├・module:"C:\Windows\system32\USER32.DLL" / language:041104b0 / FileDescription: マルチユーザー Windows ユーザー API クライアント DLL / FileVersion: 6.0.6001.18000 (longhorn_rtm.080118-1840) / ProductName: MicrosoftR WindowsR Operating System / ProductVersion: 6.0.6001.18000 / CompanyName: Microsoft Corporation / OriginalFilename: user32 #4577 
22:06:59.775│├・module:"C:\Windows\system32\GDI32.dll" / language:040904b0 / FileDescription: GDI Client DLL / FileVersion: 6.0.6001.18023 (vistasp1_gdr.080221-1537) / ProductName: MicrosoftR WindowsR Operating System / ProductVersion: 6.0.6001.18023 / CompanyName: Microsoft Corporation / OriginalFilename: gdi32 #4577 
22:06:59.775│├・module:"C:\Windows\system32\PSAPI.DLL" / language:040904b0 / FileDescription: Process Status Helper / FileVersion: 6.0.6000.16386 (vista_rtm.061101-2205) / ProductName: MicrosoftR WindowsR Operating System / ProductVersion: 6.0.6000.16386 / CompanyName: Microsoft Corporation / OriginalFilename: PSAPI #4577 
22:06:59.775│├・module:"C:\Windows\system32\IMM32.DLL" / language:040904b0 / FileDescription: Multi-User Windows IMM32 API Client DLL / FileVersion: 6.0.6001.18000 (longhorn_rtm.080118-1840) / ProductName: MicrosoftR WindowsR Operating System / ProductVersion: 6.0.6001.18000 / CompanyName: Microsoft Corporation / OriginalFilename: imm32 #4577 
22:06:59.775│├・module:"C:\Windows\system32\MSCTF.dll" / language:041104b0 / FileDescription: MSCTF サーバー DLL / FileVersion: 6.0.6000.16386 (vista_rtm.061101-2205) / ProductName: MicrosoftR WindowsR Operating System / ProductVersion: 6.0.6000.16386 / CompanyName: Microsoft Corporation / OriginalFilename: MSCTF.DLL.MUI #4577 
22:06:59.776│├・module:"C:\Windows\system32\LPK.DLL" / language:040904b0 / FileDescription: Language Pack / FileVersion: 6.0.6001.18000 (longhorn_rtm.080118-1840) / ProductName: MicrosoftR WindowsR Operating System / ProductVersion: 6.0.6001.18000 / CompanyName: Microsoft Corporation / OriginalFilename: LanguagePack #4577 
22:06:59.776│├・module:"C:\Windows\system32\USP10.dll" / language:040904b0 / FileDescription: Uniscribe Unicode script processor / FileVersion: 1.0626.6001.18000 (longhorn_rtm.080118-1840) / ProductName: Microsoft(R) Uniscribe Unicode script processor / ProductVersion: 1.0626.6001.18000 / CompanyName: Microsoft Corporation / OriginalFilename: Uniscribe #4577 
22:06:59.776│└△Module Version Information #4591 
22:06:59.776├┬▽Module Hash #4605 
22:06:59.789│├・file:"O:\cxx\bugbeard\work\win.exe" / hash(MD5):DA0A29DA42E371316446BFE64A528921 #4528 
22:06:59.792│├・file:"C:\Windows\system32\ntdll.dll" / hash(MD5):172E1B9EB61167AD232291A6761501BF #4528 
22:06:59.796│├・file:"C:\Windows\system32\kernel32.dll" / hash(MD5):DC2338093F91BA4E0512208E60206DDD #4528 
22:06:59.799│├・file:"C:\Windows\system32\ADVAPI32.DLL" / hash(MD5):C44A1766E93E506EE2102A305799E1A1 #4528 
22:06:59.802│├・file:"C:\Windows\system32\RPCRT4.dll" / hash(MD5):520CE99A9C1A3B14078BB39272424652 #4528 
22:06:59.802│├・file:"C:\Windows\system32\VERSION.DLL" / hash(MD5):187D588F7A1A45DE48B8540401A90850 #4528 
22:06:59.805│├・file:"C:\Windows\system32\msvcrt.dll" / hash(MD5):04CBEAA089B6A752B3EB660BEE8C4964 #4528 
22:06:59.808│├・file:"C:\Windows\system32\USER32.DLL" / hash(MD5):B974D9F06DC7D1908E825DC201681269 #4528 
22:06:59.809│├・file:"C:\Windows\system32\GDI32.dll" / hash(MD5):F77456EB036D834BFBC700EB2414879E #4528 
22:06:59.810│├・file:"C:\Windows\system32\PSAPI.DLL" / hash(MD5):93A1732F7F997E36A5C3893539E2FF02 #4528 
22:06:59.811│├・file:"C:\Windows\system32\IMM32.DLL" / hash(MD5):EC17194A193CD8E90D27CFB93DFA9A2E #4528 
22:06:59.814│├・file:"C:\Windows\system32\MSCTF.dll" / hash(MD5):030981927E732FD4013910B3B06BD45B #4528 
22:06:59.815│├・file:"C:\Windows\system32\LPK.DLL" / hash(MD5):DD496299B7351E16E602FC4299345A33 #4528 
22:06:59.817│├・file:"C:\Windows\system32\USP10.dll" / hash(MD5):3122DAF86B33ED8AC4662D07593025D7 #4528 
22:06:59.817│└△Module Hash #4605 
22:06:59.817├┬▽Memory Information #4623 
22:06:59.817│├・load:61% #4628 
22:06:59.817│├・TotalPhys:2.98GiByte(3201634304) #4629 
22:06:59.817│├・AvailPhys:1.14GiByte(1222332416) #4630 
22:06:59.817│├・Used-Phys:1.84GiByte(1979301888) #4631 
22:06:59.817│├・TotalPageFile:6.16GiByte(6611963904) #4632 
22:06:59.817│├・AvailPageFile:1.14GiByte(1222332416) #4633 
22:06:59.817│├・Used-PageFile:5.02GiByte(5389631488) #4634 
22:06:59.817│├・TotalVirtual:2.00GiByte(2147352576) #4635 
22:06:59.817│├・AvailVirtual:1.14GiByte(1222332416) #4636 
22:06:59.817│├・Used-Virtual:882MiByte(925020160) #4637 
22:06:59.817│├・AvailExtendedVirtual:0Byte(0) #4638 
22:06:59.817│└△Memory Information #4623 
22:06:59.817├┬▽Drives Information #4752 
22:06:59.817│├・drive:C / type:fixed / label:***** / file-system:NTFS / serial:0x******** / max-path:255 / flags:0x002700FF / sectors-per-cluster:8 / bytes-per-sector:512Byte / available:6.08GiByte(6528913408) / total:74.5GiByte(80003198976) / free:6.08GiByte(6528913408) #4747 
22:06:59.818│├・drive:D / type:fixed / label:** / file-system:NTFS / serial:0x******** / max-path:255 / flags:0x002700FF / sectors-per-cluster:8 / bytes-per-sector:512Byte / available:39.0GiByte(41832468480) / total:74.5GiByte(80007262208) / free:39.0GiByte(41832468480) #4747 
22:06:59.818│├・drive:F / type:fixed / label:*** / file-system:NTFS / serial:0x******** / max-path:255 / flags:0x002700FF / sectors-per-cluster:8 / bytes-per-sector:512Byte / available:726GiByte(779961614336) / total:931GiByte(1000202240000) / free:726GiByte(779961614336) #4747 
22:06:59.819│├・drive:G / type:cdrom #4747 
22:06:59.831│├・drive:I / type:removable #4747 
22:06:59.842│├・drive:J / type:removable #4747 
22:06:59.854│├・drive:K / type:removable #4747 
22:06:59.866│├・drive:L / type:removable #4747 
22:06:59.866│├・drive:O / type:fixed / label:**** / file-system:NTFS / serial:0x******** / max-path:255 / flags:0x002700FF / sectors-per-cluster:8 / bytes-per-sector:512Byte / available:10.4GiByte(11172679680) / total:114GiByte(122683387904) / free:10.4GiByte(11172679680) #4747 
22:06:59.866│├・drive:X / type:fixed / label:***** / file-system:NTFS / serial:0x******** / max-path:255 / flags:0x002700FF / sectors-per-cluster:8 / bytes-per-sector:512Byte / available:143GiByte(154588205056) / total:202GiByte(217409646592) / free:143GiByte(154588205056) #4747 
22:06:59.866│└△Drives Information #4752 
22:06:59.866├┬▽Monitor Information #4793 
22:06:59.866│├・Monitor Rect:(0,0)-(1920,1200) / Work:(0,0)-(1920,1200) / Device:\\.\DISPLAY1 #4786 
22:06:59.866│├・Monitor Rect:(1920,176)-(3200,1200) / Work:(1920,176)-(3200,1200) / Device:\\.\DISPLAY2 #4786 
22:06:59.866│└△Monitor Information #4793 
22:06:59.866├┬▽Display Information #4851 
22:06:59.866│├・Display Name:\\.\DISPLAY1 / Context:NVIDIA GeForce 8600 GTS #4867 
22:06:59.867│├・Display Name:\\.\DISPLAY2 / Context:NVIDIA GeForce 8600 GTS #4867 
22:06:59.867│├・Display Name:\\.\DISPLAYV1 / Context:RDPDD Chained DD #4867 
22:06:59.867│├・Display Name:\\.\DISPLAYV2 / Context:RDP Encoder Mirror Driver #4867 
22:06:59.867│└△Display Information #4851 
22:06:59.867├┬▽All Environment Information #4838 
22:06:59.867│├・=::=::\ #4842 
22:06:59.867│├・=C:=C:\Users\wraith #4842 
22:06:59.867│├・=ExitCode=00000000 #4842 
22:06:59.867│├・=O:=O:\cxx\bugbeard\work #4842 
22:06:59.867│├・ALLUSERSPROFILE=C:\ProgramData #4842 
22:06:59.867│├・APPDATA=C:\Users\wraith\AppData\Roaming #4842 
22:06:59.867│├・BDSCOMMONDIR=C:\Users\Public\Documents\RAD Studio\5.0 #4842 
22:06:59.867│├・CLASSPATH=.;C:\Program Files\Java\jre1.5.0_10\lib\ext\QTJava.zip #4842 
22:06:59.867│├・CommonProgramFiles=C:\Program Files\Common Files #4842 
22:06:59.867│├・COMPUTERNAME=CRUISER #4842 
22:06:59.867│├・ComSpec=C:\Windows\system32\cmd.exe #4842 
22:06:59.867│├・FP_NO_HOST_CHECK=NO #4842 
22:06:59.867│├・HOMEDRIVE=C: #4842 
22:06:59.867│├・HOMEPATH=\Users\wraith #4842 
22:06:59.867│├・LOCALAPPDATA=C:\Users\wraith\AppData\Local #4842 
22:06:59.867│├・LOGONSERVER=\\CRUISER #4842 
22:06:59.867│├・NUMBER_OF_PROCESSORS=2 #4842 
22:06:59.867│├・OS=Windows_NT #4842 
22:06:59.867│├・Path=************************************************************************************************************************* #4842 
22:06:59.867│├・PATHEXT=**************************************************** #4842 
22:06:59.867│├・PROCESSOR_ARCHITECTURE=x86 #4842 
22:06:59.867│├・PROCESSOR_IDENTIFIER=x86 Family 6 Model 15 Stepping 6, GenuineIntel #4842 
22:06:59.868│├・PROCESSOR_LEVEL=6 #4842 
22:06:59.868│├・PROCESSOR_REVISION=**** #4842 
22:06:59.868│├・ProgramData=C:\ProgramData #4842 
22:06:59.868│├・ProgramFiles=C:\Program Files #4842 
22:06:59.868│├・PROMPT=$P$G #4842 
22:06:59.868│├・PUBLIC=C:\Users\Public #4842 
22:06:59.868│├・QTJAVA=C:\Program Files\Java\jre1.5.0_10\lib\ext\QTJava.zip #4842 
22:06:59.868│├・SESSIONNAME=Console #4842 
22:06:59.868│├・solomoncmd="O:\solomon\bcc32" win.cpp  #4842 
22:06:59.868│├・SystemDrive=C: #4842 
22:06:59.868│├・SystemRoot=C:\Windows #4842 
22:06:59.868│├・TEMP=C:\Users\wraith\AppData\Local\Temp #4842 
22:06:59.868│├・TMP=C:\Users\wraith\AppData\Local\Temp #4842 
22:06:59.868│├・UGII_3DCONNEXION_LIBRARY=%UGII_BASE_DIR%\ugalliance\vendor\startup\3DxNX.dll #4842 
22:06:59.868│├・USERDOMAIN=cruiser #4842 
22:06:59.868│├・USERNAME=wraith #4842 
22:06:59.868│├・USERPROFILE=C:\Users\wraith #4842 
22:06:59.868│├・windir=C:\Windows #4842 
22:06:59.868│└△All Environment Information #4838 
22:06:59.868├・return #88 
┌─────┴──────────────────────────────── 
│日付&時刻:2008-09-23(火) 22:06:59.868 
└────────────────────────────────────── 

解説

//  OutputDebugString() でツリー形式の出力を行うロガーの定義
BUG_define_logger(new bugbeard::bug_tree_logger(new bugbeard::bug_OutputDebugString_writer()));
...この指定により標準エラーへの出力ではなく OutputDebugString() を使ってのログ出力を行っています。 DebugView などでログ出力を確認できます。 上のようなログ出力結果は一見、過剰に思えるかもしれませんが、バグベアードによって出力されるログは一般的に非常に膨大なものになり、この程度ハッキリ言って誤差の範囲ですから Windows でバグベアードを利用される場合...
    //  [BUG]コンパイル情報のログ出力
    BUG_exec(bugbeard::bug_compile_info(BUG_LOG));

    
//  [BUG]コマンドライン引数のログ出力
    BUG_exec(bugbeard::bug_arg_info(BUG_LOG, argc, args));
    
    
//  [BUG]Windowsバージョン情報のログ出力
    BUG_exec(bugbeard::bug_windows_version_info(BUG_LOG));
    
#if 0x0500 <= WINVER
    //  各種モジュールバージョン情報のログ出力
    BUG_exec(bugbeard::bug_enum_module_version_info(BUG_LOG));
#endif
    
#if 0x0500 <= WINVER
    //  [BUG]メモリ情報のログ出力
    BUG_exec(bugbeard::bug_memory_info(BUG_LOG));
#endif

    
//  [BUG]ドライブ情報のログ出力
    BUG_exec(bugbeard::bug_enum_drive_info(BUG_LOG));

#if 0x0500 <= WINVER
    //  [BUG]モニター情報のログ出力
    BUG_exec(bugbeard::bug_enum_monitor_info(BUG_LOG));
    
//  [BUG]ディスプレイ情報のログ出力
    BUG_exec(bugbeard::bug_enum_display_info(BUG_LOG));
#endif

    
//  [BUG](全ての)環境変数情報のログ出力
    BUG_exec(bugbeard::bug_enum_env(BUG_LOG));
...この部分のコードを丸々コピペして利用されることを強く推奨いたします。

.tsv形式ログ出力&マルチスレッドサンプル

サンプルコード

/******************************************************************************
    バグベアード -bugbeard-
        サンプル "tsv.cpp" ソースファイル
                                            Coded by Wraith in Feb 18, 2007.
******************************************************************************/



///////////////////////////////////////////////////////////////////////////////
//
//  includes
//

#include <stdio.h>
#include <stdlib.h>
#if defined(__GNUC__)
#   include <pthread.h>
#else
#   include <process.h>
#endif


///////////////////////////////////////////////////////////////////////////////
//
//  [BUG]bugbeard
//

#if defined(NDEBUG)
#define BUG_DISABLE_BUGBEARD    
//  リリース版ではバグベアードをロードしない
#endif

#define BUG_EVIL_CONTRACT       //  "悪魔の契約"
#define BUG_MULTI_THREAD        //  マルチスレッドモデルでバグベアードを利用
#include "bug.h"                //  ロガーを定義する為にステートメントハックを有効にしない状態で include

//  共用ライターの定義
BUG_exec(bugbeard::bug_smart_writer common_writer(new bugbeard::bug_file_writer_base(stderr)));

//  標準エラーにTSV形式の出力を行うロガーの定義(メインスレッド用)
BUG_define_logger(new bugbeard::bug_tsv_logger(common_writer));

#define BUG_STATEMENT_HACK      //  ステートメントハックの設定
#include "bug.h"                //  ステートメントハックを有効にする為、再度 include


///////////////////////////////////////////////////////////////////////////////
//
//  user codes
//

//
//  thread
//
#if defined(BUG_MS_WINDOWS)
#define BUG_THREAD_RESULT DWORD
#define BUG_THREAD_CALL __stdcall
#define BUG_THREAD_HANDLE HANDLE
#else
#define BUG_THREAD_RESULT void *
#define BUG_THREAD_CALL
#define BUG_THREAD_HANDLE pthread_t
#endif

//  スレッドの開始
BUG_THREAD_HANDLE open_thread(BUG_THREAD_RESULT (BUG_THREAD_CALL *func)(void *), void *data)
{
#if defined(BUG_MS_WINDOWS)
#   if defined(__BORLANDC__) || defined(__INTEL_COMPILER) || defined(_MSC_VER)
    DWORD thread_id;
    
return (HANDLE)_beginthreadex(NULL, 0, (unsigned (__stdcall *)(void *))func, data, 0, (unsigned int *)&thread_id);     
#   else
    return CreateThread(NULL, 4096, func, data, 0, NULL);
#   endif
#else
    BUG_THREAD_HANDLE handle;
    
pthread_create(&handle, NULL, func, data);
    
return handle;
#endif
}

//  スレッド終了まで待機
void wait_and_close_thread(BUG_THREAD_HANDLE handle)
{
#if defined(BUG_MS_WINDOWS)
    WaitForSingleObject(handle, INFINITE);
    
CloseHandle(handle);
#else
    pthread_join(handle, NULL);
#endif
}


//
//  素因数分解
//
#if defined(_MSC_VER) && 1300 < _MSC_VER
#   pragma warning(disable:4996)
#endif
void factorize(int number)
{
    
char buffer[256];
    
char * anchor = buffer;
    
anchor += sprintf(anchor, "%d = ", number);
    
int current = number;
    
if (1 < current)
    
{
        
int p = 2;
        
int pn = 0;
        
int inc = 1;
        
while(1 < current)
        
{
            
if (current %p)
            
{
                
if (pn)
                
{
                    
anchor += sprintf(anchor, "%d", p);
                    
if (1 < pn)
                    
{
                        
anchor += sprintf(anchor, "^%d", pn);
                    
}
                    
anchor += sprintf(anchor, " * ");
                    
pn = 0;
                
}
                
p += inc;
                
                
//  [BUG]値のログ出力
                BUG_puts(BUG_VAL(p));
                
                
inc = 2;
            
}
            
else
            
{
                
current /= p;
                
                
//  [BUG]値のログ出力
                BUG_puts(BUG_VAL(current));
                
                
++pn;
                
                
//  [BUG]値のログ出力
                BUG_puts(BUG_VAL(pn));
            
}
        
}
        
anchor += sprintf(anchor, "%d", p);
        
if (1 < pn)
        
{
            
anchor += sprintf(anchor, "^%d", pn);
        
}
    
}
    
else
    
{
        
anchor += sprintf(anchor, "%d", current);
    
}
    
puts(buffer);
    
return;
}
BUG_THREAD_RESULT BUG_THREAD_CALL factorize_thread(void * data)
{
    
//  [BUG]スレッドローカルロガーの定義
    BUG_define_logger(new bugbeard::bug_tsv_logger(common_writer));
    
factorize((int)data);
    
return 0;
}


//
//  スタートアップ
//
int main(int argc, char * args[])
{
    
//  [BUG]コンパイル情報のログ出力
    BUG_exec(bugbeard::bug_compile_info(BUG_LOG));

    
//  [BUG]コマンドライン引数のログ出力
    BUG_exec(bugbeard::bug_arg_info(BUG_LOG, argc, args));

    
BUG_THREAD_HANDLE * thread_list = new BUG_THREAD_HANDLE[argc];
    
    
//  スレッド起動
    for(int i = 1; i < argc; ++i)
    
{
        
thread_list[i] = open_thread(factorize_thread, (void *)atoi(args[i]));
    
}
    
//  スレッド待機
    for(int i = 1; i < argc; ++i)
    
{
        
wait_and_close_thread(thread_list[i]);
    
}
    
    
delete []thread_list;
    
    
return EXIT_SUCCESS;
}


/******************************************************************************
    □■□■                  Wraith the Trickster                  □■□■
    ■□■□ 〜I'll go with heaven's advantage and fool's wisdom.〜 ■□■□
******************************************************************************/

出力結果(標準出力)

101 = 101
301 = 7 * 43
201 = 3 * 67

出力結果(標準エラー)

20:04:19.182	540	0	bug.h	2462	▽bugbeard session root
20:04:19.183	540	1	bug.h	2463	日付&時刻:2008-02-24(日) 20:04:19.183
20:04:19.183	540	1	bug.h	2839	▽Compile Information
20:04:19.183	540	2	bug.h	2841	Compiler:Visual C++(1400)
20:04:19.183	540	2	bug.h	2843	Compile Date:Feb 24 2008 / Compile Time:20:02:37
20:04:19.183	540	2	bug.h	2839	△Compile Information
20:04:19.183	540	1	bug.h	2849	▽Commandline Argument Information
20:04:19.183	540	2	bug.h	2850	argc(0x0012FAC8) = 4(0x00000004)
20:04:19.183	540	2	bug.h	2853	args[0]:tsv
20:04:19.183	540	2	bug.h	2853	args[1]:101
20:04:19.183	540	2	bug.h	2853	args[2]:201
20:04:19.183	540	2	bug.h	2853	args[3]:301
20:04:19.183	540	2	bug.h	2849	△Commandline Argument Information
20:04:19.183	540	1	tsv.cpp	176	▽new
20:04:19.183	540	2	tsv.cpp	176	△new
20:04:19.183	540	1	tsv.cpp	179	▽for
20:04:19.183	540	2	tsv.cpp	69	return
20:04:19.183	5772	0	bug.h	2462	▽bugbeard session root
20:04:19.183	540	2	tsv.cpp	69	return
20:04:19.183	5772	1	bug.h	2463	日付&時刻:2008-02-24(日) 20:04:19.183
20:04:19.183	5772	1	tsv.cpp	104	▽if (1 < current) == true;
20:04:19.183	540	2	tsv.cpp	69	return
20:04:19.183	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.183	540	2	tsv.cpp	179	△for
20:04:19.183	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.183	540	1	tsv.cpp	184	▽for
20:04:19.183	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.183	868	0	bug.h	2462	▽bugbeard session root
20:04:19.183	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.183	868	1	bug.h	2463	日付&時刻:2008-02-24(日) 20:04:19.183
20:04:19.183	5772	3	tsv.cpp	126	p(0x0133FC5C) = 3(0x00000003)
20:04:19.183	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.183	868	1	tsv.cpp	104	▽if (1 < current) == true;
20:04:19.183	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.183	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.183	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.183	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.183	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.183	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.183	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.183	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.183	5772	3	tsv.cpp	126	p(0x0133FC5C) = 5(0x00000005)
20:04:19.183	868	3	tsv.cpp	126	p(0x0143FC5C) = 3(0x00000003)
20:04:19.183	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.183	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.183	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.183	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.183	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.183	868	2	tsv.cpp	111	▽if (current %p) == false;
20:04:19.183	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.183	868	3	tsv.cpp	135	current(0x0143FD9C) = 67(0x00000043)
20:04:19.183	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.183	868	3	tsv.cpp	140	pn(0x0143FC54) = 1(0x00000001)
20:04:19.183	5772	3	tsv.cpp	126	p(0x0133FC5C) = 7(0x00000007)
20:04:19.183	868	3	tsv.cpp	111	△if (current %p) == false;
20:04:19.184	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.184	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.184	4264	0	bug.h	2462	▽bugbeard session root
20:04:19.184	868	3	tsv.cpp	113	▽if (pn) == true;
20:04:19.184	4264	1	bug.h	2463	日付&時刻:2008-02-24(日) 20:04:19.184
20:04:19.184	868	4	tsv.cpp	116	▽if (1 < pn) == false;
20:04:19.184	4264	1	tsv.cpp	104	▽if (1 < current) == true;
20:04:19.184	868	5	tsv.cpp	116	△if (1 < pn) == false;
20:04:19.184	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.184	868	4	tsv.cpp	113	△if (pn) == true;
20:04:19.184	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.183	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.184	4264	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.184	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.184	4264	4	tsv.cpp	113	△if (pn) == false;
20:04:19.184	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.184	4264	3	tsv.cpp	126	p(0x0153FC5C) = 3(0x00000003)
20:04:19.184	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.184	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.184	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.184	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.184	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.184	5772	3	tsv.cpp	126	p(0x0133FC5C) = 9(0x00000009)
20:04:19.184	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.184	4264	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.184	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.184	4264	4	tsv.cpp	113	△if (pn) == false;
20:04:19.184	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.184	4264	3	tsv.cpp	126	p(0x0153FC5C) = 5(0x00000005)
20:04:19.184	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.184	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.184	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.184	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.184	5772	3	tsv.cpp	126	p(0x0133FC5C) = 11(0x0000000B)
20:04:19.184	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.184	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.184	4264	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.184	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.184	4264	4	tsv.cpp	113	△if (pn) == false;
20:04:19.184	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.184	4264	3	tsv.cpp	126	p(0x0153FC5C) = 7(0x00000007)
20:04:19.184	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.184	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.184	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.184	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.184	5772	3	tsv.cpp	126	p(0x0133FC5C) = 13(0x0000000D)
20:04:19.184	4264	2	tsv.cpp	111	▽if (current %p) == false;
20:04:19.184	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.184	4264	3	tsv.cpp	135	current(0x0153FD9C) = 43(0x0000002B)
20:04:19.184	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.184	4264	3	tsv.cpp	140	pn(0x0153FC54) = 1(0x00000001)
20:04:19.184	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.184	4264	3	tsv.cpp	111	△if (current %p) == false;
20:04:19.184	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.184	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.184	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.184	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.184	5772	3	tsv.cpp	126	p(0x0133FC5C) = 15(0x0000000F)
20:04:19.184	4264	3	tsv.cpp	113	▽if (pn) == true;
20:04:19.184	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.184	4264	4	tsv.cpp	116	▽if (1 < pn) == false;
20:04:19.184	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.184	4264	5	tsv.cpp	116	△if (1 < pn) == false;
20:04:19.184	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.184	4264	4	tsv.cpp	113	△if (pn) == true;
20:04:19.184	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.184	4264	3	tsv.cpp	126	p(0x0153FC5C) = 9(0x00000009)
20:04:19.184	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.184	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.184	5772	3	tsv.cpp	126	p(0x0133FC5C) = 17(0x00000011)
20:04:19.184	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.184	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.184	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.184	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.184	4264	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.184	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.184	4264	4	tsv.cpp	113	△if (pn) == false;
20:04:19.184	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.184	4264	3	tsv.cpp	126	p(0x0153FC5C) = 11(0x0000000B)
20:04:19.184	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.184	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.184	5772	3	tsv.cpp	126	p(0x0133FC5C) = 19(0x00000013)
20:04:19.184	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.184	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.184	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.184	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.184	4264	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.184	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.184	4264	4	tsv.cpp	113	△if (pn) == false;
20:04:19.185	4264	3	tsv.cpp	126	p(0x0153FC5C) = 13(0x0000000D)
20:04:19.184	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.185	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.185	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.185	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.185	5772	3	tsv.cpp	126	p(0x0133FC5C) = 21(0x00000015)
20:04:19.185	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.185	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.185	4264	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.185	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.185	4264	4	tsv.cpp	113	△if (pn) == false;
20:04:19.185	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.185	4264	3	tsv.cpp	126	p(0x0153FC5C) = 15(0x0000000F)
20:04:19.185	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.185	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.185	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.185	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.185	5772	3	tsv.cpp	126	p(0x0133FC5C) = 23(0x00000017)
20:04:19.185	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.185	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.185	4264	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.185	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.185	4264	4	tsv.cpp	113	△if (pn) == false;
20:04:19.185	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.185	4264	3	tsv.cpp	126	p(0x0153FC5C) = 17(0x00000011)
20:04:19.185	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.185	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.185	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.185	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.185	5772	3	tsv.cpp	126	p(0x0133FC5C) = 25(0x00000019)
20:04:19.185	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.185	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.185	4264	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.185	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.185	4264	4	tsv.cpp	113	△if (pn) == false;
20:04:19.185	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.185	4264	3	tsv.cpp	126	p(0x0153FC5C) = 19(0x00000013)
20:04:19.185	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.185	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.185	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.185	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.185	5772	3	tsv.cpp	126	p(0x0133FC5C) = 27(0x0000001B)
20:04:19.185	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.185	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.185	4264	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.185	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.185	4264	4	tsv.cpp	113	△if (pn) == false;
20:04:19.185	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.185	4264	3	tsv.cpp	126	p(0x0153FC5C) = 21(0x00000015)
20:04:19.185	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.185	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.185	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.185	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.185	5772	3	tsv.cpp	126	p(0x0133FC5C) = 29(0x0000001D)
20:04:19.185	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.185	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.185	4264	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.185	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.185	4264	4	tsv.cpp	113	△if (pn) == false;
20:04:19.185	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.185	4264	3	tsv.cpp	126	p(0x0153FC5C) = 23(0x00000017)
20:04:19.185	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.185	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.185	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.185	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.185	5772	3	tsv.cpp	126	p(0x0133FC5C) = 31(0x0000001F)
20:04:19.185	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.185	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.185	4264	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.185	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.185	4264	4	tsv.cpp	113	△if (pn) == false;
20:04:19.185	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.185	4264	3	tsv.cpp	126	p(0x0153FC5C) = 25(0x00000019)
20:04:19.185	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.185	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.185	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.185	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.185	5772	3	tsv.cpp	126	p(0x0133FC5C) = 33(0x00000021)
20:04:19.185	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.185	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.185	4264	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.185	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.185	4264	4	tsv.cpp	113	△if (pn) == false;
20:04:19.185	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.185	4264	3	tsv.cpp	126	p(0x0153FC5C) = 27(0x0000001B)
20:04:19.185	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.185	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.185	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.185	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.185	5772	3	tsv.cpp	126	p(0x0133FC5C) = 35(0x00000023)
20:04:19.185	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.185	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.185	4264	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.185	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.185	4264	4	tsv.cpp	113	△if (pn) == false;
20:04:19.185	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.185	4264	3	tsv.cpp	126	p(0x0153FC5C) = 29(0x0000001D)
20:04:19.185	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.185	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.185	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.185	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.185	5772	3	tsv.cpp	126	p(0x0133FC5C) = 37(0x00000025)
20:04:19.185	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.185	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.185	4264	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.185	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.184	868	3	tsv.cpp	126	p(0x0143FC5C) = 5(0x00000005)
20:04:19.185	4264	4	tsv.cpp	113	△if (pn) == false;
20:04:19.186	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.186	4264	3	tsv.cpp	126	p(0x0153FC5C) = 31(0x0000001F)
20:04:19.186	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.186	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.186	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.186	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.186	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.186	5772	3	tsv.cpp	126	p(0x0133FC5C) = 39(0x00000027)
20:04:19.186	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.186	4264	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.186	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.186	4264	4	tsv.cpp	113	△if (pn) == false;
20:04:19.186	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.186	4264	3	tsv.cpp	126	p(0x0153FC5C) = 33(0x00000021)
20:04:19.186	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.186	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.186	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.186	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.186	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.186	5772	3	tsv.cpp	126	p(0x0133FC5C) = 41(0x00000029)
20:04:19.186	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.186	4264	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.186	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.186	4264	4	tsv.cpp	113	△if (pn) == false;
20:04:19.186	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.186	4264	3	tsv.cpp	126	p(0x0153FC5C) = 35(0x00000023)
20:04:19.186	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.186	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.186	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.186	4264	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.186	4264	4	tsv.cpp	113	△if (pn) == false;
20:04:19.186	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.186	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.186	5772	3	tsv.cpp	126	p(0x0133FC5C) = 43(0x0000002B)
20:04:19.186	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.186	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.186	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.186	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.186	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.186	5772	3	tsv.cpp	126	p(0x0133FC5C) = 45(0x0000002D)
20:04:19.186	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.186	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.186	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.186	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.186	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.186	5772	3	tsv.cpp	126	p(0x0133FC5C) = 47(0x0000002F)
20:04:19.186	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.186	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.186	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.186	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.186	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.186	5772	3	tsv.cpp	126	p(0x0133FC5C) = 49(0x00000031)
20:04:19.186	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.186	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.186	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.186	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.186	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.186	5772	3	tsv.cpp	126	p(0x0133FC5C) = 51(0x00000033)
20:04:19.186	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.186	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.186	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.186	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.186	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.186	5772	3	tsv.cpp	126	p(0x0133FC5C) = 53(0x00000035)
20:04:19.186	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.186	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.186	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.186	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.186	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.187	5772	3	tsv.cpp	126	p(0x0133FC5C) = 55(0x00000037)
20:04:19.187	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.187	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.187	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.187	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.187	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.187	5772	3	tsv.cpp	126	p(0x0133FC5C) = 57(0x00000039)
20:04:19.187	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.187	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.187	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.187	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.187	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.187	5772	3	tsv.cpp	126	p(0x0133FC5C) = 59(0x0000003B)
20:04:19.187	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.187	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.187	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.187	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.187	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.187	5772	3	tsv.cpp	126	p(0x0133FC5C) = 61(0x0000003D)
20:04:19.187	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.187	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.187	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.187	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.187	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.187	5772	3	tsv.cpp	126	p(0x0133FC5C) = 63(0x0000003F)
20:04:19.187	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.187	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.187	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.187	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.187	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.187	5772	3	tsv.cpp	126	p(0x0133FC5C) = 65(0x00000041)
20:04:19.187	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.187	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.187	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.187	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.187	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.187	5772	3	tsv.cpp	126	p(0x0133FC5C) = 67(0x00000043)
20:04:19.187	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.187	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.187	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.187	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.187	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.187	5772	3	tsv.cpp	126	p(0x0133FC5C) = 69(0x00000045)
20:04:19.187	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.187	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.187	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.187	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.187	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.187	5772	3	tsv.cpp	126	p(0x0133FC5C) = 71(0x00000047)
20:04:19.187	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.187	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.187	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.187	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.187	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.187	5772	3	tsv.cpp	126	p(0x0133FC5C) = 73(0x00000049)
20:04:19.187	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.187	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.187	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.187	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.188	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.188	5772	3	tsv.cpp	126	p(0x0133FC5C) = 75(0x0000004B)
20:04:19.188	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.188	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.188	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.188	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.188	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.188	5772	3	tsv.cpp	126	p(0x0133FC5C) = 77(0x0000004D)
20:04:19.188	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.188	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.188	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.188	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.188	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.188	5772	3	tsv.cpp	126	p(0x0133FC5C) = 79(0x0000004F)
20:04:19.188	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.188	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.188	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.188	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.188	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.188	5772	3	tsv.cpp	126	p(0x0133FC5C) = 81(0x00000051)
20:04:19.188	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.188	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.188	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.188	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.188	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.188	5772	3	tsv.cpp	126	p(0x0133FC5C) = 83(0x00000053)
20:04:19.188	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.188	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.188	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.188	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.188	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.188	5772	3	tsv.cpp	126	p(0x0133FC5C) = 85(0x00000055)
20:04:19.188	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.188	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.188	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.188	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.188	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.188	5772	3	tsv.cpp	126	p(0x0133FC5C) = 87(0x00000057)
20:04:19.188	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.188	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.188	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.188	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.188	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.188	5772	3	tsv.cpp	126	p(0x0133FC5C) = 89(0x00000059)
20:04:19.188	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.188	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.188	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.188	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.188	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.188	5772	3	tsv.cpp	126	p(0x0133FC5C) = 91(0x0000005B)
20:04:19.188	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.188	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.188	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.188	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.188	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.188	5772	3	tsv.cpp	126	p(0x0133FC5C) = 93(0x0000005D)
20:04:19.188	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.188	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.188	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.188	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.189	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.189	5772	3	tsv.cpp	126	p(0x0133FC5C) = 95(0x0000005F)
20:04:19.189	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.189	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.189	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.186	4264	3	tsv.cpp	126	p(0x0153FC5C) = 37(0x00000025)
20:04:19.189	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.189	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.189	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.189	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.189	5772	3	tsv.cpp	126	p(0x0133FC5C) = 97(0x00000061)
20:04:19.189	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.189	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.189	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.189	4264	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.189	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.189	4264	4	tsv.cpp	113	△if (pn) == false;
20:04:19.189	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.189	4264	3	tsv.cpp	126	p(0x0153FC5C) = 39(0x00000027)
20:04:19.189	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.189	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.189	5772	3	tsv.cpp	126	p(0x0133FC5C) = 99(0x00000063)
20:04:19.189	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.189	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.189	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.189	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.189	4264	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.189	5772	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.189	4264	4	tsv.cpp	113	△if (pn) == false;
20:04:19.189	5772	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.189	4264	3	tsv.cpp	126	p(0x0153FC5C) = 41(0x00000029)
20:04:19.189	5772	4	tsv.cpp	113	△if (pn) == false;
20:04:19.189	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.189	5772	3	tsv.cpp	126	p(0x0133FC5C) = 101(0x00000065)
20:04:19.189	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.189	5772	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.189	4264	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.189	5772	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.189	4264	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.189	5772	2	tsv.cpp	111	▽if (current %p) == false;
20:04:19.189	4264	4	tsv.cpp	113	△if (pn) == false;
20:04:19.189	5772	3	tsv.cpp	135	current(0x0133FD9C) = 1(0x00000001)
20:04:19.189	4264	3	tsv.cpp	126	p(0x0153FC5C) = 43(0x0000002B)
20:04:19.189	5772	3	tsv.cpp	140	pn(0x0133FC54) = 1(0x00000001)
20:04:19.189	4264	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.189	5772	3	tsv.cpp	111	△if (current %p) == false;
20:04:19.189	4264	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.189	5772	2	tsv.cpp	109	while (1 < current) == false;
20:04:19.189	4264	2	tsv.cpp	111	▽if (current %p) == false;
20:04:19.189	5772	2	tsv.cpp	144	▽if (1 < pn) == false;
20:04:19.189	4264	3	tsv.cpp	135	current(0x0153FD9C) = 1(0x00000001)
20:04:19.189	5772	3	tsv.cpp	144	△if (1 < pn) == false;
20:04:19.189	4264	3	tsv.cpp	140	pn(0x0153FC54) = 1(0x00000001)
20:04:19.189	5772	2	tsv.cpp	104	△if (1 < current) == true;
20:04:19.189	4264	3	tsv.cpp	111	△if (current %p) == false;
20:04:19.189	4264	2	tsv.cpp	109	while (1 < current) == false;
20:04:19.189	4264	2	tsv.cpp	144	▽if (1 < pn) == false;
20:04:19.189	4264	3	tsv.cpp	144	△if (1 < pn) == false;
20:04:19.189	4264	2	tsv.cpp	104	△if (1 < current) == true;
20:04:19.189	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.189	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.189	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.189	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.189	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.189	868	3	tsv.cpp	126	p(0x0143FC5C) = 7(0x00000007)
20:04:19.189	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.189	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.189	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.189	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.189	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.189	868	3	tsv.cpp	126	p(0x0143FC5C) = 9(0x00000009)
20:04:19.189	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.189	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.189	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.189	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.190	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.190	868	3	tsv.cpp	126	p(0x0143FC5C) = 11(0x0000000B)
20:04:19.190	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.190	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.190	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.190	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.190	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.190	868	3	tsv.cpp	126	p(0x0143FC5C) = 13(0x0000000D)
20:04:19.190	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.190	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.190	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.190	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.190	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.190	868	3	tsv.cpp	126	p(0x0143FC5C) = 15(0x0000000F)
20:04:19.190	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.190	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.190	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.190	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.190	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.190	868	3	tsv.cpp	126	p(0x0143FC5C) = 17(0x00000011)
20:04:19.190	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.190	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.190	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.190	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.190	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.190	868	3	tsv.cpp	126	p(0x0143FC5C) = 19(0x00000013)
20:04:19.190	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.190	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.190	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.190	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.190	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.190	868	3	tsv.cpp	126	p(0x0143FC5C) = 21(0x00000015)
20:04:19.190	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.190	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.190	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.190	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.190	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.190	868	3	tsv.cpp	126	p(0x0143FC5C) = 23(0x00000017)
20:04:19.190	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.190	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.190	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.190	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.190	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.190	5772	1	tsv.cpp	154	return
20:04:19.190	5772	1	tsv.cpp	161	return
20:04:19.190	5772	1	bug.h	2468	日付&時刻:2008-02-24(日) 20:04:19.190
20:04:19.190	5772	1	bug.h	2469	△bugbeard session root
20:04:19.190	868	3	tsv.cpp	126	p(0x0143FC5C) = 25(0x00000019)
20:04:19.191	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.191	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.191	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.191	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.191	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.191	868	3	tsv.cpp	126	p(0x0143FC5C) = 27(0x0000001B)
20:04:19.191	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.191	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.191	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.191	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.191	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.191	868	3	tsv.cpp	126	p(0x0143FC5C) = 29(0x0000001D)
20:04:19.191	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.191	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.191	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.191	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.191	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.191	868	3	tsv.cpp	126	p(0x0143FC5C) = 31(0x0000001F)
20:04:19.191	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.191	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.191	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.191	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.191	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.191	868	3	tsv.cpp	126	p(0x0143FC5C) = 33(0x00000021)
20:04:19.191	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.191	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.191	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.191	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.191	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.191	868	3	tsv.cpp	126	p(0x0143FC5C) = 35(0x00000023)
20:04:19.191	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.191	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.191	4264	1	tsv.cpp	154	return
20:04:19.191	4264	1	tsv.cpp	161	return
20:04:19.191	4264	1	bug.h	2468	日付&時刻:2008-02-24(日) 20:04:19.191
20:04:19.191	4264	1	bug.h	2469	△bugbeard session root
20:04:19.191	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.191	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.191	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.191	868	3	tsv.cpp	126	p(0x0143FC5C) = 37(0x00000025)
20:04:19.191	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.191	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.191	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.191	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.191	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.191	868	3	tsv.cpp	126	p(0x0143FC5C) = 39(0x00000027)
20:04:19.192	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.192	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.192	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.192	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.192	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.192	868	3	tsv.cpp	126	p(0x0143FC5C) = 41(0x00000029)
20:04:19.192	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.192	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.192	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.192	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.192	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.192	868	3	tsv.cpp	126	p(0x0143FC5C) = 43(0x0000002B)
20:04:19.192	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.192	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.192	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.192	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.192	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.192	868	3	tsv.cpp	126	p(0x0143FC5C) = 45(0x0000002D)
20:04:19.192	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.192	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.192	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.192	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.192	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.192	868	3	tsv.cpp	126	p(0x0143FC5C) = 47(0x0000002F)
20:04:19.192	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.192	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.192	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.192	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.192	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.192	868	3	tsv.cpp	126	p(0x0143FC5C) = 49(0x00000031)
20:04:19.192	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.192	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.192	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.192	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.192	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.192	868	3	tsv.cpp	126	p(0x0143FC5C) = 51(0x00000033)
20:04:19.192	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.192	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.192	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.192	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.192	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.192	868	3	tsv.cpp	126	p(0x0143FC5C) = 53(0x00000035)
20:04:19.192	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.192	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.192	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.192	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.192	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.192	868	3	tsv.cpp	126	p(0x0143FC5C) = 55(0x00000037)
20:04:19.192	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.192	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.192	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.192	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.192	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.192	868	3	tsv.cpp	126	p(0x0143FC5C) = 57(0x00000039)
20:04:19.192	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.192	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.192	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.192	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.192	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.192	868	3	tsv.cpp	126	p(0x0143FC5C) = 59(0x0000003B)
20:04:19.193	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.193	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.193	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.193	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.193	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.193	868	3	tsv.cpp	126	p(0x0143FC5C) = 61(0x0000003D)
20:04:19.193	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.193	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.193	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.193	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.193	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.193	868	3	tsv.cpp	126	p(0x0143FC5C) = 63(0x0000003F)
20:04:19.193	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.193	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.193	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.193	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.193	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.193	868	3	tsv.cpp	126	p(0x0143FC5C) = 65(0x00000041)
20:04:19.193	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.193	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.193	868	2	tsv.cpp	111	▽if (current %p) == true;
20:04:19.193	868	3	tsv.cpp	113	▽if (pn) == false;
20:04:19.193	868	4	tsv.cpp	113	△if (pn) == false;
20:04:19.193	868	3	tsv.cpp	126	p(0x0143FC5C) = 67(0x00000043)
20:04:19.193	868	3	tsv.cpp	111	△if (current %p) == true;
20:04:19.193	868	2	tsv.cpp	109	while (1 < current) == true;
20:04:19.193	868	2	tsv.cpp	111	▽if (current %p) == false;
20:04:19.193	868	3	tsv.cpp	135	current(0x0143FD9C) = 1(0x00000001)
20:04:19.193	868	3	tsv.cpp	140	pn(0x0143FC54) = 1(0x00000001)
20:04:19.193	868	3	tsv.cpp	111	△if (current %p) == false;
20:04:19.193	868	2	tsv.cpp	109	while (1 < current) == false;
20:04:19.193	868	2	tsv.cpp	144	▽if (1 < pn) == false;
20:04:19.193	868	3	tsv.cpp	144	△if (1 < pn) == false;
20:04:19.193	868	2	tsv.cpp	104	△if (1 < current) == true;
20:04:19.194	868	1	tsv.cpp	154	return
20:04:19.194	868	1	tsv.cpp	161	return
20:04:19.194	868	1	bug.h	2468	日付&時刻:2008-02-24(日) 20:04:19.194
20:04:19.194	868	1	bug.h	2469	△bugbeard session root
20:04:19.194	540	2	tsv.cpp	184	△for
20:04:19.194	540	1	tsv.cpp	189	▽delete
20:04:19.194	540	2	tsv.cpp	189	△delete
20:04:19.194	540	1	tsv.cpp	191	return
20:04:19.194	540	1	bug.h	2468	日付&時刻:2008-02-24(日) 20:04:19.194
20:04:19.194	540	1	bug.h	2469	△bugbeard session root

解説

上記の出力結果は...

20:04:19.183	540	1	bug.h	2849	▽Commandline Argument Information
20:04:19.183	540	2	bug.h	2850	argc(0x0012FAC8) = 4(0x00000004)
20:04:19.183	540	2	bug.h	2853	args[0]:tsv
20:04:19.183	540	2	bug.h	2853	args[1]:101
20:04:19.183	540	2	bug.h	2853	args[2]:201
20:04:19.183	540	2	bug.h	2853	args[3]:301
20:04:19.183	540	2	bug.h	2849	△Commandline Argument Information
...を見てもおわかりいただけますが、「101 201 301」を引数として与えた場合のものです。 またこのケースでは .tsv の各カラムはそれぞれ 時刻, スレッドID, ネストの深さ, __FILE__, __LINE__, ログメッセージ の内容になっていますが、コンパイル時の状況によりこの書式は若干変化します。

このサンプルでの一つ目の肝は...

//  標準エラーにTSV形式の出力を行うロガーの定義(メインスレッド用)
BUG_define_logger(new bugbeard::bug_tsv_logger(common_writer));
...で、ツリー形式ではなく .tsv 形式のログ出力を指定しているところです。ロガーへの引数がこれまでのサンプルと違いますが、これはマルチスレッド対応の為のもので、.tsv 形式でログ出力を行うこととは本質的には関係ありません。

このサンプルでの二つの肝は最初に bug.h を include する前に...

#define BUG_EVIL_CONTRACT       //  "悪魔の契約"
#define BUG_MULTI_THREAD        //  マルチスレッドモデルでバグベアードを利用
#include "bug.h"                //  ロガーを定義する為にステートメントハックを有効にしない状態で include
BUG_MULTI_THREAD マクロを定義してバグベアードをマルチスレッドモデルで利用すること宣言した上で、ロガーを...
//  共用ライターの定義
BUG_exec(bugbeard::bug_smart_writer common_writer(new bugbeard::bug_file_writer_base(stderr)));

//  標準エラーにTSV形式の出力を行うロガーの定義(メインスレッド用)
BUG_define_logger(new bugbeard::bug_tsv_logger(common_writer));
BUG_THREAD_RESULT BUG_THREAD_CALL factorize_thread(void * data)
{
    
//  [BUG]スレッドローカルロガーの定義
    BUG_define_logger(new bugbeard::bug_tsv_logger(common_writer));
    
factorize((int)data);
    
return 0;
}
...のように各スレッド毎に定義していることです。バグベアードをマルチスレッドなプログラムで利用する場合は必ずこのように各スレッド毎にロガーを定義してください。ロガーが定義されていないスレッドではログ出力が行われません。

このサンプルでは同じ出力先へログ出力を行うので bugbeard::bug_smart_writer 型でラップした bugbeard::bug_writer 派生オブジェクトを各スレッドで使いまわしています。これはロガーが自分に与えられた bugbeard::bug_writer 派生オブジェクトを自身のデストラクタ内で破棄する為です。bugbeard::bug_smart_writer 型でラップしないと最初に終了したスレッドにより bugbeard::bug_writer 派生オブジェクトが破棄され残りのスレッドが既に破棄されたオブジェクトを使用してログ出力を行おうとして異常終了します。

マルチプロセス/マルチスレッドな状況ではツリー形式より.tsv形式のほうが有効だろうと思って.tsv形式での出力にも対応したもののフィルターの使えるビューアで見る分にはマルチプロセス/マルチスレッドな状況であっても.tsv形式よりもツリー形式のほうが見やすかったりします。でも、まぁ、.tsv形式はデータとして処理し易いんで統計的な情報分析やる際に役立ってくれると思います。

バルクログ出力サンプル

サンプルコード

/******************************************************************************
    バグベアード -bugbeard-
        サンプル "bulklog.cpp" ソースファイル
                                            Coded by Wraith in Feb 18, 2007.
******************************************************************************/



///////////////////////////////////////////////////////////////////////////////
//
//  includes
//

#include <stdio.h>
#include <stdlib.h>


///////////////////////////////////////////////////////////////////////////////
//
//  [BUG]bugbeard
//

#if defined(NDEBUG)
#define BUG_DISABLE_BUGBEARD    
//  リリース版ではバグベアードをロードしない
#endif

#define BUG_EVIL_CONTRACT       //  "悪魔の契約"
#include "bug.h"                //  ロガーを定義する為にステートメントハックを有効にしない状態で include

#if defined(BUG_LOAD_BUGBEARD)
const bugbeard::bug_string bug_log_filename()
{
    
using namespace bugbeard;
    
const bug_clock stamp = bug_clock();
#if defined(__MWERKS__)
#error なんか Metrowerk のコンパイラはこのへんのコードの解釈の仕方が、びっくりするぐらいバカで付き合いきれません。(´Д`;)
#endif
    return
        
bug_dir("buglog")
        
+bug_dir("%4.4d", stamp.year)
        
+bug_dir("%2.2d", stamp.mon)
        
+bug_dir("%2.2d", stamp.mday)
        
+"bulklog.log";
}
#endif

//  ログファイルにツリー形式の出力を行うロガーの定義
BUG_define_logger(new bugbeard::bug_tree_logger(new bugbeard::bug_file_writer(bug_log_filename())));

#define BUG_STATEMENT_HACK      //  ステートメントハックの設定
#include "bug.h"                //  ステートメントハックを有効にする為、再度 include


///////////////////////////////////////////////////////////////////////////////
//
//  user codes
//

//
//  素因数分解
//
void factorize(int number)
{
    
printf("%d = ", number);
    
int current = number;
    
if (1 < current)
    
{
        
int p = 2;
        
int pn = 0;
        
int inc = 1;
        
while(1 < current)
        
{
            
if (current %p)
            
{
                
if (pn)
                
{
                    
printf("%d", p);
                    
if (1 < pn)
                    
{
                        
printf("^%d", pn);
                    
}
                    
printf(" * ");
                    
pn = 0;
                
}
                
p += inc;

                
//  [BUG]値のログ出力
                BUG_puts(BUG_VAL(p));

                
inc = 2;
            
}
            
else
            
{
                
current /= p;

                
//  [BUG]値のログ出力
                BUG_puts(BUG_VAL(current));

                
++pn;

                
//  [BUG]値のログ出力
                BUG_puts(BUG_VAL(pn));
            
}
        
}
        
printf("%d", p);
        
if (1 < pn)
        
{
            
printf("^%d", pn);
        
}
    
}
    
else
    
{
        
printf("%d", current);
    
}
    
printf("\n");
    
return;
}

//
//  スタートアップ
//
int main(int argc, char * args[])
{
    
//  [BUG]コンパイル情報のログ出力
    BUG_exec(bugbeard::bug_compile_info(BUG_LOG));

    
//  [BUG]コマンドライン引数のログ出力
    BUG_exec(bugbeard::bug_arg_info(BUG_LOG, argc, args));
    
    
for(int i = 1; i < argc; ++i)
    
{
        
factorize(atoi(args[i]));
    
}
    
    
return EXIT_SUCCESS;
}


/******************************************************************************
    □■□■                  Wraith the Trickster                  □■□■
    ■□■□ 〜I'll go with heaven's advantage and fool's wisdom.〜 ■□■□
******************************************************************************/

出力結果(./buglog/YYYY/MM/DD/bulklog.log)

./buglog/YYYY/MM/DD/bulklog.log なパスにファイルとして出力されることを除けば内容的には先の tsv.cpp によるログ出力とあまり変わり映えしないので割愛。

解説

このサンプルのコードでは日付別のディレクトリにログファイルを出力します。

#if defined(BUG_LOAD_BUGBEARD)
const bugbeard::bug_string bug_log_filename()
{
    
using namespace bugbeard;
    
const bug_clock stamp = bug_clock();
#if defined(__MWERKS__)
#error なんか Metrowerk のコンパイラはこのへんのコードの解釈の仕方が、びっくりするぐらいバカで付き合いきれません。(´Д`;)
#endif
    return
        
bug_dir("buglog")
        
+bug_dir("%4.4d", stamp.year)
        
+bug_dir("%2.2d", stamp.mon)
        
+bug_dir("%2.2d", stamp.mday)
        
+"bulklog.log";
}
#endif

//  標準エラーにツリー形式の出力を行うロガーの定義
BUG_define_logger(new bugbeard::bug_tree_logger(new bugbeard::bug_file_writer(bug_log_filename())));
bugbeard::bug_dir はディレクトリを自動で作成しつつパス文字列を形成するユーティリティです。

プロファイル&カバレッジ測定サンプル

サンプルコード

/******************************************************************************
    バグベアード -bugbeard-
        サンプル "profile.cpp" ソースファイル
                                            Coded by Wraith in Sep 16, 2008.
******************************************************************************/



///////////////////////////////////////////////////////////////////////////////
//
//  includes
//

#include <stdio.h>
#include <stdlib.h>


///////////////////////////////////////////////////////////////////////////////
//
//  [BUG]bugbeard
//

#if !defined(NDEBUG)
#define BUG_EVIL_CONTRACT       
//  "悪魔の契約"
#endif

#if defined(BUG_EVIL_CONTRACT)
#   define BUG_DEFINE_GLOBAL_LOGGER    new bugbeard::bug_tree_logger(new bugbeard::bug_file_writer("trace.log"))
                                //  "trace.log" へツリー形式の出力を行うロガーの定義
#   define BUG_DEFINE_GLOBAL_PROFILER  new bugbeard::bug_tsv_profiler(new bugbeard::bug_file_writer("profile.tsv"), new bugbeard::bug_file_writer("coverage.tsv"))
                                //  "profile.tsv" へプロファイル結果の出力を、"coverage.tsv" へカバレッジ測定結果の出力を行うプロファイルロガーの定義
#   define BUG_STATEMENT_HACK   //  ステートメントハックの設定
#   include "bug.h"             //  ステートメントハックを有効にする為、再度 include
#endif


///////////////////////////////////////////////////////////////////////////////
//
//  user codes
//

//
//  素因数分解
//
void factorize(int number)
{
    
printf("%d = ", number);
    
int current = number;
    
if (1 < current)
    
{
        
int p = 2;
        
int pn = 0;
        
int inc = 1;
        
while(1 < current)
        
{
            
if (current %p)
            
{
                
if (pn)
                
{
                    
printf("%d", p);
                    
if (1 < pn)
                    
{
                        
printf("^%d", pn);
                    
}
                    
printf(" * ");
                    
pn = 0;
                
}
                
p += inc;

                
//  [BUG]値のログ出力
                BUG_puts(BUG_VAL(p));

                
inc = 2;
            
}
            
else
            
{
                
current /= p;

                
//  [BUG]値のログ出力
                BUG_puts(BUG_VAL(current));

                
++pn;

                
//  [BUG]値のログ出力
                BUG_puts(BUG_VAL(pn));
            
}
        
}
        
printf("%d", p);
        
if (1 < pn)
        
{
            
printf("^%d", pn);
        
}
    
}
    
else
    
{
        
printf("%d", current);
    
}
    
printf("\n");
    
return;
}


//
//  スタートアップ
//
int main(int argc, char * args[])
{
    
for(int i = 1; i < argc; ++i)
    
{
        
factorize(atoi(args[i]));
    
}
    
    
return EXIT_SUCCESS;
}


/******************************************************************************
    □■□■                  Wraith the Trickster                  □■□■
    ■□■□ 〜I'll go with heaven's advantage and fool's wisdom.〜 ■□■□
******************************************************************************/

出力結果( trace.log )

┌──────────────────────────────────────
│日付&時刻:2008-09-17(水) 07:07:06.587
└─────┬────────────────────────────────
07:07:06.587├┬▽for #107
07:07:06.587│├┬▽if (1 < current) == true; #48
07:07:06.587││├・while (1 < current) == true; #53
07:07:06.587││├┬▽if (current %p) == false; #55
07:07:06.587│││├・current(0x0012E6F0) = 3(0x00000003) #79
07:07:06.587│││├・pn(0x0012E50C) = 1(0x00000001) #84
07:07:06.587│││└△if (current %p) == false; #55
07:07:06.587││├・while (1 < current) == true; #53
07:07:06.587││├┬▽if (current %p) == true; #55
07:07:06.587│││├┬▽if (pn) == true; #57
07:07:06.587││││├┬▽if (1 < pn) == false; #60
07:07:06.587│││││└△if (1 < pn) == false; #60
07:07:06.587││││└△if (pn) == true; #57
07:07:06.587│││├・p(0x0012E510) = 3(0x00000003) #70
07:07:06.587│││└△if (current %p) == true; #55
07:07:06.587││├・while (1 < current) == true; #53
07:07:06.587││├┬▽if (current %p) == false; #55
07:07:06.587│││├・current(0x0012E6F0) = 1(0x00000001) #79
07:07:06.587│││├・pn(0x0012E50C) = 1(0x00000001) #84
07:07:06.587│││└△if (current %p) == false; #55
07:07:06.587││├・while (1 < current) == false; #53
07:07:06.587││├┬▽if (1 < pn) == false; #88
07:07:06.587│││└△if (1 < pn) == false; #88
07:07:06.587││└△if (1 < current) == true; #48
07:07:06.587│├・return #98
07:07:06.587│└△for #107
07:07:06.587├・return #112
┌─────┴────────────────────────────────
│日付&時刻:2008-09-17(水) 07:07:06.587
└──────────────────────────────────────

出力結果( profile.tsv )

__FILE__	__LINE__	スコープ	合計総稼働時間	合計総バグ時間	合計総実働時間	合計自稼働時間	合計自バグ時間	合計自実働時間	合計子稼働時間	合計子バグ時間	合計子実働時間	コールカウント	平均総稼働時間	平均総バグ時間	平均総実働時間	平均自稼働時間	平均自バグ時間	平均自実働時間	平均子稼働時間	平均子バグ時間	平均子実働時間	最小スタンプ	最小総稼働時間	最小総バグ時間	最小総実働時間	最小自稼働時間	最小自バグ時間	最小自実働時間	最小子稼働時間	最小子バグ時間	最小子実働時間	最大スタンプ	最大総稼働時間	最大総バグ時間	最大総実働時間	最大自稼働時間	最大自バグ時間	最大自実働時間	最大子稼働時間	最大子バグ時間	最大子実働時間
@OVERALL_SCOPE	0	@OVERALL_SCOPE	0.003570	0.002757	0.003212	0.003570	0.000085	0.000000	0.001543	0.002672	0.003212	1	0.003570	0.002757	0.003212	0.003570	0.000085	0.000000	0.001543	0.002672	0.003212	@OVERALL_SCOPE	0.003570	0.002757	0.003212	0.003570	0.000085	0.000000	0.001543	0.002672	0.003212	@OVERALL_SCOPE	0.003570	0.002757	0.003212	0.003570	0.000085	0.000000	0.001543	0.002672	0.003212
profile.cpp	48	if (1 < current) == true;	0.001865	0.002458	0.001882	0.001865	0.000382	0.001482	0.000969	0.002075	0.000399	1	0.001865	0.002458	0.001882	0.001865	0.000382	0.001482	0.000969	0.002075	0.000399	07:07:06.587	0.001865	0.002458	0.001882	0.001865	0.000382	0.001482	0.000969	0.002075	0.000399	07:07:06.587	0.001865	0.002458	0.001882	0.001865	0.000382	0.001482	0.000969	0.002075	0.000399
profile.cpp	55	if (current %p) == false;	0.000539	0.000507	0.000031	0.000539	0.000507	0.000031	0.000000	0.000000	0.000000	2	0.000269	0.000253	0.000015	0.000269	0.000253	0.000015	0.000000	0.000000	0.000000	07:07:06.587	0.000173	0.000166	0.000006	0.000173	0.000166	0.000006	0.000000	0.000000	0.000000	07:07:06.587	0.000365	0.000341	0.000024	0.000365	0.000341	0.000024	0.000000	0.000000	0.000000
profile.cpp	55	if (current %p) == true;	0.000304	0.001444	0.000365	0.000304	0.000142	0.000162	0.001351	0.001302	0.000202	1	0.000304	0.001444	0.000365	0.000304	0.000142	0.000162	0.001351	0.001302	0.000202	07:07:06.587	0.000304	0.001444	0.000365	0.000304	0.000142	0.000162	0.001351	0.001302	0.000202	07:07:06.587	0.000304	0.001444	0.000365	0.000304	0.000142	0.000162	0.001351	0.001302	0.000202
profile.cpp	57	if (pn) == true;	0.001351	0.001302	0.000202	0.001351	0.001150	0.000200	0.000153	0.000151	0.000002	1	0.001351	0.001302	0.000202	0.001351	0.001150	0.000200	0.000153	0.000151	0.000002	07:07:06.587	0.001351	0.001302	0.000202	0.001351	0.001150	0.000200	0.000153	0.000151	0.000002	07:07:06.587	0.001351	0.001302	0.000202	0.001351	0.001150	0.000200	0.000153	0.000151	0.000002
profile.cpp	60	if (1 < pn) == false;	0.000153	0.000151	0.000002	0.000153	0.000151	0.000002	0.000000	0.000000	0.000000	1	0.000153	0.000151	0.000002	0.000153	0.000151	0.000002	0.000000	0.000000	0.000000	07:07:06.587	0.000153	0.000151	0.000002	0.000153	0.000151	0.000002	0.000000	0.000000	0.000000	07:07:06.587	0.000153	0.000151	0.000002	0.000153	0.000151	0.000002	0.000000	0.000000	0.000000
profile.cpp	88	if (1 < pn) == false;	0.000125	0.000123	0.000002	0.000125	0.000123	0.000002	0.000000	0.000000	0.000000	1	0.000125	0.000123	0.000002	0.000125	0.000123	0.000002	0.000000	0.000000	0.000000	07:07:06.587	0.000125	0.000123	0.000002	0.000125	0.000123	0.000002	0.000000	0.000000	0.000000	07:07:06.587	0.000125	0.000123	0.000002	0.000125	0.000123	0.000002	0.000000	0.000000	0.000000
profile.cpp	107	for	0.001543	0.002672	0.003212	0.001543	0.000213	0.001330	0.001865	0.002458	0.001882	1	0.001543	0.002672	0.003212	0.001543	0.000213	0.001330	0.001865	0.002458	0.001882	07:07:06.587	0.001543	0.002672	0.003212	0.001543	0.000213	0.001330	0.001865	0.002458	0.001882	07:07:06.587	0.001543	0.002672	0.003212	0.001543	0.000213	0.001330	0.001865	0.002458	0.001882
Wraith the Trickster

タブ区切りテキストなんで普通にテキスト表示しただけだとカラムがずれた状態で表示されます。MS-Excel のシートに貼り付けるなり、その他のデータ形式に変換するなりしてご利用ください。 各項目の意味についてはリファレンスを参照してください。

このデータを元にプログラムの高速化を図る場合は、"合計自実働時間"順にソートし最も"合計自実働時間"が大きなスコープから高速化を検討するとよいでしょう。またその際には"最大スタンプ"や"最小スタンプ"を手がかりに、どういったフローの時に時間がかかって逆にどういったフローの時に時間がかかっていないのか参考にするのとよいでしょう。

このプロファイルデータにはどうしても測定誤差というものがあることにご留意ください。特にコールカウントが大きなスコープの合計時間に関しては積み重なりにより誤差が大きくなる傾向があります。

出力結果( coverage.tsv )

__FILE__	__LINE__	スコープ	コールカウント
profile.cpp	48	if (1 < current) == false;	0
profile.cpp	48	if (1 < current) == true;	1
profile.cpp	55	if (current %p) == false;	2
profile.cpp	55	if (current %p) == true;	1
profile.cpp	57	if (pn) == false;	0
profile.cpp	57	if (pn) == true;	1
profile.cpp	60	if (1 < pn) == false;	1
profile.cpp	60	if (1 < pn) == true;	0
profile.cpp	88	if (1 < pn) == false;	1
profile.cpp	88	if (1 < pn) == true;	0
Wraith the Trickster

タブ区切りテキストなんで普通にテキスト表示しただけだとカラムがずれた状態で表示されます。MS-Excel のシートに貼り付けるなり、その他のデータ形式に変換するなりしてご利用ください。

プロファイルのデータと異なり if スコープだけが抽出され、且つ if の条件式が true あるいは false のどちらか片方しかしか実行されなかった if スコープの実行されなかった側をコールカウントが 0 のデータとして挿入します。

解説

このサンプルのコードでは以下の指定により、プロファイルおよびカバレッジの測定結果をそれぞれ "profile.tsv" および "coverage.tsv" に出力します。(+メインのログを "trace.log" に出力します。 )

#if !defined(NDEBUG)
#define BUG_EVIL_CONTRACT       
//  "悪魔の契約"
#endif

#if defined(BUG_EVIL_CONTRACT)
#   define BUG_DEFINE_GLOBAL_LOGGER    new bugbeard::bug_tree_logger(new bugbeard::bug_file_writer("trace.log"))
                                //  "trace.log" へツリー形式の出力を行うロガーの定義
#   define BUG_DEFINE_GLOBAL_PROFILER  new bugbeard::bug_tsv_profiler(new bugbeard::bug_file_writer("profile.tsv"), new bugbeard::bug_file_writer("coverage.tsv"))
                                //  "profile.tsv" へプロファイル結果の出力を、"coverage.tsv" へカバレッジ測定結果の出力を行うプロファイルロガーの定義
#   define BUG_STATEMENT_HACK   //  ステートメントハックの設定
#   include "bug.h"             //  ステートメントハックを有効にする為、再度 include
#endif
...このサンプルではプロファイルおよびカバレッジの測定結果を両方とも出力していますが、どちらか片方のみ出力させることも可能です。その場合は出力させたくないほうのライターとして NULL を指定してください。

尚、マルチスレッドの場合はスレッド毎に定義する必要があります。マルチスレッドでのプロファイラの使い方は基本的にロガーと同じですので *_logger と *_profiler という名称の違いはありますが、 .tsv形式ログ出力&マルチスレッドサンプル を参考してください。

リファレンス

ステートメントハックによってマクロ置換されるステートメント

ステートメントスコープ補足
if形成するif ステートメントの条件判定結果(bool値)もログに出力します。
while形成しないwhile ステートメントの条件判定結果(bool値)もログに出力します。
switch形成するswitch ステートメントの条件判定結果(int値)もログに出力します。
goto形成しない
break形成しない
continue形成しない
return形成しない『return func();』のような形の場合、極力『func()』の呼び出しが終了した時点でログを出力するようにしていますが、コンパイラ及びのバージョン等によっては必ずしもはそうなっていないので注意してください。
do形成する
for形成する
try形成する
throw形成する『throw func();』のような形の場合、極力『func()』の呼び出しが終了した時点でログを出力するようにしていますが、コンパイラ及びのバージョン等によっては必ずしもはそうなっていないので注意してください。
new形成する
delete形成する

マクロ

指示マクロ

マクロ説明
BUG_DISABLE_BUGBEARDこのマクロが定義されいる場合、バグベアードはロードされず、"悪魔の契約"も不要です。
BUG_EVIL_CONTRACTバグベアードを利用するには"悪魔の契約"をよく読んでその意味を理解した上でこのマクロを定義してください。
BUG_STATEMENT_HACKバグベアードの真骨頂であるステートメントハックを有効にするにはこのマクロを定義した上で bug.h をインクルードしてください。逆に一度有効にしたステートメントハックをソースコードの途中から無効したい場合はこのマクロの定義を解除(#undef)した上で再度 bug.h をインクルードしてください。
cf. ステートメントハックによってマクロ置換されるステートメント
BUG_USE_CHARchar型をバグベアードで使用する文字型として指定する場合にこのマクロを定義してください。このマクロも BUG_USE_WCHAR もともに定義されていない場合で且つ、UNICODE マクロおよび _UNICODE マクロが定義されていない場合、このマクロは自動で定義されます。
BUG_USE_WCHARwchar_t型をバグベアードで使用する文字型として指定する場合にこのマクロを定義してください。このマクロも BUG_USE_CHAR もともに定義されていない場合で且つ、UNICODE マクロもしくは _UNICODE マクロが定義されていた場合、このマクロは自動で定義されます。
BUG_SINGLE_PROCESSシングルプロセスで動作するプログラム上でバグベアードを利用する場合、このマクロを定義してください。このマクロも BUG_MULTI_PROCESS マクロもともに定義されていない場合、このマクロは自動で定義されます。
BUG_MULTI_PROCESSマルチプロセスで動作するプログラム上でバグベアードを利用する場合、このマクロを定義してください。
BUG_SINGLE_THREADシングルスレッドで動作するプログラム上でバグベアードを利用する場合、このマクロを定義してください。このマクロも BUG_MULTI_THREAD マクロもとも定義されていない場合で且つ、_MT マクロおよび __MT__ マクロが定義されていない場合、このマクロは自動で定義されます。
BUG_MULTI_THREADマルチスレッドで動作するプログラム上でバグベアードでバグベアードを利用する場合、このマクロを定義してください。このマクロも、BUG_SINGLE_THREAD マクロも定義されていない場合で且つ、_MT マクロもしくは __MT__ マクロが定義されていた場合、このマクロは自動で定義されます。
BUG_THREAD_LOCAL_STORAGEバグベアードに処理系由来のスレッドローカルストレージ機能を使用させる場合、このマクロでスレッドローカルストレージであることを示す為の型への修飾を指定してください。指定例は bug.h 内のコメントを参照してください。
BUG_WITHOUT_LOCATION_INFOこのマクロが定義されているとロケーション情報(__FILE__,__LINE__,及び関数名)をログ出力しません。
BUG_MASK_SOURCECODEこのマクロが定義されているとステートメントハックによるログ出力中の条件式が "..." に置き換えられます。
BUG_FUNCTION_NAME__function__ のような関数名を取得する組み込みマクロを利用できる処理系で、関数名をログに出力させた場合にこのマクロでその処理系が持つ関数名取得用組み込みマクロを指定してください。このマクロが定義されていない場合でも処理系によってはこのマクロは自動で定義されます。
BUG_NO_FUNCTION_NAMEBUG_FUNCTION_NAME マクロが自動で定義される処理系で、関数名をログに出力させたく場合はこのマクロを定義することで BUG_FUNCTION_NAME マクロの自動定義を抑止できます。
BUG_DISABLED_PSAPIWindows で利用する際にお使いのコンパイル環境で PSAPI が利用できない場合は、このマクロを定義してください。このマクロが定義されると bug_enum_module_version_info() の実装が抑止されます。
BUG_DEFINE_GLOBAL_LOGGERこのマクロはシンタックスシュガー的なもので、このマクロでグローバルなロガーの定義を指定おくとバグベアードのヘッダーファイル内でロガーの定義が行われます。このマクロを利用することでロガーを定義する際にバグベアードのヘッダーファイルを2度インクルードすることを回避できます。使用例は プロファイル&カバレッジ測定サンプル を参照してください。
BUG_DEFINE_GLOBAL_PROFILERこのマクロはシンタックスシュガー的なもので、このマクロでグローバルなプロファイラの定義を指定おくとバグベアードのヘッダーファイル内でプロファイラの定義が行われます。このマクロを利用することでプロファイラを定義する際にバグベアードのヘッダーファイルを2度インクルードすることを回避できます。使用例は プロファイル&カバレッジ測定サンプル を参照してください。
BUG_WITHOUT_TSV_LOG_HEADERこのマクロが定義されていると .tsv ログのヘッダー行を出力しなくなります。
BUG_WITHOUT_TSV_PROFILE_HEADERこのマクロが定義されていると .tsv プロファイルデータのヘッダー行を出力しなくなります。
BUG_WITHOUT_TSV_COVERAGE_HEADERこのマクロが定義されていると .tsv カバレッジデータのヘッダー行を出力しなくなります。

フラグマクロ

マクロ説明
BUGBEARD_BUG_Hbug.h の所謂インクルードガードに相当するマクロです。ただし、一般的なインクルードガードはそのヘッダファイル全体が多重に展開されることを防ぐ作りなっていますが、bug.h は BUG_STATEMENT_HACK マクロの定義状態を変更しながら複数回インクルードされること想定した作りとなっており、ステートメントハック関連のマクロ定義/解除がインクルードガードの対象になっていません。
BUG_LOAD_BUGBEARDBUG_DISABLE_BUGBEARD マクロが定義されずに bug.h がインクルードされたことにより、バグベアードがロードされている場合に定義されます。BUG_* な命名のマクロは全てバグベアードがロードされていない時にはきえさりますが、その他のコードでバグベアードがロードされていない時に消し去りたい場合はそのコードを #if defined(BUG_LOAD_BUGBEARD) 〜 #endif で囲んでください。
BUG_MS_WINDOWSWindows環境でバグベアードがロードされている場合に定義されます。

機能マクロ

マクロ説明
BUG_define_loggerロガーを定義するのに使用します。マルチスレッドの場合、各スレッド毎に定義する必要があります。
BUG_puts 指定されたテキストをログ出力します。このマクロは標準関数の puts と同じくただ与えられた文字列を出力するだけで printf のような書式機能はありません。書式を利用したい場合は BUG_FORM を利用してください。
    BUG_puts("このロリコンどもめ!");
BUG_VAL 指定された変数・オブジェクトの内容をその名前とともに文字列に変換します。BUG_puts マクロと組み合わせて変数・オブジェクトをログ出力するのに使用します。
    BUG_puts(BUG_VAL(speech));
BUG_FORM printfと同様の引数をとり、文字列を返します。
    BUG_puts(BUG_FORM("%s", "このロリコンどもめ!"));
BUG_execバグベアードがロードされている場合にのみ引数部のコードが有効になります。
BUG_scope指定されたテキストをスコープログ出力します。
BUG_CHAR_TYPE バグベアード使用される文字型を示します。Windows プログラミングでの TCHAR に相当し、BUG_USE_CHAR マクロが定義されていれば char 型を BUG_USE_WCHAR マクロが定義されていれば wchar_t 型を示します。
    const BUG_CHAR_TYPE *speech = BUG_T("このロリコンどもめ!");
BUG_API_TBUG_USE_CHAR/BUG_USE_WCHAR マクロにあわせて Windows API を修飾し ANSI 版と UNICODE 版の切り替えを用意にします。
BUG_T BUG_USE_CHAR/BUG_USE_WCHAR マクロにあわせて文字および文字列の型を修飾します。このマクロは Windows プログラミングでの _T/TEXT マクロに相当します。
    BUG_puts(BUG_T("たまにはロリコンもいいよね!"));
BUG_LOGカレントスレッドに関連づけられているロガーを取得します。
BUG_MSGログ出力される元テキストにロケーション情報を付加します。ユーザプログラミングにおいてこのマクロは通常意識する必要はありません。
BUG_COMPILER_NAMEコンパイルに使用したコンパイラの名前です。
BUG_COMPILER_VERSION_NUMBERコンパイルに使用したコンパイラのバージョン番号(数値)です。
BUG_COMPILER_VERSIONコンパイルに使用したコンパイラのバージョン情報(文字列)です。

名前空間

namespace説明
bugbeardバグベアードの各種型や関数等は一部の例外を除き全てこの名前空間で定義されます。
bugbeard::bug_termバグベアードで使用される文字列定数(全てではない)がこの名前空間で定義されます。

typedef

定義説明
bug_charBUG_CHAR_TYPEバグベアードで使用される文字型です。
bug_stringstd::basic_string<bug_char>バグベアードで使用される文字列型です。
bug_formbug_form_ex<>printf書式で文字列を作成するのに使用されるクラスです。BUG_FORM マクロはこのクラスに置換されます。
bug_sint64_typeint64_tバグベアードで使用される int64_t 。stdint.h を持たない VC++ の為に存在します。
bug_uint64_typeuint64_tバグベアードで使用される uint64_t 。stdint.h を持たない VC++ の為に存在します。

class

utilities
クラス名説明
bug_form_exprintf書式による文字列作成機能を提供します。
bug_clock現在時刻情報を提供します。
bug_dull_dirbug_dirの無能版(ディレクトリを作成しない)。
bug_dirファイルパス文字列の構築とともにディレクトリ作成を行うユーティリティクラス。
bug_mutex汎用ミューテックスクラス。
bug_lock自動ロッククラス。
bug_smart_ptr_ref_cnt内包用リファレンスカウンタ。
bug_smart_ptr_share外付け用リファレンスカウンタ。
bug_smart_ptrスマートポインタ。
bug_thread_local_storageスレッドローカルストレージ。
bug_OSVERSIONINFOWindowsバージョン情報クラス。
writer
このクラス群はバグベアードによるログの出力先を指定するのに使用されます。
クラス名説明
bug_writerライター基本クラス。このクラスはインターフェイスを提供する為の抽象クラスなので直接は利用できません。
bug_file_writer_base指定されたファイルポインタ(FILE*)に対して書き込みを行うライター。
bug_file_writer指定されたファイルパスに対して書き込みを行うライター。Windows 環境下では bug_handle_writer の派生型として実装され、その他の環境下では bug_file_writer_base の派生型として実装されます。なお、Windows環境では UNICODE/_UNICODE マクロや BUG_USE_CHAR/BUG_USE_WCHAR マクロに関係なく常に MBCS および UNICODE でファイルパスを指定できます。
bug_stream_writer指定されたストリーム(std::otream)に対して書き込みを行うライター。
bug_fstream_writer指定されたファイルパスに対して書き込みを行うライター。bug_file_writerとは異なり名前の通り std::ofstream ベースの実装。
bug_handle_writer指定されたハンドルに対して書き込みを行うライター。Windows専用。
bug_OutputDebugString_writerOutputDebugString()を利用するライター。Windows専用。
stamp
このクラス群はバグベアードによるログ中のタイムスタンプの種類・形式を指定するのに使用されます。
クラス名説明
bug_stampタイムスタンプ基本クラス。このクラスはインターフェイスを提供する為の抽象クラスなので直接は利用できません。
bug_counter_stampカウンタ型タイムスタンプ。形式:%d
bug_hex_counter_stamp16進表記のカウンタ型タイムスタンプ。形式:0x%08.8X
bug_clock_stamp時刻型タイムスタンプ。形式:%2.2d:%2.2d:%2.2d
bug_clock_stamp_with_date日付付き時刻型タイムスタンプ。形式:%4.4d-%2.2d-%2.2d(%s) %2.2d:%2.2d:%2.2d
bug_short_clock_stampショート時刻型タイムスタンプ。形式:%2.2d%2.2d%2.2d
bug_short_clock_stamp_with_date日付付きショート時刻型タイムスタンプ。形式:%4.4d%2.2d%2.2d%2.2:%2.2d%2.2d
bug_clock_stamp_ex精細時刻型タイムスタンプ。形式:%2.2d:%2.2d:%2.2d.%3.3d
bug_clock_stamp_ex_with_date日付付き精細時刻型タイムスタンプ。形式:%4.4d-%2.2d-%2.2d(%s) %2.2d:%2.2d:%2.2d.%3.3d
bug_clock_stamp_ex2高精細時刻型タイムスタンプ。形式:%2.2d:%2.2d:%2.2d.%6.6d
bug_clock_stamp_ex2_with_date日付付き高精細時刻型タイムスタンプ。形式:%4.4d-%2.2d-%2.2d(%s) %2.2d:%2.2d:%2.2d.%6.6d
bug_GetTickCount_stampGetTickCount型タイムスタンプ。Windows専用。形式:%08.8X
bug_QueryPerformanceCounter_stampQueryPerformanceCounter型タイムスタンプ(RAW)。Windows専用。形式:%08.8X%08.8X
bug_QueryPerformanceSecond_stampQueryPerformanceCounter型タイムスタンプ(秒+マイクロ秒)。Windows専用。形式:%7d.%06.6d
message
クラス名説明
bug_messageロケーション情報(__FILE__ 及び __LINE__)とログ出力するテキストを保持します。
profile time
クラス名説明
bug_profile_time_type高精度時間型。
bug_profile_time_setbug_profile_time_type で、稼働時間、バグ時間、実働時間を保持します。
bug_profile_time_scorebug_profile_time_set で、自スコープと子スコープの時間を保持します。
bug_profile_time_score_set特定のスコープに関する全プロファイルデータを保持します。
bug_bug_time_scopeその生存期間でバグベアードによるオーバーヘッド(バグ時間)を測定します。
bug_profile_scopeその生存期間でスコープの稼働時間を測定します。
logger
クラス名説明
bug_loggerロガー基本クラス。このクラスは主にインターフェイスを提供する為の抽象クラスなので直接は利用できません。
bug_tsv_logger.tsv(タブ区切り)形式のログを出力します。
bug_tree_loggerツリー形式のログを出力します。
bug_compact_tree_logger圧縮ツリー形式のログを出力します。ツリー部分が bug_tree_logger の約1/6に圧縮されます。
profiler
クラス名説明
bug_profilerプロファイラー基本クラス。このクラスはプロファイルデータを保持しますが、出力する機能を持ち合わせいないので直接指定しても意味がありません。このクラスの代わりに bug_tsv_profiler を指定してください。
bug_tsv_profiler.tsv(タブ区切り)形式でプロファイルおよびカバレッジ測定結果を出力します。

関数

関数名説明
bug_binary_prefix符号なし64ビット値を二進接頭辞で修飾した文字列(bug_string型)に変換します。bug_binary_prefix(39029211136, BUG_T("Byte")) で呼び出すと "36.3GiByte(39029211136)" のような文字列が返ります。第二引数は省略可。
bug_hex_encode与えられたバイナリデータをHEXエンコードされた文字列(bug_string型)に変換します。
bug_encode_value各種データを文字列(bug_string型)に変換します。BUG_VALマクロで呼び出される bug_encode() はこの bug_encode_value() を利用して各種データを文字列に変換します。その他なデータ型は bug_hex_encode() で HEX エンコードされます。独自のデータ型を HEX エンコード以外の形でログに残したい場合は自前でこの bug_encode_value() のオーバーロードを定義してください。
bug_encodeBUG_VALマクロ用の本体関数で、BUG_VALマクロで指定された変数の「名前」、「アドレス」、「内容」をひとつの文字列(bug_string型)にまとめます。
bug_run_string第一引数で指定された数だけ第二引数で指定された文字列を繰り返した文字列(bug_string型)を返します。
bug_get_win32_err_msgAWin32APIのエラーコード(GetLastError())に対応するエラーメッセージ(std::string型)を返します。Windows専用。
bug_get_win32_err_msgWWin32APIのエラーコード(GetLastError())に対応するエラーメッセージ(std::wstring型)を返します。Windows専用。
bug_get_winverWindows のバージョン+エディション表記(bug_string型)を返します。Windows専用。
ex. "Microsoft Windows Vista Business Edition, 32-bit"
bug_compile_infoコンパイルを行った日時、コンパイルに使用したコンパイラの名称およびバージョンを第一引数で指定されたロガーを使って出力します。
bug_arg_infomain()関数の引数の内容を第一引数で指定されたロガーを使って出力します。
bug_windows_version_infoWindowsのバージョン情報を第一引数で指定されたロガーを使って出力します。Windows専用。
bug_module_version_info第二引数で指定された実行形式ファイル(*.exe;*.dll)のバージョン情報を第一引数で指定されたロガーを使って出力します。Windows専用。
bug_enum_module_version_infoカレントプロセスがロードしている全てのモジュール(*.exe;*.dll)のバージョン情報を第一引数で指定されたロガーを使って出力します。Windows専用。
bug_memory_infoシステム全体のメモリの使用状況を第一引数で指定されたロガーを使って出力します。Windows専用。
bug_drive_info第二引数で指定されたドライブの情報を第一引数で指定されたロガーを使って出力します。Windows専用。
bug_enum_drive_info全てのドライブの情報を第一引数で指定されたロガーを使って出力します。Windows専用。
bug_MonitorEnumProc第二引数で指定されたモニターの情報を第一引数で指定されたロガーを使って出力します。Windows専用。
bug_enum_monitor_info全てのモニターの情報を第一引数で指定されたロガーを使って出力します。Windows専用。
bug_enum_display_info全てのディスプレイの情報を第一引数で指定されたロガーを使って出力します。Windows専用。
bug_env第二引数で指定された環境変数の内容を第一引数で指定されたロガーを使って出力します。Windows専用。
bug_enum_env全ての環境変数の内容を第一引数で指定されたロガーを使って出力します。Windows専用。
bug_windows_system_infoWin32APIの GetSystemInfo() で得られた情報を第一引数で指定されたロガーを使って出力します。Windows専用。
bug_file_hash第二引数で指定されたファイルのハッシュ値を第一引数で指定されたロガーを使って出力します。デフォルトではMD5が使用されますが第三引数+第四引数でその他のハッシュ関数も指定できます。Windows専用。
bug_enum_module_hashカレントプロセスがロードしている全てのモジュール(*.exe;*.dll)のハッシュ値を第一引数で指定されたロガーを使って出力します。Windows専用。

プロファイルデータの項目

項目名説明
プロセスIDプロセスID。BUG_MULTI_PROCESS マクロが定義されている場合にのみ出力されます。
スレッドIDスレッドID。BUG_MULTI_THREAD マクロが定義されている場合にのみ出力されます。
__FILE__ファイル名。オーバーオールスコープでは "@OVERALL_SCOPE" となります。
__LINE__行番号。オーバーオールスコープでは 0 となります。
__function__関数名。BUG_FUNCTION_NAME マクロが定義されている場合にのみ出力されます。オーバーオールスコープでは "@OVERALL_SCOPE" となります。
スコープスコープ。オーバーオールスコープでは "@OVERALL_SCOPE" となります。
合計総稼働時間そのスコープ自身とその内包するスコープの実行に要した全ての時間の合計。合計総稼働時間=(合計総バグ時間+合計総実働時間)=(合計自稼働時間+合計子稼働時間)=SUM(総稼働時間)。
合計総バグ時間そのスコープ自身とその内包するスコープの測定の為に要した全てのオーバーヘッドの合計。合計総バグ時間=(合計自バグ時間+合計子バグ時間)=SUM(総バグ時間)。
合計総実働時間そのスコープ自身とその内包するスコープの実行に要した全ての時間から測定の為のオーバーヘッドを差し引いた時間の合計。合計総実働時間=(合計自実働時間+合計子実働時間)=SUM(総実働時間)。
合計自稼働時間そのスコープ自身の実行に要した全ての時間の合計(内包するスコープの時間は除く)。合計自稼働時間=(合計自バグ時間+合計自実働時間)=SUM(自実働時間)。
合計自バグ時間そのスコープ自身の測定の為に要した全ての時間の合計(内包するスコープの時間は除く)。合計自バグ時間=SUM(自バグ時間)。
合計自実働時間そのスコープ自身の実行に要した全ての時間から測定の為のオーバーヘッドを差し引いた時間の合計(内包するスコープの時間は除く)。合計自実働時間=SUM(自実働時間)。
合計子稼働時間その内包するスコープの実行に要した全ての時間の合計。合計子稼働時間=(合計子バグ時間+合計子実働時間)=SUM(子実働時間)。
合計子バグ時間その内包するスコープの測定の為に要した全ての時間の合計。合計子バグ時間=SUM(子バグ時間)。
合計子実働時間その内包するスコープの実行に要した全ての時間から測定の為のオーバーヘッドを差し引いた時間の合計。合計子実働時間=SUM(子実働時間)。
コールカウントそのスコープが実行された回数。
平均総稼働時間そのスコープ自身とその内包するスコープの実行に要した全ての時間の平均。平均総稼働時間=(合計総稼働時間÷コールカウント)=(平均総バグ時間+平均総実働時間)=(平均自稼働時間+平均子稼働時間)
平均総バグ時間そのスコープ自身とその内包するスコープの測定の為に要した全てのオーバーヘッドの平均。平均総バグ時間=(合計総バグ時間÷コールカウント)=(平均自バグ時間+平均子バグ時間)。
平均総実働時間そのスコープ自身とその内包するスコープの実行に要した全ての時間から測定の為のオーバーヘッドを差し引いた時間の平均。平均総実働時間=(合計総実働時間÷コールカウント)=(平均自実働時間+平均子実働時間)。
平均自稼働時間そのスコープ自身の実行に要した全ての時間の平均(内包するスコープの時間は除く)。平均自稼働時間=(合計自稼働時間÷コールカウント)=(平均自バグ時間+平均自実働時間)。
平均自バグ時間そのスコープ自身の測定の為に要した全ての時間の平均(内包するスコープの時間は除く)。平均自バグ時間=(合計自バグ時間÷コールカウント)。
平均自実働時間その内包するスコープの実行に要した全ての時間の平均。平均子稼働時間=(合計子稼働時間÷コールカウント)=(平均子バグ時間+平均子実働時間)。
平均子稼働時間その内包するスコープの実行に要した全ての時間の平均。平均子稼働時間=(合計子稼働時間÷コールカウント)=(平均子バグ時間+平均子実働時間)。
平均子バグ時間その内包するスコープの測定の為に要した全ての時間の平均。平均子バグ時間=(合計子バグ時間÷コールカウント)。
平均子実働時間その内包するスコープの実行に要した全ての時間から測定の為のオーバーヘッドを差し引いた時間の平均。平均子実働時間=(合計子実働時間÷コールカウント)。
最小スタンプ総実働時間が最小となった時のそのスコープのロガー上でのスタンプ。
最小総稼働時間総実働時間が最小となった時のそのスコープ自身とその内包するスコープの実行に要した全ての時間。最小総稼働時間=(最小総バグ時間+最小総実働時間)=(最小自稼働時間+最小子稼働時間)
最小総バグ時間総実働時間が最小となった時のそのスコープ自身とその内包するスコープの測定の為に要した全てのオーバーヘッド。最小総バグ時間=(最小自バグ時間+最小子バグ時間)。
最小総実働時間そのスコープ自身とその内包するスコープの実行に要した全ての時間から測定の為のオーバーヘッドを差し引いた時間の最小値。最小総実働時間=(最小自実働時間+最小子実働時間)。
最小自稼働時間総実働時間が最小となった時のそのスコープ自身の実行に要した全ての時間(内包するスコープの時間は除く)。最小自稼働時間=(最小自バグ時間+最小自実働時間)。
最小自バグ時間総実働時間が最小となった時のそのスコープ自身の測定の為に要した全ての時間(内包するスコープの時間は除く)。
最小自実働時間総実働時間が最小となった時のその内包するスコープの実行に要した全ての時間。最小子稼働時間=(最小子バグ時間+最小子実働時間)。
最小子稼働時間総実働時間が最小となった時のその内包するスコープの実行に要した全ての時間。最小子稼働時間=(最小子バグ時間+最小子実働時間)。
最小子バグ時間総実働時間が最小となった時のその内包するスコープの測定の為に要した全ての時間。
最小子実働時間総実働時間が最小となった時のその内包するスコープの実行に要した全ての時間から測定の為のオーバーヘッドを差し引いた時間。
最大スタンプ総実働時間が最大となった時のそのスコープのロガー上でのスタンプ。
最大総稼働時間総実働時間が最大となった時のそのスコープ自身とその内包するスコープの実行に要した全ての時間。最大総稼働時間=(最大総バグ時間+最大総実働時間)=(最大自稼働時間+最大子稼働時間)
最大総バグ時間総実働時間が最大となった時のそのスコープ自身とその内包するスコープの測定の為に要した全てのオーバーヘッド。最大総バグ時間=(最大自バグ時間+最大子バグ時間)。
最大総実働時間そのスコープ自身とその内包するスコープの実行に要した全ての時間から測定の為のオーバーヘッドを差し引いた時間の最大値。最大総実働時間=(最大自実働時間+最大子実働時間)。
最大自稼働時間総実働時間が最大となった時のそのスコープ自身の実行に要した全ての時間(内包するスコープの時間は除く)。最大自稼働時間=(最大自バグ時間+最大自実働時間)。
最大自バグ時間総実働時間が最大となった時のそのスコープ自身の測定の為に要した全ての時間(内包するスコープの時間は除く)。
最大自実働時間総実働時間が最大となった時のその内包するスコープの実行に要した全ての時間。最大子稼働時間=(最大子バグ時間+最大子実働時間)。
最大子稼働時間総実働時間が最大となった時のその内包するスコープの実行に要した全ての時間。最大子稼働時間=(最大子バグ時間+最大子実働時間)。
最大子バグ時間総実働時間が最大となった時のその内包するスコープの測定の為に要した全ての時間。
最大子実働時間総実働時間が最大となった時のその内包するスコープの実行に要した全ての時間から測定の為のオーバーヘッドを差し引いた時間。
Wraith the Trickster

「総=自+子」及び「稼働=バグ+実働」なんだと理解して頂ければ後はそれの応用です。

ダウンロード

バグベアード本体 サンプルコード アイコン 全ファイルパック

バグベアード入門

2009-12-12 に行われたBoost.勉強会で発表したバグベアード入門の ustream へのリンクと発表資料です。

links