14#include "arcane/utils/String.h"
15#include "arcane/utils/IStackTraceService.h"
16#include "arcane/utils/ISymbolizerService.h"
17#include "arcane/utils/NotImplementedException.h"
18#include "arcane/utils/StringBuilder.h"
20#include "arccore/base/internal/DependencyInjection.h"
22#include "arcane/core/AbstractService.h"
58 _getStack(first_function,frames);
63 return _getStackSymbols(frames);
72 ::SymSetOptions(SYMOPT_DEFERRED_LOADS | SYMOPT_INCLUDE_32BIT_MODULES | SYMOPT_UNDNAME | SYMOPT_LOAD_LINES);
73 if (!::SymInitialize(::GetCurrentProcess(),
nullptr,
true)) {
82 bool m_is_init =
false;
83 bool m_is_good =
false;
89void DbgHelpSymContainer::
93 PVOID addrs[FixedStackFrameArray::MAX_FRAME] = { 0 };
94 USHORT nb_frame = CaptureStackBackTrace(first_function + 2, FixedStackFrameArray::MAX_FRAME, addrs, NULL);
95 for (USHORT i = 0; i < nb_frame; i++) {
96 frames.
addFrame(StackFrame((intptr_t)addrs[i]));
103String DbgHelpSymContainer::
110 int nb_frame = frames.size();
111 for (USHORT i = 0; i < nb_frame; i++) {
112 DWORD64 addr = (DWORD64)frames[i].address();
116 ULONG64 buffer[(
sizeof(SYMBOL_INFO) + 1024 +
sizeof(ULONG64) - 1) /
sizeof(ULONG64)] = { 0 };
117 SYMBOL_INFO* info = (SYMBOL_INFO*)buffer;
118 info->SizeOfStruct =
sizeof(SYMBOL_INFO);
119 info->MaxNameLen = 1024;
122 DWORD64 displacement = 0;
123 if (::SymFromAddr(::GetCurrentProcess(), addr, &displacement, info)) {
126 DWORD line_displacement = 0;
127 IMAGEHLP_LINE64 line = {};
128 line.SizeOfStruct =
sizeof(IMAGEHLP_LINE64);
129 BOOL has_line = SymGetLineFromAddr64(GetCurrentProcess(), addr, &line_displacement, &line);
130 sb.append(std::string_view(info->Name, info->NameLen));
134 sb.append(line.FileName);
136 sb.append(String::fromNumber(line.LineNumber));
141 return sb.toString();
149 std::shared_ptr<DbgHelpSymContainer> m_sym_container;
150 std::shared_ptr<DbgHelpSymContainer> _getStaticContainer()
152 if (!m_sym_container.get())
153 m_sym_container = std::make_shared<DbgHelpSymContainer>();
154 return m_sym_container;
166class DbgHelpStackTraceService
176 explicit DbgHelpStackTraceService(
ITraceMng* tm)
191 std::shared_ptr<DbgHelpSymContainer> m_sym_container;
194 if (!m_sym_container.get())
195 m_sym_container = _getStaticContainer();
196 return m_sym_container.get();
208 String text = c->getStackSymbols(frames.view());
229class DbgHelpSymbolizerService
238 explicit DbgHelpSymbolizerService(
ITraceMng* tm)
251 return _getContainer()->getStackSymbols(frames);
255 std::shared_ptr<DbgHelpSymContainer> m_sym_container;
258 if (!m_sym_container.get())
259 m_sym_container = _getStaticContainer();
260 return m_sym_container.get();
276 DependencyInjection::ProviderProperty(
"DbgHelpStackTraceService"),
281 DependencyInjection::ProviderProperty(
"DbgHelpSymbolizerService"),
Ce fichier contient les différentes fabriques de services et macro pour enregistrer les services.
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro pour déclarer une interface lors de l'enregistrement d'un service.
Vue constante d'un tableau de type T.
Service de trace des appels de fonctions utilisant 'DbgHelp'.
StackTrace stackTrace(int first_function) override
Chaîne de caractère indiquant la pile d'appel.
StackTrace stackTraceFunction(int function_index) override
Nom d'une fonction dans la pile d'appel.
Service de trace des appels de fonctions utilisant la libunwind.
String stackTrace(ConstArrayView< StackFrame > frames) override
Informations pour la pile d'appel frames.
Conserve une liste de taille fixe maximale de StackFrame.
void addFrame(const StackFrame &frame)
Ajoute frame à la liste des frames. Si nbFrame() est supérieur ou égal à MAX_FRAME,...
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
Interface d'un service de trace des appels de fonctions.
Interface d'un service de récupération des symboles du code source.
Interface du gestionnaire de traces.
IApplication * application() const
Accès à l'application IApplication associé.
Structure contenant les informations pour créer un service.
Propriétés de création d'un service.
Informations sur la pile d'appel des fonctions.
Chaîne de caractères unicode.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro pour enregistrer un service.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
@ ST_Application
Le service s'utilise au niveau de l'application.