91 for (
Integer i = 0; i < MAX_STACK; ++i)
92 m_funcs_info_indexes[i] = (-1);
97 bool operator<(
const ProfStackInfo& pfi)
const
99 return std::memcmp(m_funcs_info_indexes, pfi.m_funcs_info_indexes, MAX_STACK *
sizeof(
Int32)) < 0;
104 Int32 m_funcs_info_indexes[MAX_STACK];
165 typedef size_t size_type;
166 typedef ptrdiff_t difference_type;
167 typedef _Tp* pointer;
168 typedef const _Tp* const_pointer;
169 typedef _Tp& reference;
170 typedef const _Tp& const_reference;
171 typedef _Tp value_type;
173 template <
typename _Tp1>
176 typedef StaticAlloc<_Tp1> other;
179 StaticAlloc() ARCANE_NOEXCEPT
187 template <
typename _Tp1>
188 StaticAlloc(
const StaticAlloc<_Tp1>&) ARCANE_NOEXCEPT {}
190 ~StaticAlloc() ARCANE_NOEXCEPT {}
192 void construct(pointer __p,
const _Tp& __val)
194 ::new ((
void*)__p) _Tp(__val);
197 void destroy(pointer __p) { __p->~_Tp(); }
199 pointer allocate(size_type ,
const void* = 0)
202 pointer p = &m_buf[m_buf_index];
205 if (m_buf_index >= (
int)(0.9 * MAX_STATIC_ALLOC))
206 std::cout <<
"** WARNING: allocate near max memory\n";
207 if (m_buf_index >= MAX_STATIC_ALLOC)
208 throw FatalErrorException(
"StaticAlloc",
"max static alloc reached");
211 void deallocate(pointer, size_type)
220 static _Tp m_buf[MAX_STATIC_ALLOC];
221 static int m_buf_index;
235 class SortedProfStackInfo
241 , m_nb_count(nb_count)
247 bool operator<(
const SortedProfStackInfo& pfi)
const
249 return this->m_nb_count > pfi.m_nb_count;
251 const ProfStackInfo& stackInfo()
const {
return m_stack_info; }
252 Int64 nbCount()
const {
return m_nb_count; }
265 class LibUnwindFuncInfos;
266 class LibUnwindStackInfo;
267 class BacktraceFuncInfos;
268 class BacktraceStackInfo;
279 const char* func_name;
294#if defined(ARCCORE_OS_WIN32) || defined(ARCCORE_OS_MACOS)
295 typedef std::map<void*, ProfAddrInfo> AddrMap;
296 typedef std::map<Int64, ProfFuncInfo*> FuncMap;
297 typedef std::map<ProfStackInfo, Int64> StackMap;
306 void printInfos(
bool dump_file);
309 void startProfiling();
310 void addEvent(
void* address,
int overflow_event[MAX_COUNTER],
int nb_overflow_event);
311 void stopProfiling();
316 void setFunctionDepth(
int v);
317 void setPeriod(
int v);
318 void setNbEventBeforeGettingStack(
Integer v) { m_nb_event_before_getting_stack = v; }
319 Int64 nbEventBeforeGettingStack()
const {
return m_nb_event_before_getting_stack; }
325 StackMap m_stack_map;
326 Int64 m_total_event = 0;
327 Int64 m_total_stack = 0;
328 Int64 m_counters[MAX_COUNTER];
329 Int32 m_current_func_info = 0;
330 ProfFuncInfo m_func_info_buffer[MAX_FUNC];
332 Int64 m_nb_event_before_getting_stack = 5000;
333 int m_function_depth = 3;
334 bool m_use_backtrace =
false;
335 bool m_use_libunwind =
false;
336 MonoFuncAddrGetter* m_mono_func_getter =
nullptr;
337 bool m_is_started =
false;
338 IFuncInfoProvider* m_default_func_info_provider =
nullptr;
339 IFuncInfoProvider* m_libunwind_func_info_provider =
nullptr;
340 IFuncInfoProvider* m_backtrace_func_info_provider =
nullptr;
341 IFuncInfoProvider* m_func_info_provider =
nullptr;
345 void _addEvent(
void* address,
int overflow_event[MAX_COUNTER],
int nb_overflow_event,
346 IStackInfoProvider& stack_info,
Integer function_depth);
347 bool _getFunc(
void* addr, FuncAddrInfo&
info);
348 void _sortFunctions(std::set<ProfFuncInfo*, ProfFuncComparer>& sorted_func);
352 ProfFuncInfo* _getNextFuncInfo();
353 ProfFuncInfo& _funcInfoFromIndex(Int32 index) {
return m_func_info_buffer[index]; }
354 void _storeAddress(
void* address,
bool is_counter0,
int overflow_event[MAX_COUNTER],
int nb_overflow_event,
355 bool* do_add,
bool* do_stack,
bool* func_already_added);
356 void _checkNotStarted();