これらは, デバッグ用(開発時用)の機能の中で使用されるユーティリティ・クラス.
sprintf() のような働きをするユーティリティ・クラス.
コンストラクタで渡された書式付き文字列に従って文字列を生成する.
((cite: hotspot/src/share/vm/utilities/debug.hpp))
// Simple class to format the ctor arguments into a fixed-sized buffer.
template <size_t bufsz = 256>
class FormatBuffer {
なお err_msg や hrs_err_msg という型も使われるが, これは FormatBuffer の別名.
((cite: hotspot/src/share/vm/utilities/debug.hpp))
// Used to format messages for assert(), guarantee(), fatal(), etc.
typedef FormatBuffer<> err_msg;
((cite: hotspot/src/share/vm/gc_implementation/g1/heapRegionSet.hpp))
// Large buffer for some cases where the output might be larger than normal.
#define HRS_ERR_MSG_BUFSZ 512
typedef FormatBuffer<HRS_ERR_MSG_BUFSZ> hrs_err_msg;
コンストラクタ引数として書式付き文字列を渡す (なおテンプレート引数はバッファ長. デフォルトは 256).
生成された文字列は FormatBuffer オブジェクトを char* にキャストすることで取得できる.
((cite: hotspot/src/share/vm/runtime/frame.cpp))
values.describe(-1, MAX2(sp(), fp()),
FormatBuffer<1024>("#%d method %s @ %d", frame_no, m->name_and_sig_as_C_string(), bci), 2);
HotSpot 内の様々な箇所で使用されている (#TODO).
(特に assert() や guarantee() 等に渡すエラーメッセージの生成処理が多い).
内部には以下のフィールド(のみ)を保持する.
((cite: hotspot/src/share/vm/utilities/debug.hpp))
char _buf[bufsz];
このフィールドは, char* にキャストすることで取得できる.
((cite: hotspot/src/share/vm/utilities/debug.hpp))
operator const char *() const { return _buf; }
See: here for details
デバッグ用(開発時用)のクラス (#ifndef PRODUCT 時にしか定義されない).
hotspot/src/share/vm/utilities/debug.cpp 内で定義されているデバッグ用の関数群(blob(), dump_vtable(), nm(), etc)内で使用される補助クラス.
これらの関数の前準備と後始末を行う.
((cite: hotspot/src/share/vm/utilities/debug.cpp))
#ifndef PRODUCT
// All debug entries should be wrapped with a stack allocated
// Command object. It makes sure a resource mark is set and
// flushes the logfile to prevent file sharing problems.
class Command : public StackObj {
コード中で Command 型の局所変数を宣言するだけ.
((cite: hotspot/src/share/vm/utilities/debug.cpp))
extern "C" void universe() {
Command c("universe");
Universe::print();
コンストラクタで Debugging オプションの値を true に変更し, デストラクタで元に戻している.
(ついでに, デバッグ用の関数が呼び出されたことをコンストラクタ内で tty に出力し, デストラクタ内で tty をフラッシュしている)
(なお, Debugging は現在デバッグ中であることを示すオプション. true にすると VMError::report_and_die() 等が死なずにリターンするようになる)
((cite: hotspot/src/share/vm/utilities/debug.cpp))
Command(const char* str) {
debug_save = Debugging;
Debugging = true;
if (level++ > 0) return;
tty->cr();
tty->print_cr("\"Executing %s\"", str);
}
~Command() { tty->flush(); Debugging = debug_save; level--; }
See: here for details
デバッグ用(開発時用)のクラス (#ifndef PRODUCT 時にしか定義されない).
デバッグ用の関数である findref() 内で(のみ)使用される補助クラス.
Java ヒープ中を探索し, 指定された oop(ポインタ値) と一致するものを見つけたら tty に出力する Closure.
((cite: hotspot/src/share/vm/utilities/debug.cpp))
#ifndef PRODUCT
...
class LookForRefInGenClosure : public OopsInGenClosure {
See: here for details
デバッグ用(開発時用)のクラス (#ifndef PRODUCT 時にしか定義されない).
デバッグ用の関数である findref() 内で(のみ)使用される補助クラス.
指定されたオブジェクト中の全ての oop に対して LookForRefInGenClosure を呼び出す Closure.
((cite: hotspot/src/share/vm/utilities/debug.cpp))
#ifndef PRODUCT
...
class LookForRefInObjectClosure : public ObjectClosure {
See: here for details
デバッグ用(開発時用)のクラス (#ifndef PRODUCT 時にしか定義されない).
デバッグ用の関数である findclass() 内で(のみ)使用される補助クラス.
perm 領域中を探索し, 指定された名前(文字列)と一致するクラス名を持つ Klass オブジェクトを tty に出力する Closure.
((cite: hotspot/src/share/vm/utilities/debug.cpp))
#ifndef PRODUCT
...
class FindClassObjectClosure: public ObjectClosure {
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.