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/Array.h"
19#include "arcane/utils/Process.h"
21#include "arcane/utils/ISymbolizerService.h"
22#include "arcane/ServiceBuilder.h"
23#include "arcane/Directory.h"
25#include "arcane/ServiceFactory.h"
26#include "arcane/AbstractService.h"
83 m_application =
sbi.application();
90 if (!platform::getEnvironmentVariable(
"ARCANE_GDB_STACK").null())
91 m_want_gdb_info =
true;
92 if (!platform::getEnvironmentVariable(
"ARCANE_USE_BACKTRACE").null())
93 m_use_backtrace =
true;
104 using ProcInfoMap = std::map<unw_word_t,ProcInfo>;
105 ProcInfoMap m_proc_name_map;
106 std::mutex m_proc_name_map_mutex;
108 bool m_want_gdb_info;
109 bool m_use_backtrace;
112 ProcInfo _getFuncInfo(
void*
ip);
122LibUnwindStackTraceService::ProcInfo LibUnwindStackTraceService::
123_getFuncInfo(unw_word_t ip,unw_cursor_t* cursor)
126 std::lock_guard<std::mutex> lk(m_proc_name_map_mutex);
127 auto v = m_proc_name_map.find(ip);
128 if (v!=m_proc_name_map.end())
133 char func_name_buf[10000];
134 char demangled_func_name_buf[10000];
135 unw_get_proc_name(cursor,func_name_buf,10000,&offset);
138 char* buf = abi::__cxa_demangle (func_name_buf,demangled_func_name_buf,&len,&dstatus);
140 pi.m_base_ip = offset;
143 void* addr = (
void*)ip;
144 int r2 = dladdr(addr,&dl_info);
146 const char* dli_fname = dl_info.dli_fname;
148 void* dli_fbase = dl_info.dli_fbase;
149 pi.m_file_name = dli_fname;
150 pi.m_file_loaded_address = (unw_word_t)dli_fbase;
155 pi.m_name = std::string_view(buf);
157 pi.m_name = std::string_view(func_name_buf);
159 std::lock_guard<std::mutex> lk(m_proc_name_map_mutex);
160 m_proc_name_map.insert(ProcInfoMap::value_type(ip,pi));
172_getFuncInfo(
void*
addr)
175 std::lock_guard<std::mutex>
lk(m_proc_name_map_mutex);
177 if (v!=m_proc_name_map.end()){
187 std::cout <<
"ERROR in dladdr\n";
199 pi.m_name = std::string_view(buf);
203 std::lock_guard<std::mutex>
lk(m_proc_name_map_mutex);
212String LibUnwindStackTraceService::
223 for (i =0; i < size; ++i) {
267 message += func_name;
284 message +=
"\nFileAndOffsetStack:{{\n";
321 message += func_name;
359 intptr_t
ip = f.address();
366 message += func_name;
393 intptr_t
ip = f.address();
395 message += (
pinfo.fileName() ?
pinfo.fileName() :
"()");
430 m_llvm_symbolizer_path = platform::getEnvironmentVariable(
"ARCANE_LLVMSYMBOLIZER_PATH");
435 String m_llvm_symbolizer_path;
436 bool m_is_check_done;
447 Int64 length = platform::getFileLength(
fullpath);
451 m_is_check_done =
true;
464 std::stringstream
ostr;
468 for( Integer i=0, n=
frames.size(); i<n; ++i ){
494 args.setCommand(m_llvm_symbolizer_path);
498 args.addArguments(
"--demangle");
499 args.addArguments(
"--pretty-print");
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro pour déclarer une interface lors de l'enregistrement d'un service.
Classe de base d'un service.
Classe gérant un répertoire.
Interface de l'application.
Interface d'un service de récupération des symboles du code source.
virtual String stackTrace(ConstArrayView< StackFrame > frames)=0
Informations pour la pile d'appel frames.
String stackTrace(ConstArrayView< StackFrame > frames) override
Informations pour la pile d'appel frames.
void _checkValid()
Vérifie que le chemin spécifié est valid.
void build() override
Construction de niveau build du service.
Service de trace des appels de fonctions utilisant la libunwind.
StackTrace _backtraceStackTrace(const FixedStackFrameArray &stack_frames)
Pile d'appel via la fonction backtrace.
FixedStackFrameArray _backtraceStackFrame(int first_function)
Pile d'appel via la fonction backtrace.
String _generateFileAndOffset(const FixedStackFrameArray &stack_frames)
Génère liste des noms de fichier et offset d'une pile d'appel.
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
Retourne la pile à d'appel actuelle.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
ByteConstArrayView outputBytes() const
Contient le résultat de la sortie standard (STDOUT) du processus.
static ProcessExecArgs::ExecStatus execute(ProcessExecArgs &args)
Exécute un processus dont les infos sont contenues dans args.
Structure contenant les informations pour créer un service.
Propriétés de création d'un service.
Vue constante d'un tableau de type T.
Conserve une liste de taille fixe maximale de StackFrame.
Interface d'un service de trace des appels de fonctions.
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.
String toString() const
Retourne la chaîne de caractères construite.
Chaîne de caractères unicode.
TraceMessage pinfo() const
Flot pour un message d'information en parallèle.
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro pour enregistrer un service.
Integer len(const char *s)
Retourne la longueur de la chaîne s.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Integer arcaneCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
@ ST_Application
Le service s'utilise au niveau de l'application.
const char * m_file_name
Nom de la bibliothèque (.so ou .exe) dans laquelle se trouve la méthode.
const char * fileName() const
Nom du fichier contenant la procédure. Peut-être nul.
unw_word_t m_file_loaded_address
Adresse de chargement de la bibliothèque.
String m_name
Nom (démanglé) de la procédure.