backtracexx: LICENSE README VERSION backtracexx.cpp backtracexx.hpp example.cpp makefile

pluto cvs at pld-linux.org
Thu Aug 24 04:27:58 CEST 2006


Author: pluto
Date: Thu Aug 24 04:27:55 2006
New Revision: 7683

Added:
   backtracexx/LICENSE
   backtracexx/README
   backtracexx/VERSION
   backtracexx/backtracexx.cpp
   backtracexx/backtracexx.hpp
   backtracexx/example.cpp
   backtracexx/makefile
Log:
- inital import.


Added: backtracexx/LICENSE
==============================================================================
--- (empty file)
+++ backtracexx/LICENSE	Thu Aug 24 04:27:55 2006
@@ -0,0 +1 @@
+http://www.opensource.org/licenses/lgpl-license.php

Added: backtracexx/README
==============================================================================
--- (empty file)
+++ backtracexx/README	Thu Aug 24 04:27:55 2006
@@ -0,0 +1,5 @@
+A backtrace is a summary of how your program got where it is.
+Unfortunately glibc's backtrace() and gdb's (bt) produce an unwind
+path instead of true backtrace. This small library uses an unwind
+informations to produce true backtrace with optionally demangled symbols
+and allows you to embed backtracing facility into your application.

Added: backtracexx/VERSION
==============================================================================
--- (empty file)
+++ backtracexx/VERSION	Thu Aug 24 04:27:55 2006
@@ -0,0 +1 @@
+0.1

Added: backtracexx/backtracexx.cpp
==============================================================================
--- (empty file)
+++ backtracexx/backtracexx.cpp	Thu Aug 24 04:27:55 2006
@@ -0,0 +1,65 @@
+#include "backtracexx.hpp"
+#include <cxxabi.h>
+#include <dlfcn.h>
+#include <unwind.h>
+#include <iostream>
+#include <iomanip>
+#include <sstream>
+
+namespace backtracexx
+{
+	namespace
+	{
+		unsigned char const* callpoint( unsigned char const* ip )
+		{
+			// not implemented yet.
+			return ip;
+		}
+
+		_Unwind_Reason_Code helper( struct _Unwind_Context* ctx, void* arg )
+		{
+			_Unwind_Ptr ip = _Unwind_GetIP( ctx );
+			reinterpret_cast< raw_backtrace_type* >( arg )->push_back(
+				callpoint( reinterpret_cast< unsigned char const* >( ip ) ) );
+			return _URC_NO_REASON;
+		}
+	}
+
+	raw_backtrace_type scan()
+	{
+		raw_backtrace_type trace;
+		_Unwind_Backtrace( helper, &trace );
+		return trace;
+	}
+
+	symbolic_backtrace_type symbols( raw_backtrace_type const& bt )
+	{
+		std::ostringstream os;
+		os.setf( std::ios_base::hex, std::ios_base::basefield );
+		os.setf( std::ios_base::showbase );
+		symbolic_backtrace_type sbt;
+		for ( raw_backtrace_type::const_iterator i = bt.begin(), e = bt.end(); i != e; ++i )
+		{
+			os.str( std::string() );
+			Dl_info info;
+			if ( dladdr( *i, &info ) )
+			{
+				long offset = reinterpret_cast< long >( *i ) - reinterpret_cast< long >( info.dli_saddr );
+				int status;
+				char* demangled = abi::__cxa_demangle( info.dli_sname, 0, 0, &status );
+				if ( status != -1 )
+				{
+					os	<< std::setw( 18 ) << *i << " : "
+						<< ( ( status == 0 ) ? demangled : info.dli_sname )
+						<< '+' << offset << " from " << info.dli_fname;
+					if ( status == 0 )
+						free( demangled );
+				}
+			}
+			else
+				os << std::setw( 18 ) << *i << " ??";
+			sbt.push_back( os.str() );
+		}
+		return sbt;
+	}
+}

Added: backtracexx/backtracexx.hpp
==============================================================================
--- (empty file)
+++ backtracexx/backtracexx.hpp	Thu Aug 24 04:27:55 2006
@@ -0,0 +1,16 @@
+#ifndef backtracexx_hpp
+#define backtracexx_hpp
+
+#include <list>
+#include <string>
+
+namespace backtracexx
+{
+	typedef std::list< void const* > raw_backtrace_type;
+	typedef std::list< std::string > symbolic_backtrace_type;
+
+	raw_backtrace_type scan();
+	symbolic_backtrace_type symbols( raw_backtrace_type const& );
+}
+
+#endif

Added: backtracexx/example.cpp
==============================================================================
--- (empty file)
+++ backtracexx/example.cpp	Thu Aug 24 04:27:55 2006
@@ -0,0 +1,25 @@
+#include "backtracexx.hpp"
+#include <iostream>
+#include <iterator>
+
+void zoo()
+{
+	backtracexx::symbolic_backtrace_type s = backtracexx::symbols( backtracexx::scan() );
+	std::copy(s.begin(), s.end(), std::ostream_iterator< std::string >( std::cout, "\n" ) );
+}
+
+void bar( void ( *f )() )
+{
+	f();
+}
+
+void foo()
+{
+	bar( &zoo );
+}
+
+int main()
+{
+	foo();
+	return 0;
+}

Added: backtracexx/makefile
==============================================================================
--- (empty file)
+++ backtracexx/makefile	Thu Aug 24 04:27:55 2006
@@ -0,0 +1,15 @@
+CXX := g++
+CXXFLAGS += -Wall -Werror -pedantic
+
+all: libbacktracexx.so example
+
+libbacktracexx.so: backtracexx.hpp backtracexx.cpp
+	$(CXX) backtracexx.cpp -o libbacktracexx.so -shared -ldl $(CXXFLAGS) \
+	-O3 -fpic -funwind-tables -fno-exceptions -fno-rtti
+
+example: example.cpp libbacktracexx.so
+	$(CXX) example.cpp -o example ./libbacktracexx.so $(CXXFLAGS) \
+	-O1 -rdynamic -funwind-tables
+
+clean:
+	rm -f libbacktracexx.so example


More information about the pld-cvs-commit mailing list