mirror of
https://github.com/Icinga/icinga2.git
synced 2025-09-23 17:57:54 +02:00
parent
09f1c46714
commit
27955843c0
@ -22,7 +22,6 @@
|
|||||||
#include "base/utility.h"
|
#include "base/utility.h"
|
||||||
#include "base/convert.h"
|
#include "base/convert.h"
|
||||||
#include "base/application.h"
|
#include "base/application.h"
|
||||||
#include <boost/algorithm/string/trim.hpp>
|
|
||||||
|
|
||||||
#ifdef HAVE_BACKTRACE_SYMBOLS
|
#ifdef HAVE_BACKTRACE_SYMBOLS
|
||||||
# include <execinfo.h>
|
# include <execinfo.h>
|
||||||
@ -100,43 +99,6 @@ void StackTrace::Initialize(void)
|
|||||||
#endif /* _WIN32 */
|
#endif /* _WIN32 */
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Looks up source file name and line number information for the specified
|
|
||||||
* ELF executable and RVA.
|
|
||||||
*
|
|
||||||
* @param exe The ELF file.
|
|
||||||
* @param rva The RVA.
|
|
||||||
* @returns Source file and line number.
|
|
||||||
*/
|
|
||||||
String StackTrace::Addr2Line(const String& exe, uintptr_t rva)
|
|
||||||
{
|
|
||||||
#ifndef _WIN32
|
|
||||||
std::ostringstream msgbuf;
|
|
||||||
msgbuf << "addr2line -s -e " << Application::GetExePath(exe) << " " << std::hex << rva << " 2>/dev/null";
|
|
||||||
|
|
||||||
String args = msgbuf.str();
|
|
||||||
|
|
||||||
FILE *fp = popen(args.CStr(), "r");
|
|
||||||
|
|
||||||
if (!fp)
|
|
||||||
return "RVA: " + Convert::ToString(rva);
|
|
||||||
|
|
||||||
char buffer[512] = {};
|
|
||||||
fgets(buffer, sizeof(buffer), fp);
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
String line = buffer;
|
|
||||||
boost::algorithm::trim_right(line);
|
|
||||||
|
|
||||||
if (line.GetLength() == 0)
|
|
||||||
return "RVA: " + Convert::ToString(rva);
|
|
||||||
|
|
||||||
return line;
|
|
||||||
#else /* _WIN32 */
|
|
||||||
return String();
|
|
||||||
#endif /* _WIN32 */
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prints a stacktrace to the specified stream.
|
* Prints a stacktrace to the specified stream.
|
||||||
*
|
*
|
||||||
@ -176,15 +138,7 @@ void StackTrace::Print(std::ostream& fp, int ignoreFrames) const
|
|||||||
path = path.SubStr(slashp + 1);
|
path = path.SubStr(slashp + 1);
|
||||||
|
|
||||||
message = path + ": " + sym_demangled + " (" + String(sym_end);
|
message = path + ": " + sym_demangled + " (" + String(sym_end);
|
||||||
|
message += " (" + Utility::GetSymbolSource(m_Frames[i]);
|
||||||
#ifdef HAVE_DLADDR
|
|
||||||
Dl_info dli;
|
|
||||||
|
|
||||||
if (dladdr(m_Frames[i], &dli) > 0) {
|
|
||||||
uintptr_t rva = reinterpret_cast<uintptr_t>(m_Frames[i]) - reinterpret_cast<uintptr_t>(dli.dli_fbase);
|
|
||||||
message += " (" + Addr2Line(dli.dli_fname, rva) + ")";
|
|
||||||
}
|
|
||||||
#endif /* HAVE_DLADDR */
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,7 +50,6 @@ private:
|
|||||||
static boost::once_flag m_OnceFlag;
|
static boost::once_flag m_OnceFlag;
|
||||||
|
|
||||||
static void Initialize(void);
|
static void Initialize(void);
|
||||||
static String Addr2Line(const String& exe, uintptr_t rva);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
I2_BASE_API std::ostream& operator<<(std::ostream& stream, const StackTrace& trace);
|
I2_BASE_API std::ostream& operator<<(std::ostream& stream, const StackTrace& trace);
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
#include <boost/algorithm/string/split.hpp>
|
#include <boost/algorithm/string/split.hpp>
|
||||||
#include <boost/algorithm/string/classification.hpp>
|
#include <boost/algorithm/string/classification.hpp>
|
||||||
|
#include <boost/algorithm/string/trim.hpp>
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
# include <pthread_np.h>
|
# include <pthread_np.h>
|
||||||
@ -81,6 +82,69 @@ String Utility::GetTypeName(const std::type_info& ti)
|
|||||||
return DemangleSymbolName(ti.name());
|
return DemangleSymbolName(ti.name());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Looks up source file name and line number information for the specified
|
||||||
|
* ELF executable and RVA.
|
||||||
|
*
|
||||||
|
* @param exe The ELF file.
|
||||||
|
* @param rva The RVA.
|
||||||
|
* @returns Source file and line number.
|
||||||
|
*/
|
||||||
|
String Utility::Addr2Line(const String& exe, uintptr_t rva)
|
||||||
|
{
|
||||||
|
#ifndef _WIN32
|
||||||
|
std::ostringstream msgbuf;
|
||||||
|
msgbuf << "addr2line -s -e " << Application::GetExePath(exe) << " " << std::hex << rva << " 2>/dev/null";
|
||||||
|
|
||||||
|
String args = msgbuf.str();
|
||||||
|
|
||||||
|
FILE *fp = popen(args.CStr(), "r");
|
||||||
|
|
||||||
|
if (!fp)
|
||||||
|
return "RVA: " + Convert::ToString(rva);
|
||||||
|
|
||||||
|
char buffer[512] = {};
|
||||||
|
fgets(buffer, sizeof(buffer), fp);
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
String line = buffer;
|
||||||
|
boost::algorithm::trim_right(line);
|
||||||
|
|
||||||
|
if (line.GetLength() == 0)
|
||||||
|
return "RVA: " + Convert::ToString(rva);
|
||||||
|
|
||||||
|
return line;
|
||||||
|
#else /* _WIN32 */
|
||||||
|
return String();
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
}
|
||||||
|
|
||||||
|
String Utility::GetSymbolName(const void *addr)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_DLADDR
|
||||||
|
Dl_info dli;
|
||||||
|
|
||||||
|
if (dladdr(addr, &dli) > 0)
|
||||||
|
return dli.dli_sname;
|
||||||
|
#endif /* HAVE_DLADDR */
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
String Utility::GetSymbolSource(const void *addr)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_DLADDR
|
||||||
|
Dl_info dli;
|
||||||
|
|
||||||
|
if (dladdr(addr, &dli) > 0) {
|
||||||
|
uintptr_t rva = reinterpret_cast<uintptr_t>(addr) - reinterpret_cast<uintptr_t>(dli.dli_fbase);
|
||||||
|
return Addr2Line(dli.dli_fname, rva);
|
||||||
|
}
|
||||||
|
#endif /* HAVE_DLADDR */
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Performs wildcard pattern matching.
|
* Performs wildcard pattern matching.
|
||||||
*
|
*
|
||||||
|
@ -59,6 +59,9 @@ class I2_BASE_API Utility
|
|||||||
public:
|
public:
|
||||||
static String DemangleSymbolName(const String& sym);
|
static String DemangleSymbolName(const String& sym);
|
||||||
static String GetTypeName(const std::type_info& ti);
|
static String GetTypeName(const std::type_info& ti);
|
||||||
|
static String Addr2Line(const String& exe, uintptr_t rva);
|
||||||
|
static String GetSymbolName(const void *addr);
|
||||||
|
static String GetSymbolSource(const void *addr);
|
||||||
|
|
||||||
static bool Match(const String& pattern, const String& text);
|
static bool Match(const String& pattern, const String& text);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user