AM Daemon ライブラリリファレンス
StackTrace.h
[詳解]
1 /// @file
2 /// @brief スタックトレース情報クラス StackTrace のヘッダ。
3 ///
4 /// Copyright(C)SEGA
5 
6 #ifndef AMDAEMON_UTIL_STACKTRACE_H
7 #define AMDAEMON_UTIL_STACKTRACE_H
8 
9 #include "amdaemon/env.h"
10 
11 #include <vector>
12 #include <memory>
13 
14 namespace amdaemon
15 {
16 namespace util
17 {
18  /// @brief スタックトレース情報クラス。
19  /// @ingroup g_util g_exception
20  ///
21  /// - ライブラリをリンクするプロジェクトのリンカオプションで /DEBUG が指定されており、
22  /// かつデバッグ情報を参照可能な状態の場合、
23  /// シンボル名やファイル名を含む完全なスタックトレース情報を取得できる。
24  /// - /DEBUG が指定されていない場合やデバッグ情報を参照できない状態の場合、
25  /// スタックアドレスのみ取得できる。
26  ///
27  /// デバッグ情報は、VC++の既定のリンカオプションではPDBファイルとして出力される。
28  /// このPDBファイルが実行可能ファイルと同じ位置にある場合にデバッグ情報を参照可能となる。
29  class StackTrace
30  {
31  public:
32  /// スタックトレースユニットクラス。
33  class Unit
34  {
35  public:
36  /// @brief コンストラクタ。
37  /// @param[in] address スタックアドレス。
38  /// @param[in] module モジュール名。不明ならば nullptr 。
39  /// @param[in] symbol シンボル名。不明ならば nullptr 。
40  /// @param[in] file ファイル名。不明ならば nullptr 。
41  /// @param[in] line ファイル行番号。不明ならば負数。
42  Unit(
43  const void* address,
44  const wchar_t* module,
45  const wchar_t* symbol,
46  const wchar_t* file,
47  int line);
48 
49  /// @brief コピーコンストラクタ。
50  /// @param[in] src コピー元。
51  Unit(const Unit& src);
52 
53  /// @brief ムーブコンストラクタ。
54  /// @param[in] src ムーブ元。
55  Unit(Unit&& src);
56 
57  /// デストラクタ。
58  ‾Unit();
59 
60  /// @brief コピー代入演算子のオーバロード。
61  /// @param[in] r 右辺値。
62  /// @return 自身の参照。
63  Unit& operator=(const Unit& r);
64 
65  /// @brief ムーブ代入演算子のオーバロード。
66  /// @param[in] r 右辺値。
67  /// @return 自身の参照。
68  Unit& operator=(Unit&& r);
69 
70  /// @brief スタックアドレスを取得する。
71  /// @return スタックアドレス。
72  const void* getAddress() const;
73 
74  /// @brief モジュール名を取得する。
75  /// @return モジュール名。不明ならば空文字列。
76  const wchar_t* getModule() const;
77 
78  /// @brief シンボル名を取得する。
79  /// @return シンボル名。不明ならば空文字列。
80  /// @note 関数名を表す。
81  const wchar_t* getSymbol() const;
82 
83  /// @brief ファイル名を取得する。
84  /// @return ファイル名。不明ならば空文字列。
85  const wchar_t* getFile() const;
86 
87  /// @brief ファイル行番号を取得する。
88  /// @return ファイル行番号。不明ならば -1 。
89  int getLine() const;
90 
91  /// @brief スタックトレースユニットの文字列表現を取得する。
92  /// @return スタックトレースユニットの文字列表現。
93  const wchar_t* toString() const;
94 
95  private:
96  class Impl;
97 
98  /// pimpl インスタンス。
99  std::unique_ptr<Impl> _impl;
100  };
101 
102  public:
103  /// @brief この関数を呼び出した時点でのスタックトレース情報を作成する。
104  /// @param[in] ignoreThis
105  /// この関数自身をスタックトレース情報に含めないならば true 。
106  /// @return スタックトレース情報。
107  static StackTrace make(bool ignoreThis = false);
108 
109  /// @brief スタックトレース情報作成のための初期化を行う。
110  /// @retval true 処理に成功したか、既に初期化済みである場合。
111  /// @retval false 処理に失敗した場合。
112  ///
113  /// この関数を呼ばずとも初回のスタックトレース情報作成時に初期化される。
114  /// ただし、初期化処理にはやや時間が掛かり、ヒープもいくらか消費するため、
115  /// この関数で予め初期化を行っておくことは有用である。
116  static bool initialize();
117 
118  public:
119  /// @brief コンストラクタ。
120  ///
121  /// 空のスタックトレース情報で初期化される。
122  StackTrace();
123 
124  private:
125  /// @brief コンストラクタ。
126  /// @param[in] スタックトレースユニット配列。
127  /// @see make
128  StackTrace(std::vector<Unit>&& units);
129 
130  public:
131  /// @brief コピーコンストラクタ。
132  /// @param[in] src コピー元。
133  StackTrace(const StackTrace& src);
134 
135  /// @brief ムーブコンストラクタ。
136  /// @param[in] src ムーブ元。
137  StackTrace(StackTrace&& src);
138 
139  /// デストラクタ。
140  ‾StackTrace();
141 
142  /// @brief コピー代入演算子のオーバロード。
143  /// @param[in] r 右辺値。
144  /// @return 自身の参照。
145  StackTrace& operator=(const StackTrace& r);
146 
147  /// @brief ムーブ代入演算子のオーバロード。
148  /// @param[in] r 右辺値。
149  /// @return 自身の参照。
151 
152  /// @brief スタックトレースユニット配列を取得する。
153  /// @return スタックトレースユニット配列。
154  const std::vector<Unit>& getUnits() const;
155 
156  /// @brief スタックトレースの文字列表現を取得する。
157  /// @return スタックトレースの文字列表現。空ならば空文字列。
158  const wchar_t* toString() const;
159 
160  /// @brief スタックトレース情報が空であるか否かを取得する。
161  /// @retval true 空である場合。
162  /// @retval false 空ではない場合。
163  bool empty() const { return getUnits().empty(); }
164 
165  private:
166  class Impl;
167 
168  /// pimpl インスタンス。
169  std::unique_ptr<Impl> _impl;
170  };
171 } // namespace util
172 } // namespace amdaemon
173 
174 #endif // AMDAEMON_UTIL_STACKTRACE_H
Unit(const void *address, const wchar_t *module, const wchar_t *symbol, const wchar_t *file, int line)
コンストラクタ。
const wchar_t * getModule() const
モジュール名を取得する。
const wchar_t * toString() const
スタックトレースユニットの文字列表現を取得する。
Daemonライブラリの環境定義を行うヘッダ。
const std::vector< Unit > & getUnits() const
スタックトレースユニット配列を取得する。
AM Daemon ライブラリクラス群の基底名前空間。
Definition: Log.h:13
const wchar_t * getFile() const
ファイル名を取得する。
スタックトレースユニットクラス。
Definition: StackTrace.h:33
Unit & operator=(const Unit &r)
コピー代入演算子のオーバロード。
‾StackTrace()
デストラクタ。
static bool initialize()
スタックトレース情報作成のための初期化を行う。
const wchar_t * getSymbol() const
シンボル名を取得する。
StackTrace()
コンストラクタ。
スタックトレース情報クラス。
Definition: StackTrace.h:29
static StackTrace make(bool ignoreThis=false)
この関数を呼び出した時点でのスタックトレース情報を作成する。
‾Unit()
デストラクタ。
const void * getAddress() const
スタックアドレスを取得する。
bool empty() const
スタックトレース情報が空であるか否かを取得する。
Definition: StackTrace.h:163
int getLine() const
ファイル行番号を取得する。