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
53 , m_human_readable(
true)
66 if (v.value() < 0 || v.value() > 4) {
69 m_verbose_level = v.value();
78 m_human_readable = (v.value() != 0);
89 Int32 m_verbose_level;
90 bool m_human_readable;
101 constexpr size_t hexa_buf_size = 100;
102 char hexa[hexa_buf_size + 1];
104 backward::StackTrace st;
105 st.skip_n_firsts(first_function);
108 backward::TraceResolver tr;
109 tr.load_stacktrace(st);
111 backward::SnippetFactory sf;
113 for (
size_t i = 0; i < st.size(); ++i) {
114 backward::ResolvedTrace trace = tr.resolve(st[i]);
116 snprintf(hexa, hexa_buf_size,
"%14p", trace.addr);
119 message += trace.object_function;
121 UInt32 src_line = trace.source.line;
123 if (m_verbose_level > 0 && src_line > 0) {
125 if (m_verbose_level > 1 || !arcane_function) {
126 auto lines = sf.get_snippet(trace.source.filename, src_line, 5);
127 if (m_human_readable) {
128 message +=
"\n Line: ";
130 message +=
" -- File: ";
131 message += trace.source.filename;
135 message += trace.source.filename;
139 if (m_verbose_level > 3 || (m_verbose_level > 2 && !arcane_function)) {
140 for (
const auto& [line_num, line] : lines) {
141 message += (line_num == src_line ?
"\n >>> " :
"\n ");
150 if (m_human_readable)
158 return { stack_frames, message };
167 backward::StackTrace st;
168 st.skip_n_firsts(function_index);
174 backward::TraceResolver tr;
175 tr.load_stacktrace(st);
177 backward::ResolvedTrace trace = tr.resolve(st[0]);
179 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.
Classe template pour convertir un type.
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.