14#include "arcane/utils/PlatformUtils.h"
15#include "arcane/utils/IStackTraceService.h"
16#include "arcane/utils/StackTrace.h"
17#include "arcane/utils/StringBuilder.h"
18#include "arcane/utils/Convert.h"
21#include "arcane/core/AbstractService.h"
23#include "arcane_packages.h"
26#define BACKWARD_HAS_DW 1
28#if defined(ARCANE_HAS_PACKAGE_LIBUNWIND)
29#define BACKWARD_HAS_LIBUNWIND 1
32#include "arcane/std/internal/backwardcpp/backward.hpp"
43class BackwardCppStackTraceService
65 if (v.value() < 0 || v.value() > 4) {
68 m_verbose_level = v.value();
79 Int32 m_verbose_level;
90 constexpr size_t hexa_buf_size = 100;
91 char hexa[hexa_buf_size + 1];
93 backward::StackTrace st;
94 st.skip_n_firsts(first_function);
97 backward::TraceResolver tr;
98 tr.load_stacktrace(st);
100 backward::SnippetFactory sf;
102 for (
size_t i = 0; i < st.size(); ++i) {
103 backward::ResolvedTrace trace = tr.resolve(st[i]);
105 snprintf(hexa, hexa_buf_size,
"%14p", trace.addr);
108 message += trace.object_function;
110 UInt32 src_line = trace.source.line;
112 if (m_verbose_level > 0 && src_line > 0) {
114 if (m_verbose_level > 1 || !arcane_function) {
115 auto lines = sf.get_snippet(trace.source.filename, src_line, 5);
116 message +=
"\n Line: ";
118 message +=
" -- File: ";
119 message += trace.source.filename;
120 if (m_verbose_level > 3 || (m_verbose_level > 2 && !arcane_function)) {
121 for (
const auto& [line_num, line] : lines) {
122 message += (line_num == src_line ?
"\n >>> " :
"\n ");
136 return { stack_frames, message };
145 backward::StackTrace st;
146 st.skip_n_firsts(function_index);
152 backward::TraceResolver tr;
153 tr.load_stacktrace(st);
155 backward::ResolvedTrace trace = tr.resolve(st[0]);
157 return { trace.object_function };
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.
AbstractService(const ServiceBuildInfo &)
Constructeur à partir d'un ServiceBuildInfo.
void build() override
Construction de niveau build du service.
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.
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,...
Interface d'un service de trace des appels de fonctions.
Structure contenant les informations pour créer un service.
Propriétés de création d'un service.
Conserve les adresses correspondantes à une pile d'appel. Cette classe est interne et ne dois pas êtr...
Informations sur la pile d'appel des fonctions.
Constructeur de chaîne de caractère unicode.
Chaîne de caractères unicode.
bool startsWith(const String &s) const
Indique si la chaîne commence par les caractères de s.
#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 -*-
std::uint32_t UInt32
Type entier non signé sur 32 bits.
@ ST_Application
Le service s'utilise au niveau de l'application.
std::int32_t Int32
Type entier signé sur 32 bits.