{"id":19724014,"url":"https://github.com/wraith13/bugbeard","last_synced_at":"2025-10-23T14:43:22.965Z","repository":{"id":83857394,"uuid":"159627450","full_name":"wraith13/bugbeard","owner":"wraith13","description":"Trace and profiling for C++ via single header file.","archived":false,"fork":false,"pushed_at":"2018-12-13T06:38:57.000Z","size":659,"stargazers_count":10,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-05T20:03:24.461Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsl-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wraith13.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE_1_0.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-11-29T07:44:36.000Z","updated_at":"2024-06-21T06:27:34.000Z","dependencies_parsed_at":null,"dependency_job_id":"6d16ecb4-3915-4ce9-a267-35a0893c2b72","html_url":"https://github.com/wraith13/bugbeard","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wraith13%2Fbugbeard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wraith13%2Fbugbeard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wraith13%2Fbugbeard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wraith13%2Fbugbeard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wraith13","download_url":"https://codeload.github.com/wraith13/bugbeard/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251593008,"owners_count":21614455,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-11T23:24:13.881Z","updated_at":"2025-10-23T14:43:22.882Z","avatar_url":"https://github.com/wraith13.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# バグベアード -bugbeard-\n\n⚠ この README は編集中です\n\n## about バグベアード -bugbeard-\n\n![バグベアード -bugbeard-](resource/bugbeard48.png)\n\n簡潔かつ乱暴に説明すると、このモジュールは `printf` デバッギングを簡単且つゴージャスに行う為のものです。\n\nバグベアードは C++ プログラマの目となり、その膨大なログで大半のバグを丸裸にします。\n\n- [ライセンス情報](LICENSE_1_0.txt)\n- 最終更新日:2011-03-21\n\n\u003e 2008-02-24 \"Coming soon...\" などと謳いつつ５年近くほったらかしにしてましたが、ついに正式版のリリースです。\n\u003e 作者が言うのなんですが、このモジュールは非常に強力且つ凶悪です。ご利用いただければあなたの C++ プログラミングにおけるデバッグシーンに劇的な変化をもたらすであろうことお約束します。\n\n2008-02-25 `inline` 指定が抜けてて複数のコンパイル単位から利用するとリンク時にシンボルが衝突する問題を修正。\n\n2008-03-10 以下の点を修正。\n\n- 悪魔の契約\" に「順序不安定」を追記。\n- `bug_compact_tree_logger` の追加。\n- インクルードの `\u003csys\\timeb.h\u003e` のパスを `\u003csys/timeb.h\u003e` に修正。\n- 命名規則的に明らかにおかしいところ一部修正\n  - `BUG_SINT64_TYPE` → `bug_sint64_type`\n  - `BUG_UINT64_TYPE` → `bug_uint64_type`\n  - `BUG_OutputDebugString_writer` → `bug_OutputDebugString_writer`\n  - `BUG_get_winver` → `bug_get_winver`\n  - `run_string` → `bug_run_string`\n  - `bug_short_clock_stamp_sx_with_date` → `bug_short_clock_stamp_with_date`\n- `bug_uni_logger` を削除。( 既にその役目は `bug_thread_local_storage` に取って代わられているので。)\n\n2008-04-01 以下の点を修正。\n\n- `BUG_MASK_SOURCECODE` の追加。\n- \"悪魔の契約\" の「構文の制限」に \"例外仕様構文\" に関する記述を追記。\n\n2008-06-05 以下の点を修正。\n\n- VC でバグベアード適用時に過剰となる警告を抑止する為に `#pragma warning(disable:1011)` を追加。\n- `bug_thread_local_storage::init()` に `base_type::set_target_storage()` を含める。\n- g++ のバージョンによってはコンパイルエラーの原因になるので `PTHREAD_MUTEX_INITIALIZER` の使用を中止。( `pthread_mutex_init()` による初期化を行っているので元々不要な指定。 )\n- 現時点のバグベアードでは不要だが対称性の観点から bug_unlock クラスを追加。\n- ロケーション情報の除去オプション(`BUG_WITHOUT_LOCATION_INFO`)を追加。\n- `switch` の値が出力されないバグの解決。\n\n2008-09-23 以下の点を修正。\n\n- プロファイル対応\n- カバレッジ対応\n- プロファイル＆カバレッジのサンプルコードを追加。\n- `bug_tsv_logger` でヘッダー行を出力するように修正。\n- ヘッダー行の出力を抑止する指定マクロ(`BUG_WITHOUT_TSV_LOG_HEADER`, `BUG_WITHOUT_TSV_PROFILE_HEADER`, `BUG_WITHOUT_TSV_COVERAGE_HEADER`)の追加。\n- `BUG_DISABLED_PSAPI` 指示マクロの追加( このマクロが定義されると `bug_enum_module_version_info()` の実装を行わない )。\n- `QueryPerformance()` の結果を秒＋マイクロ秒単位へ変換して表示を行う `bug_QueryPerformanceSecond_stamp` の追加。\n- `OSVERSIONINFOEX` まわりで `WINVER` の判定が精確でなかった箇所の修正。\n- `bug_logger::stamp` を `private` に変更し、`bug_logger::get_new_stamp()`, `bug_logger::get_last_stamp()` を追加。\n- `bug_drive_info()` の出力に sectors-per-cluster と bytes-per-sector を追加。\n- `BUG_DEFINE_GLOBAL_LOGGER` と `BUG_DEFINE_GLOBAL_PROFILER` の追加。\n- `bug_windows_system_info()` の追加。\n- `bug_file_hash()` を追加。\n- `bug_enum_module_hash()` を追加。\n- `bug_logger::get_instance()` の追加および `BUG_LOG` マクロの修正(ただのリファクタリング)。\n- `bug_logger::get_process_id()` および `bug_logger::get_thread_id()` をクラスの外に出しに `bug_get_process_id()` および `bug_get_thread_id()` に変更(ただのリファクタリング)。\n- 不必要な `#include \u003cvector\u003e` を削除。\n- `#pragma warning(disable:1011)` は VC じゃなくて Intel ででる警告なので icc に限定。\n\n2008-11-01 以下の点を修正。\n\n- プロファイル＆カバレッジ測定サンプル中の `bug_tsv_profile_logger` を `bug_tsv_profiler` に訂正。(間違っていたのはこのページ中の表記のみで、ダウンロード用の同サンプルのファイルは元から正しい記述である `bug_tsv_profiler` になっています。)\n\n2010-02-14 以下の点を修正。\n\n- `#include \u003csys\\stat.h\u003e` を `#include \u003csys/stat.h\u003e` に修正。([ご指摘](http://twitter.com/graighle/status/6722927223)、感謝)\n- 一部 `BUT_T()` が使用されていなかった箇所に `BUT_T()` を適用。([ご指摘](http://twitter.com/USAGI_WRP/status/6680888390)、感謝)\n- `bug_get_winver()` を Windows 7 などにも対応した最新の状態に更新。\n- [Boost.勉強会](http://atnd.org/events/1839)で発表した[バグベアード入門の ustream へのリンクと発表資料](#primer)の追加。\n\n2011-03-21 ステートメントハックを一度有効化した後、無効化できなくなっていた問題を修正\n    \n## contents\n\n- [about バグベアード -bugbeard-](#about)\n- [why バグベアード？](#why)\n- [ログ出力サンプル](#sample)\n- [使用方法](#how-to-use)\n- [\"悪魔の契約\" -EVIL CONTRACT-](#evil-contract)\n- [サンプルコード](#tutorial)\n    - [\"Hello, Bugbeard!\"](#step1)\n    - [Windows用情報収集サンプル](#step2)\n    - [.tsv形式ログ出力＆マルチスレッドサンプル](#step3)\n    - [バルクログ出力サンプル](#step4)\n    - [プロファイル＆カバレッジ測定サンプル](#step5)\n    - [リファレンス](#reference)\n        - [ステートメントハックによってマクロ置換されるステートメント](#statements)\n        - [マクロ](#macros)\n        - [名前空間](#namespace)\n        - [型](#types)\n        - [関数](#functions)\n        - [プロファイルデータの項目](#profile-columns)\n- [ダウンロード](#download)\n- [バグベアード入門](#primer)\n- [links](#links)\n    \n## why バグベアード？\n\nなぜ、ビ○ルダーでもゲイザーでもスズキドゲザエモンでもアスコモイドでもスカイラインでもなくバグベアードなのか？　それはもちろん \"不具合\"という意味と \"盗聴器\" という意味を持つ \"bug\" をその名に含むからです。って、そーじゃなくて、なぜ、デバッガじゃなく良識あるプログラマには一般的に悪しき事とされる printf デバッギング用ロガーであるバグベアドなのか？　ということについて少々説明しておきます。\n\n最初に断っておきますが、「バグベアードがあればデバッガは不要」などと言うつもりもありませんし、情報収集のアスペクトが直交する(※)関係になるのでむしろデバッギングツールとしては相補する関係になると考えます。\n\n\u003e ※ある瞬間のシステム全体の情報...いわば空間に対して強いデバッガと、時間に対して強いバグベアードはその情報収集のアスペクトが直交します。\n\nデバッガにはデバッギングの為のツールとしてはあまり頂けない次のような問題があります。\n\n\u003cDL\u003e\n\u003cDT\u003e見ようとしたものしか見えない。\u003c/DT\u003e\n\u003cDD\u003e\nデバッガによるデバッグでは一般的にプログラマ自身が見ようとした情報しか得られません。プログラマが見ようとした情報の直近であからさまにおかしい挙動があってもプログラマにはそれが伝わらないのです。これでは目隠しされて手探りしているようなものです。\n多くの場合、デバッガを利用してのデバッグではバグの原因を突き止めるに足る決定的なポイントを捕らえる必要があるにも関わらず、そのポイントを捕らえる為の情報はこのような手探りで積み重ねていかねばなりません。\n\u003c/DD\u003e\n\n\u003cDT\u003e処理の流れを把握しづらい。\u003c/DT\u003e\n\u003cDD\u003e\nデバッガにはステップ実行や逆実行などの機能もありますが、それでもデバッガでは常にある特定の瞬間のデータしか扱えず、これではなかなか処理の流れを把握できません。\nこの為、ステップ実行をやってる最中に明らかにおかしい分岐に入ってもそれがその時に注意を傾けているポイントでなければうっかり見過ごしてしまうのも無理のないことです。\nまた、処理の流れが可視化されていない為、デバッガでは正常な場合の処理の流れと異常な場合の処理の流れの比較に困難がつきまといます。\n\u003c/DD\u003e\n\n\u003cDT\u003eエンドユーザ環境では無力。\u003c/DT\u003e\n\u003cDD\u003e\n特定のエンドユーザ環境でしか再現しないバグというのは普通によくある話であるにも関わらずデバッガはこの種の再現条件を抱えるバグに対して全く無力です。\n\u003c/DD\u003e\n\u003c/DL\u003e\n\n他のも問題はあるでしょうがこれらの問題に対しバグベアードでは次のようになります。\n\n\u003cDL\u003e\n\u003cDT\u003e見ようとしたもの以外の情報も見える。\u003c/DT\u003e\n\u003cDD\u003e\n裏を返せば見たくもないものを見せられたり肝心な情報がその他の情報に埋もれてしまうリスクもあるわけですが、バグベアードでは意識して見ようとした以外の情報も見える為、バグの痕跡を発見しやすくなります。\n\u003c/DD\u003e\n\n\u003cDT\u003e処理の流れを把握しやすい。\u003c/DT\u003e\n\u003cDD\u003e\n特にツリー形式のログでは処理の流れを把握しやすく、テキストデータの形になっているので正常の場合の処理の流れと異常な場合の処理の流れの比較も容易です。\n\u003c/DD\u003e\n\n\u003cDT\u003eエンドユーザ環境でも利用可能。\u003c/DT\u003e\n\u003cDD\u003e\nエンドユーザにログ上のソースコード断片を見られてしまったり、膨大なログをどうやってエンドユーザに送り返してもらうのかで困ったりすることはあるかもしれませんが、エンドユーザ環境であってもバグベアードは利用できます。\n\u003c/DD\u003e\n\u003c/DL\u003e\n\nまたバグベアードを利用すればソースコード修正後の動作確認もステップ実行の代わりにただ実行してログを確認するだけで済ませるというお手軽なスタイルを採用することもできます。\n\nバグベアード固有の問題についても以下に挙げておきます。\n\n\u003cDL\u003e\n\u003cDT\u003eログがでかすぎ。\u003c/DT\u003e\n\u003cDD\u003e\n『とにかくログでかすぎ。時間あたりのログ出力量が動画ファイルを余裕で上回るとかね、もう馬鹿？って感じ。』\n『エンドユーザ環境でも利用可能？こんなでかいログどうやってユーザから送ってもらうのよ？』\n...とでも言いたくなるようなログ出力量になり、バグベアードを利用してのデバッグはバグの原因を特定する為に必要なほんの数行を見つけ出す為に数十万行のログを追いかけるようなものとなります。\nそのログのサイズは時には数百万行あるいは数千万行以上の非常に膨大なサイズに達することでしょう。\nバグベアードは昨今のPCの強力なパワーがあって初めて実用的なデバッグの手段となり得ます。\n\u003c/DD\u003e\n\n\u003cDT\u003eソースコード漏洩\u003c/DT\u003e\n\u003cDD\u003e\n断片的ではあるのですが相当量のソースコードがログに含まれます。\nエンドユーザ環境などでテストしてもらった際にソースコードが漏洩するリスクを考慮する必要があります。\n\u003c/DD\u003e\n\n\u003cDT\u003eバグベアードをロードしていると実行形式ファイルが馬鹿でかくなる。\u003c/DT\u003e\n\u003cDD\u003e\nログの膨大さに比べれば全然カワイイものですが、バグベアードをロードしていると実行形式ファイルが馬鹿でかくなります。\n大きすぎてメールの添付ファイルで送れなくて困るといったこともあるかもしれません。\n\u003c/DD\u003e\n\n\u003c/DL\u003e\n\n\u003e バグベアードにより出力されたログを追跡してデバッグする際は高速な検索ができるビューア(テキストエディタ)を使用することを強く推奨します。\n\u003e バグベアードが出力するログは非常に膨大になりますので検索性能の差が残酷なまでに現れます。\n\u003e 例えば、約200MBのログの末尾に現れる文字列を [Notepad++](http://notepad-plus.sourceforge.net/uk/site.htm) で検索したところ約 3 分 30 秒もかかってしまいましたが、同じ環境下で[サクラエディタ](http://sakura-editor.sourceforge.net/)で検索すれば 2 秒もかかりませんでした。その性能差は実に100倍以上にすら及びます。\n    \n    \n## ログ出力サンプル\n\n```txt\n┌──────────────────────────────────────\n│日付＆時刻：2008-02-24(日) 23:26:11.874\n└─────┬────────────────────────────────\n23:26:11.874├┬▽if (1 \u003c current) == true; \u0026lt;tree.cpp\u0026gt;#104\n23:26:11.874│├・while (1 \u003c current) == true; \u0026lt;tree.cpp\u0026gt;#109\n23:26:11.874│├┬▽if (current %p) == true; \u0026lt;tree.cpp\u0026gt;#111\n23:26:11.874││├┬▽if (pn) == false; \u0026lt;tree.cpp\u0026gt;#113\n23:26:11.874│││└△if (pn) == false; \u0026lt;tree.cpp\u0026gt;#113\n23:26:11.874││├・p(0x00D8FC5C) = 3(0x00000003) \u0026lt;tree.cpp\u0026gt;#126\n23:26:11.874││└△if (current %p) == true; \u0026lt;tree.cpp\u0026gt;#111\n23:26:11.874│├・while (1 \u003c current) == true; \u0026lt;tree.cpp\u0026gt;#109\n23:26:11.874│├┬▽if (current %p) == true; \u0026lt;tree.cpp\u0026gt;#111\n23:26:11.874││├┬▽if (pn) == false; \u0026lt;tree.cpp\u0026gt;#113\n23:26:11.874│││└△if (pn) == false; \u0026lt;tree.cpp\u0026gt;#113\n23:26:11.874││├・p(0x00D8FC5C) = 5(0x00000005) \u0026lt;tree.cpp\u0026gt;#126\n23:26:11.874││└△if (current %p) == true; \u0026lt;tree.cpp\u0026gt;#111\n23:26:11.874│├・while (1 \u003c current) == true; \u0026lt;tree.cpp\u0026gt;#109\n23:26:11.874│├┬▽if (current %p) == true; \u0026lt;tree.cpp\u0026gt;#111\n23:26:11.874││├┬▽if (pn) == false; \u0026lt;tree.cpp\u0026gt;#113\n23:26:11.874│││└△if (pn) == false; \u0026lt;tree.cpp\u0026gt;#113\n```\n    \n## 使用方法\n\nいくつかのマクロを適宜定義し、bug.h をしかるべき場所で include しコンパイルするだけです。詳細についてはこのページの情報に一通り目を通してください。\n    \n## \"悪魔の契約\" -EVIL CONTRACT-\n\n邪道な技術により構築されたバグベアードは邪悪で忌むべき存在です。\nまたバグベアードの肝であるステートメントハックにより、さながらナノマシンの如くバグベアードのコードはユーザプログラムを隅々まで侵食します。\n故にバグベアードの利用にあたっては以下のような注意が必要となります。\n\n\u003cDL\u003e\n\n\u003cA name=\"illegal\"\u003e\u003c/A\u003e\n\u003cDT\u003e規格違反\u003c/DT\u003e\n\u003cDD\u003e\nバグベアードは「ステートメントのマクロでの置換」という最上級の規格違反を犯しています。\nこれによりバグベアードを利用したプログラムはあらゆる C++ コンパイラでの動作保証は得られなくなります。\nただし、これはバグベアードの「ステートメントハック」が有効になっている場合の話であり、バグベアードがロードされていない状態を含め「ステートメントハック」が無効になっている場合はその限りではありません。\nそして通常、リリース版のプログラムではバグベアードをロードしないことをオススメします。\n\u003c/DD\u003e\n\n\u003cA name=\"stain-error-info\"\u003e\u003c/A\u003e\n\u003cDT\u003eエラー情報の侵食\u003c/DT\u003e\n\u003cDD\u003e\nユーザプログラムを隅々まで侵食するバグベアードのログ出力コードの影響により、エラー情報(Win32API の GetLastError()で得られるエラーコードやグローバル変数に保持されるC/C++標準ライブラリのエラーコード)が上書きされてしまう可能性があります。\n前項と同様にこれはバグベアードをロードしている状態でのみ発生しうる問題であり、バグベアードをロードしていない状態であればこの問題は発生しません。\n\u003c/DD\u003e\n\n\u003cA name=\"restrict-statement\"\u003e\u003c/A\u003e\n\u003cDT\u003e構文の制限\u003c/DT\u003e\n\u003cDD\u003e\nバグベアードのステートメントハックの実装の都合より...\n\n```c++\nif (int i = func) ...\nswitch(int i = func) ...\nwhile(int i = func) ...\n```\n\n...のような形でステートメントに属する丸カッコで囲まれた箇所で変数を定義することができません。また...\n\n```c++\nvoid func(...) throw(...);\n```\n\n...のような例外仕様構文が一切使えません。\nただし、 `for` ステートメントに関してはこの例外となり `for(int i = 0;...` などとしても問題ありません。\nまた、そもそもステートメントハックを適用しない箇所ではこの制限はありません。\n\u003c/DD\u003e\n\n\u003cA name=\"unstable-work\"\u003e\u003c/A\u003e\n\u003cDT\u003e動作不安定\u003c/DT\u003e\n\u003cDD\u003e\nバグベアードはオブジェクトの破棄のタイミングや `operator` や `template` 等がコンパイラによって意図通りに適用されるかどうかに強く依存する為、こちらで動作確認を行っていないコンパイラではあまり意図通りに機能することを期待できませんし、動作確認を行っているコンパイラでもバージョンによっては意図通りに機能しないかもしれません。\n\u003c/DD\u003e\n\n\u003cA name=\"unstable-log\"\u003e\u003c/A\u003e\n\u003cDT\u003e出力ログの変形\u003c/DT\u003e\n\u003cDD\u003e\n前項と同じく、バグベアードはオブジェクトの破棄のタイミングや `operator` や `template` 等がコンパイラによって意図通りに適用されるかどうかに強く依存する為、必ずしもは理想的な形でログを出力できない為に同じソースからコンパイルされたプログラムの出力ログがコンパイラ及びそのバージョンの違いにより変形してしまうことがあります。\n具体的には `return` ステートメントのログ出力は `return fucn();` のような場合、`func()` 関数の呼び出しが終了した段階で `return` ステートメントのログを出力するのが理想的ですが、そのような形で実装できない処理系では `func();` 関数の呼び出しの前に `return` ステートメントのログ出力が行われます。\nまた別の例では `switch` ステートメントに対してはスコープ扱いでログを出力するのが理想的ですが、そのように実装できない処理系では `switch` ステートメントがスコープ扱いされません。\n\u003c/DD\u003e\n\n\u003cA name=\"increase-warning\"\u003e\u003c/A\u003e\n\u003cDT\u003e過剰な警告(ある意味、真っ当な警告)\u003c/DT\u003e\n\u003cDD\u003e\nバグベアードをロードしてコンパイルを行うとバグベアードを利用していなければ表示されることはないような警告が過剰に表示されることがあります。\nこれは通常、無視して構いません。\nただし、バグベアードをロードしていない時に表示される警告は通常通りに対処してください。\n\u003c/DD\u003e\n\n\u003cA name=\"unstable-sequence\"\u003e\u003c/A\u003e\n\u003cDT\u003e順序不安定\u003c/DT\u003e\n\u003cDD\u003e\nシングルプロセス×シングルスレッドでバグベアードを利用する場合は関係ない話ですが、マルチプロセスもしくはマルチスレッドでバグベアードを利用する場合、複数のプロセス/スレッドの各種処理のログは必ずしもそれらの処理が実行された順番とそのログ出力結果の順番が一致しないことがあります。\nこれはログに記録が残る処理が実行されてから実際にそのログ出力が行われるまでに一定時間ではないタイムラグがある為です。\nもちろんこれは異なるプロセス・スレッド間での話であり、同一プロセス・スレッド上の処理が実行された順番とそのログ出力結果の順番は必ず一致します。\n\u003c/DD\u003e\n\n\u003c/DL\u003e\n\nこれらを踏まえてなお、悪魔の契約を締結するならばその意思表明として `BUG_EVIL_CONTRACT` `マクロを定義してください。BUG_EVIL_CONTRACT` はユーザプログラム全体に非常に強力な影響を及ぼすバグベアードのセーフティを解除する為のマクロです。\n契約締結の暁にはバグベアードはさまざまな恩恵と災いをあなたにもたらすでしょう。\n\n## バグベアードをご利用に当たってのヒント\n\n\u003cDL\u003e\n\u003cDT\u003eバグがあった場所のログ出力の為の埋め込みは消さない。\u003c/DT\u003e\n\u003cDD\u003e\n一度、なんらかのバグ追跡の為に埋め込んだログ出力用コードは基本的には全てソースコード上に残しておくことをオススメします。\n実際にバグがあった箇所の埋め込みについては特に強くオススメします。\nというのもバグというのは一度直したつもりでも修正が十分でなく完全に直ってなかったり、別のバグを埋め込んでしまったりというのもよくある話です。\nまた、バグというのは特定箇所に集中する傾向もあります。\nこの為、その時目的としていたバグの直しが完了した後も、バグ追跡の為に埋め込んだログ出力用コードは全てソースコード上に残しておくことをオススメします。\nログ出力量が過剰になってしまう場合は条件ディレクティブを使って必要な時以外は無効にしておくのがよいでしょう。\n\u003c/DD\u003e\n\n\u003cDT\u003e三項演算子のかわりに `if` を使用する。\u003c/DT\u003e\n\u003cDD\u003e\n通常であればむしろ三項演算子が適用できる場面であれば `if` の使用を控えるといったことが推奨されるかもしれませんが、あえて if を使用することで、バグベアード(のステートメントハック)で条件の判定結果を簡単にログに残せます。\n\u003c/DD\u003e\n\n\u003cDT\u003e明記が不要な場合でも `return` を記述する。\u003c/DT\u003e\n\u003cDD\u003e\n戻り型が `void` の関数やコンストラクタ、デストラクタでも return を記述しておくとその分ログ出力が増え、バグ追跡に役立ちます。\n\u003c/DD\u003e\n\n\u003cDT\u003eフィルタ機能を利用する。\u003c/DT\u003e\n\u003cDD\u003e\nマルチプロセス及びマルチスレッドによるログ出力を同じファイル等に対して行うと、特に tree 形式でのログ出力は追跡中のログが他のプロセス及び他のスレッドによる出力とごちゃ混ぜになって追跡し辛くなることがありますが、その場合は適宜そのログの表示に使ってるエディタもしくはビューアが有するフィルタ機能を使い、プロセスIDやスレッドIDで表示を絞り込むとよいでしょう。\n\u003c/DD\u003e\n\n\u003cDT\u003eデバッグ以外での利用。\u003c/DT\u003e\n\u003cDD\u003e\nバグベアードには環境および処理系にあまり依存せずに使えるスマートポインタ、スレッドローカルストレージ、ミューテックス等々さまざま機能を内包していますのでちょっとしたプログラムでそれらの機能を利用するのもよいでしょう。\n\u003c/DD\u003e\n\n\u003cDT\u003eExcel を *.tsv ログのビューアとして使用する場合は Excel2007 以降で。\u003c/DT\u003e\n\u003cDD\u003e\nExcel2003 以前では 65,536 行までしか扱えない為、極小規模なプログラムのログならどうにかなるかもしれませんが、かなり厳しいです。\nExcel2007 以降であれば、1,048,576行まで扱えます。\n...それでもプログラムによっては全然足りないでしょうが。\n\u003c/DD\u003e\n\u003c/DL\u003e\n\n\n## サンプルコード\n\n- [\"Hello, Bugbeard!\"](#step1)\n- [Windows用情報収集サンプル](#step2)\n- [.tsv形式ログ出力＆マルチスレッドサンプル](#step3)\n- [バルクログ出力サンプル](#step4)\n- [プロファイル＆カバレッジ測定サンプル](#step5)\n            \n\u003cA name=\"step1\"\u003e\u003c/A\u003e\n### \"Hello, Bugbeard!\"\n\n#### サンプルコード\n\n```c++\n/******************************************************************************\n    バグベアード -bugbeard-\n        サンプル \"simple.cpp\" ソースファイル\n                                            Coded by Wraith in Feb 18, 2007.\n*****************************************************************************/\n\n\n///////////////////////////////////////////////////////////////////////////////\n//\n//  includes\n//\n\n#include \u003cstdio.h\u003e\n#include \u003cstdlib.h\u003e\n\n\n///////////////////////////////////////////////////////////////////////////////\n//\n//  [BUG]bugbeard\n//\n\n#if defined(NDEBUG)\n#define BUG_DISABLE_BUGBEARD    //  リリース版ではバグベアードをロードしない\n#endif\n\n#define BUG_EVIL_CONTRACT       //  \"悪魔の契約\"\n#include \"bug.h\"                //  ロガーを定義する為にステートメントハックを有効にしない状態で include\n\n//  標準エラーにツリー形式の出力を行うロガーの定義\nBUG_define_logger(new bugbeard::bug_tree_logger(new bugbeard::bug_file_writer_base(stderr)));\n\n#define BUG_STATEMENT_HACK      //  ステートメントハックの設定\n#include \"bug.h\"                //  ステートメントハックを有効にする為、再度 include\n\n\n///////////////////////////////////////////////////////////////////////////////\n//\n//  user codes\n//\n\nint main(int argc, char args[])\n{\n    argc, args;                 //  警告除け\n\n    //  [BUG]固定メッセージをログ出力\n    BUG_puts(\"Hello, Bugbeard!\");\n    \n    //  [BUG]コンパイル情報のログ出力\n    BUG_exec(bugbeard::bug_compile_info(BUG_LOG));\n\n    //  [BUG]コマンドライン引数のログ出力\n    BUG_exec(bugbeard::bug_arg_info(BUG_LOG, argc, args));\n    \n    //  [BUG]変数をログ出力\n    BUG_puts(BUG_VAL(args[0]));\n    \n    //  [BUG]書式付ログ出力\n    BUG_puts(BUG_FORM(\"このプログラムのファイル名：\"%s\"\", args[0]));\n    \n    return EXIT_SUCCESS;\n}\n\n\n/******************************************************************************\n    □■□■                  Wraith the Trickster                  □■□■\n    ■□■□ ～I'll go with heaven's advantage and fool's wisdom.～ ■□■□\n******************************************************************************/\n```\n\n#### 出力結果(標準エラー)\n\n```txt\n┌──────────────────────────────────────\n│日付＆時刻：2008-02-24(日) 18:06:13.739\n└─────┬────────────────────────────────\n18:06:13.743├・Hello, Bugbeard! \u0026lt;sample/simple.cpp\u0026gt;#46\n18:06:13.744├┬▽Compile Information \u0026lt;bug.h\u0026gt;#2839\n18:06:13.745│├・Compiler:Borland C++(0x0564) \u0026lt;bug.h\u0026gt;#2841\n18:06:13.745│├・Compile Date:Feb 24 2008 / Compile Time:18:06:11 \u0026lt;bug.h\u0026gt;#2843\n18:06:13.746│└△Compile Information \u0026lt;bug.h\u0026gt;#2839\n18:06:13.747├┬▽Commandline Argument Information \u0026lt;bug.h\u0026gt;#2849\n18:06:13.748│├・argc(0x0012F994) = 1(0x00000001) \u0026lt;bug.h\u0026gt;#2850\n18:06:13.749│├・args[0]:o:\\cxx\\bugbeard\\simple.exe \u0026lt;bug.h\u0026gt;#2853\n18:06:13.750│└△Commandline Argument Information \u0026lt;bug.h\u0026gt;#2849\n18:06:13.751├・args[0](0x00DE21C4) = \"o:\\cxx\\bugbeard\\simple.exe\" \u0026lt;sample/simple.cpp\u0026gt;#55\n18:06:13.752├・このプログラムのファイル名：\"o:\\cxx\\bugbeard\\simple.exe\" \u0026lt;sample/simple.cpp\u0026gt;#58\n18:06:13.753├・return \u0026lt;sample/simple.cpp\u0026gt;#60\n┌─────┴────────────────────────────────\n│日付＆時刻：2008-02-24(日) 18:06:13.754\n└──────────────────────────────────────\n```\n\n#### 解説\n\nこのサンプルでの一番の肝は...\n\n```c++\n///////////////////////////////////////////////////////////////////////////////\n//\n//  [BUG]bugbeard\n//\n\n#if defined(NDEBUG)\n#define BUG_DISABLE_BUGBEARD    //  リリース版ではバグベアードをロードしない\n#endif\n\n#define BUG_EVIL_CONTRACT       //  \"悪魔の契約\"\n#include \"bug.h\"                //  ロガーを定義する為にステートメントハックを有効にしない状態で include\n\n//  標準エラーにツリー形式の出力を行うロガーの定義\nBUG_define_logger(new bugbeard::bug_tree_logger(new bugbeard::bug_file_writer_base(stderr)));\n\n#define BUG_STATEMENT_HACK      //  ステートメントハックの設定\n#include \"bug.h\"                //  ステートメントハックを有効にする為、再度 include\n```\n\n...この部分ですが、まぁ、最初は所謂 \"おまじない\" の類だとでも思ってください。\n\n`BUG_define_logger()` の行によりログの出力形式等を指定しています。\n\n`NDEBUG` マクロが定義された場合の `assert()` マクロと同様に、`BUG_DISABLE_BUGBEARD` マクロが定義されると `BUG_*` な命名になっているコードは全て消え去ります。\n\nなお、Windowsではデフォルトで標準エラーがアスキーモードになっている為、改行コード `\"\\r\\n\"` が無駄に拡張され `\"\\r\\r\\n\"` になってしまうので標準エラーをファイルへリダイレクトすると不格好になります。Windowsでは `bugbeard::bug_file_writer` で直接ファイルに出力するか、`bugbeard::bug_OutputDebugString_writer` で `OutputDebugString()` で出力することを推奨します。\n\n\u003cA name=\"step2\"\u003e\u003c/A\u003e\n### Windows用情報収集サンプル\n\n#### サンプルコード\n\n```c++\n/******************************************************************************\n    バグベアード -bugbeard-\n        サンプル \"win.cpp\" ソースファイル\n                                            Coded by Wraith in Feb 18, 2007.\n******************************************************************************/\n\n\n///////////////////////////////////////////////////////////////////////////////\n//\n//  includes\n//\n\n#include \u003cstdio.h\u003e\n#include \u003cstdlib.h\u003e\n\n\n///////////////////////////////////////////////////////////////////////////////\n//\n//  [BUG]bugbeard\n//\n\n#if defined(NDEBUG)\n#define BUG_DISABLE_BUGBEARD    //  リリース版ではバグベアードをロードしない\n#endif\n\n#define BUG_EVIL_CONTRACT       //  \"悪魔の契約\"\n#include \"bug.h\"                //  ロガーを定義する為にステートメントハックを有効にしない状態で include\n\n//  OutputDebugString() でツリー形式の出力を行うロガーの定義\nBUG_define_logger(new bugbeard::bug_tree_logger(new bugbeard::bug_OutputDebugString_writer()));\n\n#define BUG_STATEMENT_HACK      //  ステートメントハックの設定\n#include \"bug.h\"                //  ステートメントハックを有効にする為、再度 include\n\n\n///////////////////////////////////////////////////////////////////////////////\n//\n//  user codes\n//\n\nint main(int argc, char *args[])\n{\n    argc, args;                 //  警告除け\n\n    puts(\"このサンプルでは Win32API の OutputDebugString() でログを出力しています。\");\n    puts(\"ご利用のIDEのデバッグ出力表示機能や [sysinternals の DebugView](http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx) などで出力内容を確認できます。\");\n    \n    //  [BUG]コンパイル情報のログ出力\n    BUG_exec(bugbeard::bug_compile_info(BUG_LOG));\n\n    //  [BUG]コマンドライン引数のログ出力\n    BUG_exec(bugbeard::bug_arg_info(BUG_LOG, argc, args));\n    \n    //  [BUG]Windowsバージョン情報のログ出力\n    BUG_exec(bugbeard::bug_windows_version_info(BUG_LOG));\n    \n    //  [BUG]Windowsシステム情報のログ出力\n    BUG_exec(bugbeard::bug_windows_system_info(BUG_LOG));\n    \n#if 0x0500 \u003c= WINVER\n    //  各種モジュールバージョン情報のログ出力\n    BUG_exec(bugbeard::bug_enum_module_version_info(BUG_LOG));\n#endif\n    \n#if 0x0500 \u003c= WINVER\n    //  各種モジュールハッシュ値のログ出力\n    BUG_exec(bugbeard::bug_enum_module_hash(BUG_LOG));\n#endif\n    \n#if 0x0500 \u003c= WINVER\n    //  [BUG]メモリ情報のログ出力\n    BUG_exec(bugbeard::bug_memory_info(BUG_LOG));\n#endif\n\n    //  [BUG]ドライブ情報のログ出力\n    BUG_exec(bugbeard::bug_enum_drive_info(BUG_LOG));\n\n#if 0x0500 \u003c= WINVER\n    //  [BUG]モニター情報のログ出力\n    BUG_exec(bugbeard::bug_enum_monitor_info(BUG_LOG));\n    //  [BUG]ディスプレイ情報のログ出力\n    BUG_exec(bugbeard::bug_enum_display_info(BUG_LOG));\n#endif\n\n    //  [BUG](全ての)環境変数情報のログ出力\n    BUG_exec(bugbeard::bug_enum_env(BUG_LOG));\n    \n    return EXIT_SUCCESS;\n}\n\n\n/******************************************************************************\n    □■□■                  Wraith the Trickster                  □■□■\n    ■□■□ ～I'll go with heaven's advantage and fool's wisdom.～ ■□■□\n******************************************************************************/\n```\n\n#### 出力結果(標準出力)\n\n```txt\nこのサンプルでは Win32API の OutputDebugString() でログを出力しています。\nご利用のIDEのデバッグ出力表示機能や [sysinternals の DebugView](http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx) などで出力内容を確認できます。\n```\n\n#### 出力結果(OutputDebugString())\n\n\u003e ※意図的に一部編集してます。\n\n```txt\n┌──────────────────────────────────────\n│日付＆時刻：2008-09-23(火) 22:06:59.771\n└─────┬────────────────────────────────\n22:06:59.772├┬▽Compile Information #4450\n22:06:59.772│├・Compiler:Borland C++(0x0564) #4452\n22:06:59.772│├・Compile Date:Sep 23 2008 / Compile Time:22:06:25 #4454\n22:06:59.772│└△Compile Information #4450\n22:06:59.772├┬▽Commandline Argument Information #4461\n22:06:59.772│├・argc(0x0012D500) = 1(0x00000001) #4462\n22:06:59.772│├・args[0]:O:\\cxx\\bugbeard\\work\\win.exe #4465\n22:06:59.772│└△Commandline Argument Information #4461\n22:06:59.773├┬▽Windows Version Information #4505\n22:06:59.773│├・Microsoft Windows Vista Business Edition, 32-bit #4508\n22:06:59.773│├・OSVERSIONINFO dwMajorVersion:6 / dwMinorVersion:0 / dwBuildNumber:6001 / dwPlatformId:2 / szCSDVersion:Service Pack 1 #4510\n22:06:59.773│├・OSVERSIONINFOEX wServicePackMajor:1 / wServicePackMinor:0 / wSuiteMask:256 / wProductType:1 / wReserved:30 #4514\n22:06:59.773│└△Windows Version Information #4505\n22:06:59.773├┬▽Windows System Information #4474\n22:06:59.773│├・wProcessorArchitecture:0 #4488\n22:06:59.773│├・wReserved:0 #4489\n22:06:59.773│├・dwPageSize:4096 #4490\n22:06:59.773│├・lpMinimumApplicationAddress:00010000 #4491\n22:06:59.773│├・lpMaximumApplicationAddress:7FFEFFFF #4492\n22:06:59.773│├・dwActiveProcessorMask:3 #4493\n22:06:59.773│├・dwNumberOfProcessors:2 #4494\n22:06:59.773│├・dwProcessorType:586 #4495\n22:06:59.773│├・dwAllocationGranularity:65536 #4496\n22:06:59.773│├・wProcessorLevel:6 #4497\n22:06:59.773│├・wProcessorRevision:3846 #4498\n22:06:59.773│└△Windows System Information #4474\n22:06:59.773├┬▽Module Version Information #4591\n22:06:59.773│├・module:\"O:\\cxx\\bugbeard\\work\\win.exe\" / no version information #4584\n22: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\n22: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\n22: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\n22: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\n22: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\n22: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\n22: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\n22: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\n22: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\n22: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\n22: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\n22: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\n22: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\n22:06:59.776│└△Module Version Information #4591\n22:06:59.776├┬▽Module Hash #4605\n22:06:59.789│├・file:\"O:\\cxx\\bugbeard\\work\\win.exe\" / hash(MD5):DA0A29DA42E371316446BFE64A528921 #4528\n22:06:59.792│├・file:\"C:\\Windows\\system32\\ntdll.dll\" / hash(MD5):172E1B9EB61167AD232291A6761501BF #4528\n22:06:59.796│├・file:\"C:\\Windows\\system32\\kernel32.dll\" / hash(MD5):DC2338093F91BA4E0512208E60206DDD #4528\n22:06:59.799│├・file:\"C:\\Windows\\system32\\ADVAPI32.DLL\" / hash(MD5):C44A1766E93E506EE2102A305799E1A1 #4528\n22:06:59.802│├・file:\"C:\\Windows\\system32\\RPCRT4.dll\" / hash(MD5):520CE99A9C1A3B14078BB39272424652 #4528\n22:06:59.802│├・file:\"C:\\Windows\\system32\\VERSION.DLL\" / hash(MD5):187D588F7A1A45DE48B8540401A90850 #4528\n22:06:59.805│├・file:\"C:\\Windows\\system32\\msvcrt.dll\" / hash(MD5):04CBEAA089B6A752B3EB660BEE8C4964 #4528\n22:06:59.808│├・file:\"C:\\Windows\\system32\\USER32.DLL\" / hash(MD5):B974D9F06DC7D1908E825DC201681269 #4528\n22:06:59.809│├・file:\"C:\\Windows\\system32\\GDI32.dll\" / hash(MD5):F77456EB036D834BFBC700EB2414879E #4528\n22:06:59.810│├・file:\"C:\\Windows\\system32\\PSAPI.DLL\" / hash(MD5):93A1732F7F997E36A5C3893539E2FF02 #4528\n22:06:59.811│├・file:\"C:\\Windows\\system32\\IMM32.DLL\" / hash(MD5):EC17194A193CD8E90D27CFB93DFA9A2E #4528\n22:06:59.814│├・file:\"C:\\Windows\\system32\\MSCTF.dll\" / hash(MD5):030981927E732FD4013910B3B06BD45B #4528\n22:06:59.815│├・file:\"C:\\Windows\\system32\\LPK.DLL\" / hash(MD5):DD496299B7351E16E602FC4299345A33 #4528\n22:06:59.817│├・file:\"C:\\Windows\\system32\\USP10.dll\" / hash(MD5):3122DAF86B33ED8AC4662D07593025D7 #4528\n22:06:59.817│└△Module Hash #4605\n22:06:59.817├┬▽Memory Information #4623\n22:06:59.817│├・load:61% #4628\n22:06:59.817│├・TotalPhys:2.98GiByte(3201634304) #4629\n22:06:59.817│├・AvailPhys:1.14GiByte(1222332416) #4630\n22:06:59.817│├・Used-Phys:1.84GiByte(1979301888) #4631\n22:06:59.817│├・TotalPageFile:6.16GiByte(6611963904) #4632\n22:06:59.817│├・AvailPageFile:1.14GiByte(1222332416) #4633\n22:06:59.817│├・Used-PageFile:5.02GiByte(5389631488) #4634\n22:06:59.817│├・TotalVirtual:2.00GiByte(2147352576) #4635\n22:06:59.817│├・AvailVirtual:1.14GiByte(1222332416) #4636\n22:06:59.817│├・Used-Virtual:882MiByte(925020160) #4637\n22:06:59.817│├・AvailExtendedVirtual:0Byte(0) #4638\n22:06:59.817│└△Memory Information #4623\n22:06:59.817├┬▽Drives Information #4752\n22: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\n22: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\n22: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\n22:06:59.819│├・drive:G / type:cdrom #4747\n22:06:59.831│├・drive:I / type:removable #4747\n22:06:59.842│├・drive:J / type:removable #4747\n22:06:59.854│├・drive:K / type:removable #4747\n22:06:59.866│├・drive:L / type:removable #4747\n22: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\n22: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\n22:06:59.866│└△Drives Information #4752\n22:06:59.866├┬▽Monitor Information #4793\n22:06:59.866│├・Monitor Rect:(0,0)-(1920,1200) / Work:(0,0)-(1920,1200) / Device:\\\\.\\DISPLAY1 #4786\n22:06:59.866│├・Monitor Rect:(1920,176)-(3200,1200) / Work:(1920,176)-(3200,1200) / Device:\\\\.\\DISPLAY2 #4786\n22:06:59.866│└△Monitor Information #4793\n22:06:59.866├┬▽Display Information #4851\n22:06:59.866│├・Display Name:\\\\.\\DISPLAY1 / Context:NVIDIA GeForce 8600 GTS #4867\n22:06:59.867│├・Display Name:\\\\.\\DISPLAY2 / Context:NVIDIA GeForce 8600 GTS #4867\n22:06:59.867│├・Display Name:\\\\.\\DISPLAYV1 / Context:RDPDD Chained DD #4867\n22:06:59.867│├・Display Name:\\\\.\\DISPLAYV2 / Context:RDP Encoder Mirror Driver #4867\n22:06:59.867│└△Display Information #4851\n22:06:59.867├┬▽All Environment Information #4838\n22:06:59.867│├・=::=::\\ #4842\n22:06:59.867│├・=C:=C:\\Users\\wraith #4842\n22:06:59.867│├・=ExitCode=00000000 #4842\n22:06:59.867│├・=O:=O:\\cxx\\bugbeard\\work #4842\n22:06:59.867│├・ALLUSERSPROFILE=C:\\ProgramData #4842\n22:06:59.867│├・APPDATA=C:\\Users\\wraith\\AppData\\Roaming #4842\n22:06:59.867│├・BDSCOMMONDIR=C:\\Users\\Public\\Documents\\RAD Studio\\5.0 #4842\n22:06:59.867│├・CLASSPATH=.;C:\\Program Files\\Java\\jre1.5.0_10\\lib\\ext\\QTJava.zip #4842\n22:06:59.867│├・CommonProgramFiles=C:\\Program Files\\Common Files #4842\n22:06:59.867│├・COMPUTERNAME=CRUISER #4842\n22:06:59.867│├・ComSpec=C:\\Windows\\system32\\cmd.exe #4842\n22:06:59.867│├・FP_NO_HOST_CHECK=NO #4842\n22:06:59.867│├・HOMEDRIVE=C: #4842\n22:06:59.867│├・HOMEPATH=\\Users\\wraith #4842\n22:06:59.867│├・LOCALAPPDATA=C:\\Users\\wraith\\AppData\\Local #4842\n22:06:59.867│├・LOGONSERVER=\\\\CRUISER #4842\n22:06:59.867│├・NUMBER_OF_PROCESSORS=2 #4842\n22:06:59.867│├・OS=Windows_NT #4842\n22:06:59.867│├・Path=************************************************************************************************************************* #4842\n22:06:59.867│├・PATHEXT=**************************************************** #4842\n22:06:59.867│├・PROCESSOR_ARCHITECTURE=x86 #4842\n22:06:59.867│├・PROCESSOR_IDENTIFIER=x86 Family 6 Model 15 Stepping 6, GenuineIntel #4842\n22:06:59.868│├・PROCESSOR_LEVEL=6 #4842\n22:06:59.868│├・PROCESSOR_REVISION=**** #4842\n22:06:59.868│├・ProgramData=C:\\ProgramData #4842\n22:06:59.868│├・ProgramFiles=C:\\Program Files #4842\n22:06:59.868│├・PROMPT=$P$G #4842\n22:06:59.868│├・PUBLIC=C:\\Users\\Public #4842\n22:06:59.868│├・QTJAVA=C:\\Program Files\\Java\\jre1.5.0_10\\lib\\ext\\QTJava.zip #4842\n22:06:59.868│├・SESSIONNAME=Console #4842\n22:06:59.868│├・solomoncmd=\"O:\\solomon\\bcc32\" win.cpp  #4842\n22:06:59.868│├・SystemDrive=C: #4842\n22:06:59.868│├・SystemRoot=C:\\Windows #4842\n22:06:59.868│├・TEMP=C:\\Users\\wraith\\AppData\\Local\\Temp #4842\n22:06:59.868│├・TMP=C:\\Users\\wraith\\AppData\\Local\\Temp #4842\n22:06:59.868│├・UGII_3DCONNEXION_LIBRARY=%UGII_BASE_DIR%\\ugalliance\\vendor\\startup\\3DxNX.dll #4842\n22:06:59.868│├・USERDOMAIN=cruiser #4842\n22:06:59.868│├・USERNAME=wraith #4842\n22:06:59.868│├・USERPROFILE=C:\\Users\\wraith #4842\n22:06:59.868│├・windir=C:\\Windows #4842\n22:06:59.868│└△All Environment Information #4838\n22:06:59.868├・return #88\n┌─────┴────────────────────────────────\n│日付＆時刻：2008-09-23(火) 22:06:59.868\n└──────────────────────────────────────\n```\n\n#### 解説\n\n```c++\n//  OutputDebugString() でツリー形式の出力を行うロガーの定義\nBUG_define_logger(new bugbeard::bug_tree_logger(new bugbeard::bug_OutputDebugString_writer()));\n```\n\n...この指定により標準エラーへの出力ではなく OutputDebugString() を使ってのログ出力を行っています。\n[DebugView](http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx) などでログ出力を確認できます。\n上のようなログ出力結果は一見、過剰に思えるかもしれませんが、バグベアードによって出力されるログは一般的に非常に膨大なものになり、この程度ハッキリ言って誤差の範囲ですから Windows でバグベアードを利用される場合...\n\n```c++\n    //  [BUG]コンパイル情報のログ出力\n    BUG_exec(bugbeard::bug_compile_info(BUG_LOG));\n\n    //  [BUG]コマンドライン引数のログ出力\n    BUG_exec(bugbeard::bug_arg_info(BUG_LOG, argc, args));\n    \n    //  [BUG]Windowsバージョン情報のログ出力\n    BUG_exec(bugbeard::bug_windows_version_info(BUG_LOG));\n    \n#if 0x0500 \u003c= WINVER\n    //  各種モジュールバージョン情報のログ出力\n    BUG_exec(bugbeard::bug_enum_module_version_info(BUG_LOG));\n#endif\n    \n#if 0x0500 \u003c= WINVER\n    //  [BUG]メモリ情報のログ出力\n    BUG_exec(bugbeard::bug_memory_info(BUG_LOG));\n#endif\n\n    //  [BUG]ドライブ情報のログ出力\n    BUG_exec(bugbeard::bug_enum_drive_info(BUG_LOG));\n\n#if 0x0500 \u003c= WINVER\n    //  [BUG]モニター情報のログ出力\n    BUG_exec(bugbeard::bug_enum_monitor_info(BUG_LOG));\n    //  [BUG]ディスプレイ情報のログ出力\n    BUG_exec(bugbeard::bug_enum_display_info(BUG_LOG));\n#endif\n\n    //  [BUG](全ての)環境変数情報のログ出力\n    BUG_exec(bugbeard::bug_enum_env(BUG_LOG));\n```\n\n...この部分のコードを丸々コピペして利用されることを強く推奨いたします。\n\n\u003cA name=\"step3\"\u003e\u003c/A\u003e\n### .tsv形式ログ出力＆マルチスレッドサンプル\n\n#### サンプルコード\n\n```c++\n/******************************************************************************\n    バグベアード -bugbeard-\n        サンプル \"tsv.cpp\" ソースファイル\n                                            Coded by Wraith in Feb 18, 2007.\n******************************************************************************/\n\n\n///////////////////////////////////////////////////////////////////////////////\n//\n//  includes\n//\n\n#include \u003cstdio.h\u003e\n#include \u003cstdlib.h\u003e\n#if defined(__GNUC__)\n#   include \u003cpthread.h\u003e\n#else\n#   include \u003cprocess.h\u003e\n#endif\n\n\n///////////////////////////////////////////////////////////////////////////////\n//\n//  [BUG]bugbeard\n//\n\n#if defined(NDEBUG)\n#define BUG_DISABLE_BUGBEARD    //  リリース版ではバグベアードをロードしない\n#endif\n\n#define BUG_EVIL_CONTRACT       //  \"悪魔の契約\"\n#define BUG_MULTI_THREAD        //  マルチスレッドモデルでバグベアードを利用\n#include \"bug.h\"                //  ロガーを定義する為にステートメントハックを有効にしない状態で include\n\n//  共用ライターの定義\nBUG_exec(bugbeard::bug_smart_writer common_writer(new bugbeard::bug_file_writer_base(stderr)));\n\n//  標準エラーにTSV形式の出力を行うロガーの定義(メインスレッド用)\nBUG_define_logger(new bugbeard::bug_tsv_logger(common_writer));\n\n#define BUG_STATEMENT_HACK      //  ステートメントハックの設定\n#include \"bug.h\"                //  ステートメントハックを有効にする為、再度 include\n\n\n///////////////////////////////////////////////////////////////////////////////\n//\n//  user codes\n//\n\n//\n//  thread\n//\n#if defined(BUG_MS_WINDOWS)\n#define BUG_THREAD_RESULT DWORD\n#define BUG_THREAD_CALL __stdcall\n#define BUG_THREAD_HANDLE HANDLE\n#else\n#define BUG_THREAD_RESULT void *\n#define BUG_THREAD_CALL\n#define BUG_THREAD_HANDLE pthread_t\n#endif\n\n//  スレッドの開始\nBUG_THREAD_HANDLE open_thread(BUG_THREAD_RESULT (BUG_THREAD_CALL *func)(void *), void *data)\n{\n#if defined(BUG_MS_WINDOWS)\n#   if defined(__BORLANDC__) || defined(__INTEL_COMPILER) || defined(_MSC_VER)\n    DWORD thread_id;\n    return (HANDLE)_beginthreadex(NULL, 0, (unsigned (__stdcall *)(void *))func, data, 0, (unsigned int *)\u0026thread_id);\n#   else\n    return CreateThread(NULL, 4096, func, data, 0, NULL);\n#   endif\n#else\n    BUG_THREAD_HANDLE handle;\n    pthread_create(\u0026handle, NULL, func, data);\n    return handle;\n#endif\n}\n\n//  スレッド終了まで待機\nvoid wait_and_close_thread(BUG_THREAD_HANDLE handle)\n{\n#if defined(BUG_MS_WINDOWS)\n    WaitForSingleObject(handle, INFINITE);\n    CloseHandle(handle);\n#else\n    pthread_join(handle, NULL);\n#endif\n}\n\n\n//\n//  素因数分解\n//\n#if defined(_MSC_VER) \u0026\u0026 1300 \u003c _MSC_VER\n#   pragma warning(disable:4996)\n#endif\nvoid factorize(int number)\n{\n    char buffer[256];\n    char * anchor = buffer;\n    anchor += sprintf(anchor, \"%d = \", number);\n    int current = number;\n    if (1 \u003c current)\n    {\n        int p = 2;\n        int pn = 0;\n        int inc = 1;\n        while(1 \u003c current)\n        {\n            if (current %p)\n            {\n                if (pn)\n                {\n                    anchor += sprintf(anchor, \"%d\", p);\n                    if (1 \u003c pn)\n                    {\n                        anchor += sprintf(anchor, \"^%d\", pn);\n                    }\n                    anchor += sprintf(anchor, \" * \");\n                    pn = 0;\n                }\n                p += inc;\n                \n                //  [BUG]値のログ出力\n                BUG_puts(BUG_VAL(p));\n                \n                inc = 2;\n            }\n            else\n            {\n                current /= p;\n                \n                //  [BUG]値のログ出力\n                BUG_puts(BUG_VAL(current));\n                \n                ++pn;\n                \n                //  [BUG]値のログ出力\n                BUG_puts(BUG_VAL(pn));\n            }\n        }\n        anchor += sprintf(anchor, \"%d\", p);\n        if (1 \u003c pn)\n        {\n            anchor += sprintf(anchor, \"^%d\", pn);\n        }\n    }\n    else\n    {\n        anchor += sprintf(anchor, \"%d\", current);\n    }\n    puts(buffer);\n    return;\n}\nBUG_THREAD_RESULT BUG_THREAD_CALL factorize_thread(void * data)\n{\n    //  [BUG]スレッドローカルロガーの定義\n    BUG_define_logger(new bugbeard::bug_tsv_logger(common_writer));\n    factorize((int)data);\n    return 0;\n}\n\n\n//\n//  スタートアップ\n//\nint main(int argc, char * args[])\n{\n    //  [BUG]コンパイル情報のログ出力\n    BUG_exec(bugbeard::bug_compile_info(BUG_LOG));\n\n    //  [BUG]コマンドライン引数のログ出力\n    BUG_exec(bugbeard::bug_arg_info(BUG_LOG, argc, args));\n\n    BUG_THREAD_HANDLE * thread_list = new BUG_THREAD_HANDLE[argc];\n    \n    //  スレッド起動\n    for(int i = 1; i \u003c argc; ++i)\n    {\n        thread_list[i] = open_thread(factorize_thread, (void *)atoi(args[i]));\n    }\n    //  スレッド待機\n    for(int i = 1; i \u003c argc; ++i)\n    {\n        wait_and_close_thread(thread_list[i]);\n    }\n    \n    delete []thread_list;\n    \n    return EXIT_SUCCESS;\n}\n\n\n/******************************************************************************\n    □■□■                  Wraith the Trickster                  □■□■\n    ■□■□ ～I'll go with heaven's advantage and fool's wisdom.～ ■□■□\n******************************************************************************/\n```\n\n#### 出力結果(標準出力)\n\n```txt\n101 = 101\n301 = 7 * 43\n201 = 3 * 67\n```\n\n#### 出力結果(標準エラー)\n\n```txt\n20:04:19.182\t540\t0\tbug.h\t2462\t▽bugbeard session root\n20:04:19.183\t540\t1\tbug.h\t2463\t日付＆時刻：2008-02-24(日) 20:04:19.183\n20:04:19.183\t540\t1\tbug.h\t2839\t▽Compile Information\n20:04:19.183\t540\t2\tbug.h\t2841\tCompiler:Visual C++(1400)\n20:04:19.183\t540\t2\tbug.h\t2843\tCompile Date:Feb 24 2008 / Compile Time:20:02:37\n20:04:19.183\t540\t2\tbug.h\t2839\t△Compile Information\n20:04:19.183\t540\t1\tbug.h\t2849\t▽Commandline Argument Information\n20:04:19.183\t540\t2\tbug.h\t2850\targc(0x0012FAC8) = 4(0x00000004)\n20:04:19.183\t540\t2\tbug.h\t2853\targs[0]:tsv\n20:04:19.183\t540\t2\tbug.h\t2853\targs[1]:101\n20:04:19.183\t540\t2\tbug.h\t2853\targs[2]:201\n20:04:19.183\t540\t2\tbug.h\t2853\targs[3]:301\n20:04:19.183\t540\t2\tbug.h\t2849\t△Commandline Argument Information\n20:04:19.183\t540\t1\ttsv.cpp\t176\t▽new\n20:04:19.183\t540\t2\ttsv.cpp\t176\t△new\n20:04:19.183\t540\t1\ttsv.cpp\t179\t▽for\n20:04:19.183\t540\t2\ttsv.cpp\t69\treturn\n20:04:19.183\t5772\t0\tbug.h\t2462\t▽bugbeard session root\n20:04:19.183\t540\t2\ttsv.cpp\t69\treturn\n20:04:19.183\t5772\t1\tbug.h\t2463\t日付＆時刻：2008-02-24(日) 20:04:19.183\n20:04:19.183\t5772\t1\ttsv.cpp\t104\t▽if (1 \u003c current) == true;\n20:04:19.183\t540\t2\ttsv.cpp\t69\treturn\n20:04:19.183\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.183\t540\t2\ttsv.cpp\t179\t△for\n20:04:19.183\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.183\t540\t1\ttsv.cpp\t184\t▽for\n20:04:19.183\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.183\t868\t0\tbug.h\t2462\t▽bugbeard session root\n20:04:19.183\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.183\t868\t1\tbug.h\t2463\t日付＆時刻：2008-02-24(日) 20:04:19.183\n20:04:19.183\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 3(0x00000003)\n20:04:19.183\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.183\t868\t1\ttsv.cpp\t104\t▽if (1 \u003c current) == true;\n20:04:19.183\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.183\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.183\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.183\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.183\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.183\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.183\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.183\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.183\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 5(0x00000005)\n20:04:19.183\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 3(0x00000003)\n20:04:19.183\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.183\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.183\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.183\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.183\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.183\t868\t2\ttsv.cpp\t111\t▽if (current %p) == false;\n20:04:19.183\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.183\t868\t3\ttsv.cpp\t135\tcurrent(0x0143FD9C) = 67(0x00000043)\n20:04:19.183\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.183\t868\t3\ttsv.cpp\t140\tpn(0x0143FC54) = 1(0x00000001)\n20:04:19.183\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 7(0x00000007)\n20:04:19.183\t868\t3\ttsv.cpp\t111\t△if (current %p) == false;\n20:04:19.184\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.184\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.184\t4264\t0\tbug.h\t2462\t▽bugbeard session root\n20:04:19.184\t868\t3\ttsv.cpp\t113\t▽if (pn) == true;\n20:04:19.184\t4264\t1\tbug.h\t2463\t日付＆時刻：2008-02-24(日) 20:04:19.184\n20:04:19.184\t868\t4\ttsv.cpp\t116\t▽if (1 \u003c pn) == false;\n20:04:19.184\t4264\t1\ttsv.cpp\t104\t▽if (1 \u003c current) == true;\n20:04:19.184\t868\t5\ttsv.cpp\t116\t△if (1 \u003c pn) == false;\n20:04:19.184\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.184\t868\t4\ttsv.cpp\t113\t△if (pn) == true;\n20:04:19.184\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.183\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.184\t4264\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.184\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.184\t4264\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.184\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.184\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 3(0x00000003)\n20:04:19.184\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.184\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.184\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.184\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.184\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.184\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 9(0x00000009)\n20:04:19.184\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.184\t4264\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.184\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.184\t4264\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.184\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.184\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 5(0x00000005)\n20:04:19.184\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.184\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.184\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.184\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.184\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 11(0x0000000B)\n20:04:19.184\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.184\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.184\t4264\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.184\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.184\t4264\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.184\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.184\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 7(0x00000007)\n20:04:19.184\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.184\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.184\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.184\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.184\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 13(0x0000000D)\n20:04:19.184\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == false;\n20:04:19.184\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.184\t4264\t3\ttsv.cpp\t135\tcurrent(0x0153FD9C) = 43(0x0000002B)\n20:04:19.184\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.184\t4264\t3\ttsv.cpp\t140\tpn(0x0153FC54) = 1(0x00000001)\n20:04:19.184\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.184\t4264\t3\ttsv.cpp\t111\t△if (current %p) == false;\n20:04:19.184\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.184\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.184\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.184\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.184\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 15(0x0000000F)\n20:04:19.184\t4264\t3\ttsv.cpp\t113\t▽if (pn) == true;\n20:04:19.184\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.184\t4264\t4\ttsv.cpp\t116\t▽if (1 \u003c pn) == false;\n20:04:19.184\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.184\t4264\t5\ttsv.cpp\t116\t△if (1 \u003c pn) == false;\n20:04:19.184\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.184\t4264\t4\ttsv.cpp\t113\t△if (pn) == true;\n20:04:19.184\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.184\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 9(0x00000009)\n20:04:19.184\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.184\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.184\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 17(0x00000011)\n20:04:19.184\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.184\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.184\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.184\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.184\t4264\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.184\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.184\t4264\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.184\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.184\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 11(0x0000000B)\n20:04:19.184\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.184\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.184\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 19(0x00000013)\n20:04:19.184\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.184\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.184\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.184\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.184\t4264\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.184\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.184\t4264\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.185\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 13(0x0000000D)\n20:04:19.184\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.185\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.185\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.185\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.185\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 21(0x00000015)\n20:04:19.185\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.185\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.185\t4264\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.185\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.185\t4264\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.185\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.185\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 15(0x0000000F)\n20:04:19.185\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.185\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.185\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.185\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.185\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 23(0x00000017)\n20:04:19.185\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.185\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.185\t4264\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.185\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.185\t4264\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.185\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.185\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 17(0x00000011)\n20:04:19.185\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.185\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.185\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.185\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.185\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 25(0x00000019)\n20:04:19.185\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.185\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.185\t4264\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.185\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.185\t4264\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.185\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.185\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 19(0x00000013)\n20:04:19.185\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.185\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.185\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.185\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.185\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 27(0x0000001B)\n20:04:19.185\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.185\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.185\t4264\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.185\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.185\t4264\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.185\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.185\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 21(0x00000015)\n20:04:19.185\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.185\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.185\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.185\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.185\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 29(0x0000001D)\n20:04:19.185\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.185\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.185\t4264\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.185\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.185\t4264\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.185\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.185\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 23(0x00000017)\n20:04:19.185\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.185\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.185\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.185\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.185\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 31(0x0000001F)\n20:04:19.185\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.185\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.185\t4264\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.185\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.185\t4264\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.185\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.185\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 25(0x00000019)\n20:04:19.185\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.185\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.185\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.185\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.185\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 33(0x00000021)\n20:04:19.185\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.185\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.185\t4264\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.185\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.185\t4264\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.185\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.185\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 27(0x0000001B)\n20:04:19.185\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.185\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.185\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.185\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.185\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 35(0x00000023)\n20:04:19.185\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.185\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.185\t4264\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.185\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.185\t4264\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.185\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.185\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 29(0x0000001D)\n20:04:19.185\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.185\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.185\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.185\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.185\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 37(0x00000025)\n20:04:19.185\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.185\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.185\t4264\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.185\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.184\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 5(0x00000005)\n20:04:19.185\t4264\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.186\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.186\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 31(0x0000001F)\n20:04:19.186\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.186\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.186\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.186\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.186\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.186\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 39(0x00000027)\n20:04:19.186\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.186\t4264\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.186\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.186\t4264\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.186\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.186\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 33(0x00000021)\n20:04:19.186\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.186\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.186\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.186\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.186\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.186\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 41(0x00000029)\n20:04:19.186\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.186\t4264\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.186\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.186\t4264\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.186\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.186\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 35(0x00000023)\n20:04:19.186\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.186\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.186\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.186\t4264\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.186\t4264\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.186\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.186\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.186\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 43(0x0000002B)\n20:04:19.186\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.186\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.186\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.186\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.186\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.186\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 45(0x0000002D)\n20:04:19.186\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.186\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.186\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.186\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.186\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.186\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 47(0x0000002F)\n20:04:19.186\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.186\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.186\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.186\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.186\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.186\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 49(0x00000031)\n20:04:19.186\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.186\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.186\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.186\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.186\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.186\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 51(0x00000033)\n20:04:19.186\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.186\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.186\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.186\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.186\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.186\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 53(0x00000035)\n20:04:19.186\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.186\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.186\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.186\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.186\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.187\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 55(0x00000037)\n20:04:19.187\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.187\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.187\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.187\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.187\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.187\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 57(0x00000039)\n20:04:19.187\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.187\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.187\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.187\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.187\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.187\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 59(0x0000003B)\n20:04:19.187\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.187\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.187\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.187\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.187\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.187\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 61(0x0000003D)\n20:04:19.187\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.187\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.187\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.187\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.187\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.187\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 63(0x0000003F)\n20:04:19.187\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.187\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.187\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.187\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.187\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.187\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 65(0x00000041)\n20:04:19.187\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.187\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.187\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.187\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.187\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.187\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 67(0x00000043)\n20:04:19.187\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.187\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.187\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.187\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.187\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.187\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 69(0x00000045)\n20:04:19.187\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.187\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.187\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.187\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.187\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.187\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 71(0x00000047)\n20:04:19.187\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.187\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.187\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.187\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.187\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.187\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 73(0x00000049)\n20:04:19.187\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.187\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.187\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.187\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.188\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.188\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 75(0x0000004B)\n20:04:19.188\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.188\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.188\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.188\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.188\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.188\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 77(0x0000004D)\n20:04:19.188\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.188\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.188\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.188\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.188\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.188\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 79(0x0000004F)\n20:04:19.188\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.188\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.188\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.188\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.188\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.188\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 81(0x00000051)\n20:04:19.188\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.188\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.188\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.188\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.188\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.188\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 83(0x00000053)\n20:04:19.188\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.188\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.188\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.188\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.188\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.188\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 85(0x00000055)\n20:04:19.188\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.188\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.188\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.188\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.188\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.188\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 87(0x00000057)\n20:04:19.188\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.188\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.188\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.188\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.188\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.188\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 89(0x00000059)\n20:04:19.188\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.188\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.188\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.188\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.188\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.188\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 91(0x0000005B)\n20:04:19.188\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.188\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.188\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.188\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.188\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.188\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 93(0x0000005D)\n20:04:19.188\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.188\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.188\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.188\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.189\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.189\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 95(0x0000005F)\n20:04:19.189\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.189\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.189\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.186\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 37(0x00000025)\n20:04:19.189\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.189\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.189\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.189\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.189\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 97(0x00000061)\n20:04:19.189\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.189\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.189\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.189\t4264\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.189\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.189\t4264\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.189\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.189\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 39(0x00000027)\n20:04:19.189\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.189\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.189\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 99(0x00000063)\n20:04:19.189\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.189\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.189\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.189\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.189\t4264\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.189\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.189\t4264\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.189\t5772\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.189\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 41(0x00000029)\n20:04:19.189\t5772\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.189\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.189\t5772\t3\ttsv.cpp\t126\tp(0x0133FC5C) = 101(0x00000065)\n20:04:19.189\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.189\t5772\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.189\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.189\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.189\t4264\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.189\t5772\t2\ttsv.cpp\t111\t▽if (current %p) == false;\n20:04:19.189\t4264\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.189\t5772\t3\ttsv.cpp\t135\tcurrent(0x0133FD9C) = 1(0x00000001)\n20:04:19.189\t4264\t3\ttsv.cpp\t126\tp(0x0153FC5C) = 43(0x0000002B)\n20:04:19.189\t5772\t3\ttsv.cpp\t140\tpn(0x0133FC54) = 1(0x00000001)\n20:04:19.189\t4264\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.189\t5772\t3\ttsv.cpp\t111\t△if (current %p) == false;\n20:04:19.189\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.189\t5772\t2\ttsv.cpp\t109\twhile (1 \u003c current) == false;\n20:04:19.189\t4264\t2\ttsv.cpp\t111\t▽if (current %p) == false;\n20:04:19.189\t5772\t2\ttsv.cpp\t144\t▽if (1 \u003c pn) == false;\n20:04:19.189\t4264\t3\ttsv.cpp\t135\tcurrent(0x0153FD9C) = 1(0x00000001)\n20:04:19.189\t5772\t3\ttsv.cpp\t144\t△if (1 \u003c pn) == false;\n20:04:19.189\t4264\t3\ttsv.cpp\t140\tpn(0x0153FC54) = 1(0x00000001)\n20:04:19.189\t5772\t2\ttsv.cpp\t104\t△if (1 \u003c current) == true;\n20:04:19.189\t4264\t3\ttsv.cpp\t111\t△if (current %p) == false;\n20:04:19.189\t4264\t2\ttsv.cpp\t109\twhile (1 \u003c current) == false;\n20:04:19.189\t4264\t2\ttsv.cpp\t144\t▽if (1 \u003c pn) == false;\n20:04:19.189\t4264\t3\ttsv.cpp\t144\t△if (1 \u003c pn) == false;\n20:04:19.189\t4264\t2\ttsv.cpp\t104\t△if (1 \u003c current) == true;\n20:04:19.189\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.189\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.189\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.189\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.189\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.189\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 7(0x00000007)\n20:04:19.189\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.189\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.189\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.189\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.189\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.189\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 9(0x00000009)\n20:04:19.189\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.189\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.189\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.189\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.190\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.190\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 11(0x0000000B)\n20:04:19.190\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.190\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.190\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.190\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.190\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.190\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 13(0x0000000D)\n20:04:19.190\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.190\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.190\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.190\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.190\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.190\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 15(0x0000000F)\n20:04:19.190\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.190\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.190\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.190\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.190\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.190\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 17(0x00000011)\n20:04:19.190\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.190\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.190\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.190\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.190\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.190\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 19(0x00000013)\n20:04:19.190\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.190\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.190\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.190\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.190\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.190\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 21(0x00000015)\n20:04:19.190\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.190\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.190\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.190\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.190\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.190\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 23(0x00000017)\n20:04:19.190\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.190\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.190\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.190\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.190\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.190\t5772\t1\ttsv.cpp\t154\treturn\n20:04:19.190\t5772\t1\ttsv.cpp\t161\treturn\n20:04:19.190\t5772\t1\tbug.h\t2468\t日付＆時刻：2008-02-24(日) 20:04:19.190\n20:04:19.190\t5772\t1\tbug.h\t2469\t△bugbeard session root\n20:04:19.190\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 25(0x00000019)\n20:04:19.191\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.191\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.191\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.191\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.191\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.191\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 27(0x0000001B)\n20:04:19.191\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.191\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.191\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.191\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.191\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.191\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 29(0x0000001D)\n20:04:19.191\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.191\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.191\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.191\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.191\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.191\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 31(0x0000001F)\n20:04:19.191\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.191\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.191\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.191\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.191\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.191\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 33(0x00000021)\n20:04:19.191\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.191\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.191\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.191\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.191\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.191\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 35(0x00000023)\n20:04:19.191\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.191\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.191\t4264\t1\ttsv.cpp\t154\treturn\n20:04:19.191\t4264\t1\ttsv.cpp\t161\treturn\n20:04:19.191\t4264\t1\tbug.h\t2468\t日付＆時刻：2008-02-24(日) 20:04:19.191\n20:04:19.191\t4264\t1\tbug.h\t2469\t△bugbeard session root\n20:04:19.191\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.191\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.191\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.191\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 37(0x00000025)\n20:04:19.191\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.191\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.191\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.191\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.191\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.191\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 39(0x00000027)\n20:04:19.192\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.192\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.192\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.192\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.192\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.192\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 41(0x00000029)\n20:04:19.192\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.192\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.192\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.192\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.192\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.192\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 43(0x0000002B)\n20:04:19.192\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.192\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.192\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.192\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.192\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.192\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 45(0x0000002D)\n20:04:19.192\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.192\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.192\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.192\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.192\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.192\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 47(0x0000002F)\n20:04:19.192\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.192\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.192\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.192\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.192\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.192\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 49(0x00000031)\n20:04:19.192\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.192\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.192\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.192\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.192\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.192\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 51(0x00000033)\n20:04:19.192\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.192\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.192\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.192\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.192\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.192\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 53(0x00000035)\n20:04:19.192\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.192\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.192\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.192\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.192\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.192\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 55(0x00000037)\n20:04:19.192\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.192\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.192\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.192\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.192\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.192\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 57(0x00000039)\n20:04:19.192\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.192\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.192\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.192\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.192\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.192\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 59(0x0000003B)\n20:04:19.193\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.193\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.193\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.193\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.193\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.193\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 61(0x0000003D)\n20:04:19.193\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.193\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.193\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.193\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.193\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.193\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 63(0x0000003F)\n20:04:19.193\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.193\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.193\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.193\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.193\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.193\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 65(0x00000041)\n20:04:19.193\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.193\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.193\t868\t2\ttsv.cpp\t111\t▽if (current %p) == true;\n20:04:19.193\t868\t3\ttsv.cpp\t113\t▽if (pn) == false;\n20:04:19.193\t868\t4\ttsv.cpp\t113\t△if (pn) == false;\n20:04:19.193\t868\t3\ttsv.cpp\t126\tp(0x0143FC5C) = 67(0x00000043)\n20:04:19.193\t868\t3\ttsv.cpp\t111\t△if (current %p) == true;\n20:04:19.193\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == true;\n20:04:19.193\t868\t2\ttsv.cpp\t111\t▽if (current %p) == false;\n20:04:19.193\t868\t3\ttsv.cpp\t135\tcurrent(0x0143FD9C) = 1(0x00000001)\n20:04:19.193\t868\t3\ttsv.cpp\t140\tpn(0x0143FC54) = 1(0x00000001)\n20:04:19.193\t868\t3\ttsv.cpp\t111\t△if (current %p) == false;\n20:04:19.193\t868\t2\ttsv.cpp\t109\twhile (1 \u003c current) == false;\n20:04:19.193\t868\t2\ttsv.cpp\t144\t▽if (1 \u003c pn) == false;\n20:04:19.193\t868\t3\ttsv.cpp\t144\t△if (1 \u003c pn) == false;\n20:04:19.193\t868\t2\ttsv.cpp\t104\t△if (1 \u003c current) == true;\n20:04:19.194\t868\t1\ttsv.cpp\t154\treturn\n20:04:19.194\t868\t1\ttsv.cpp\t161\treturn\n20:04:19.194\t868\t1\tbug.h\t2468\t日付＆時刻：2008-02-24(日) 20:04:19.194\n20:04:19.194\t868\t1\tbug.h\t2469\t△bugbeard session root\n20:04:19.194\t540\t2\ttsv.cpp\t184\t△for\n20:04:19.194\t540\t1\ttsv.cpp\t189\t▽delete\n20:04:19.194\t540\t2\ttsv.cpp\t189\t△delete\n20:04:19.194\t540\t1\ttsv.cpp\t191\treturn\n20:04:19.194\t540\t1\tbug.h\t2468\t日付＆時刻：2008-02-24(日) 20:04:19.194\n20:04:19.194\t540\t1\tbug.h\t2469\t△bugbeard session root\n```\n\n#### 解説\n\n上記の出力結果は...\n\n```txt\n20:04:19.183\t540\t1\tbug.h\t2849\t▽Commandline Argument Information\n20:04:19.183\t540\t2\tbug.h\t2850\targc(0x0012FAC8) = 4(0x00000004)\n20:04:19.183\t540\t2\tbug.h\t2853\targs[0]:tsv\n20:04:19.183\t540\t2\tbug.h\t2853\targs[1]:101\n20:04:19.183\t540\t2\tbug.h\t2853\targs[2]:201\n20:04:19.183\t540\t2\tbug.h\t2853\targs[3]:301\n20:04:19.183\t540\t2\tbug.h\t2849\t△Commandline Argument Information\n```\n\n...を見てもおわかりいただけますが、「101 201 301」を引数として与えた場合のものです。\nまたこのケースでは .tsv の各カラムはそれぞれ 時刻, スレッドID, ネストの深さ, `__FILE__`, `__LINE__`, ログメッセージ の内容になっていますが、コンパイル時の状況によりこの書式は若干変化します。\n\nこのサンプルでの一つ目の肝は...\n\n```c++\n//  標準エラーにTSV形式の出力を行うロガーの定義(メインスレッド用)\nBUG_define_logger(new bugbeard::bug_tsv_logger(common_writer));\n```\n\n...で、ツリー形式ではなく .tsv 形式のログ出力を指定しているところです。ロガーへの引数がこれまでのサンプルと違いますが、これはマルチスレッド対応の為のもので、.tsv 形式でログ出力を行うこととは本質的には関係ありません。\n\nこのサンプルでの二つの肝は最初に `bug.h` を `#include` する前に...\n\n```c++\n#define BUG_EVIL_CONTRACT       //  \"悪魔の契約\"\n#define BUG_MULTI_THREAD        //  マルチスレッドモデルでバグベアードを利用\n#include \"bug.h\"                //  ロガーを定義する為にステートメントハックを有効にしない状態で include\n```\n\n`BUG_MULTI_THREAD` マクロを定義してバグベアードをマルチスレッドモデルで利用すること宣言した上で、ロガーを...\n\n```c++\n//  共用ライターの定義\nBUG_exec(bugbeard::bug_smart_writer common_writer(new bugbeard::bug_file_writer_base(stderr)));\n\n//  標準エラーにTSV形式の出力を行うロガーの定義(メインスレッド用)\nBUG_define_logger(new bugbeard::bug_tsv_logger(common_writer));\n```\n\n```c++\nBUG_THREAD_RESULT BUG_THREAD_CALL factorize_thread(void * data)\n{\n    //  [BUG]スレッドローカルロガーの定義\n    BUG_define_logger(new bugbeard::bug_tsv_logger(common_writer));\n    factorize((int)data);\n    return 0;\n}\n```\n        \n...の�","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwraith13%2Fbugbeard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwraith13%2Fbugbeard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwraith13%2Fbugbeard/lists"}