#include "base/utility.h"
#include "base/convert.h"
#include "base/application.h"
-#include <boost/algorithm/string/trim.hpp>
#ifdef HAVE_BACKTRACE_SYMBOLS
# include <execinfo.h>
#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.
*
path = path.SubStr(slashp + 1);
message = path + ": " + sym_demangled + " (" + String(sym_end);
-
-#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 */
+ message += " (" + Utility::GetSymbolSource(m_Frames[i]);
}
}
static boost::once_flag m_OnceFlag;
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);
#include <boost/foreach.hpp>
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp>
+#include <boost/algorithm/string/trim.hpp>
#ifdef __FreeBSD__
# include <pthread_np.h>
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.
*
public:
static String DemangleSymbolName(const String& sym);
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);