backtracexx: backtracexx.cpp backtracexx.hpp example.cpp

pluto cvs at pld-linux.org
Wed Aug 30 02:36:47 CEST 2006


Author: pluto
Date: Wed Aug 30 02:36:44 2006
New Revision: 7689

Modified:
   backtracexx/backtracexx.cpp
   backtracexx/backtracexx.hpp
   backtracexx/example.cpp
Log:
- signal frame support.


Modified: backtracexx/backtracexx.cpp
==============================================================================
--- backtracexx/backtracexx.cpp	(original)
+++ backtracexx/backtracexx.cpp	Wed Aug 30 02:36:44 2006
@@ -29,9 +29,12 @@
 
 		_Unwind_Reason_Code helper( struct _Unwind_Context* ctx, void* arg )
 		{
-			_Unwind_Ptr ip = _Unwind_GetIP( ctx );
-			reinterpret_cast< raw_backtrace_type* >( arg )->push_back(
-				caller( reinterpret_cast< unsigned char const* >( ip ) ) );
+			int beforeInsn = 0;
+			_Unwind_Ptr ip = _Unwind_GetIPInfo( ctx, &beforeInsn );
+			unwind_point_type up( reinterpret_cast< unsigned char const* >( ip ), beforeInsn );
+			if ( !beforeInsn )
+				up.first = caller( reinterpret_cast< unsigned char const* >( up.first ) );
+			reinterpret_cast< raw_backtrace_type* >( arg )->push_back( up );
 			return _URC_NO_REASON;
 		}
 	}
@@ -53,8 +56,9 @@
 		{
 			os.str( std::string() );
 			Dl_info info;
-			os << std::setw( 18 ) << *i << " : ";
-			if ( dladdr( const_cast< void* >( *i ), &info ) )
+			unwind_point_type up = *i;
+			os << std::setw( 18 ) << up.first << " : ";
+			if ( dladdr( const_cast< void* >( up.first ), &info ) )
 			{
 				if ( !info.dli_saddr )
 					// the image containing address is found, but no nearest symbol was found.
@@ -65,7 +69,7 @@
 					char* demangled = abi::__cxa_demangle( info.dli_sname, 0, 0, &status );
 					if ( status != -1 )
 					{
-						long offset = reinterpret_cast< long >( *i ) - reinterpret_cast< long >( info.dli_saddr );
+						long offset = reinterpret_cast< long >( up.first ) - reinterpret_cast< long >( info.dli_saddr );
 						os << ( ( status == 0 ) ? demangled : info.dli_sname ) << '+' << offset;
 						if ( status == 0 )
 							free( demangled );
@@ -75,6 +79,8 @@
 			}
 			else
 				os << "??";
+			if ( up.second )
+				os << " [signal frame]";
 			sbt.push_back( os.str() );
 		}
 		return sbt;

Modified: backtracexx/backtracexx.hpp
==============================================================================
--- backtracexx/backtracexx.hpp	(original)
+++ backtracexx/backtracexx.hpp	Wed Aug 30 02:36:44 2006
@@ -3,10 +3,14 @@
 
 #include <list>
 #include <string>
+#include <utility>
 
 namespace backtracexx
 {
-	typedef std::list< void const* > raw_backtrace_type;
+	typedef std::pair< void const*,
+		bool /* signal frame */ > unwind_point_type;
+
+	typedef std::list< unwind_point_type > raw_backtrace_type;
 	typedef std::list< std::string > symbolic_backtrace_type;
 
 	raw_backtrace_type scan();

Modified: backtracexx/example.cpp
==============================================================================
--- backtracexx/example.cpp	(original)
+++ backtracexx/example.cpp	Wed Aug 30 02:36:44 2006
@@ -1,11 +1,22 @@
 #include "backtracexx.hpp"
+#include <csetjmp>
+#include <csignal>
 #include <iostream>
 #include <iterator>
 
-void zoo()
+jmp_buf context;
+
+void signalHandler( int signalNumber )
 {
 	backtracexx::symbolic_backtrace_type s = backtracexx::symbols( backtracexx::scan() );
 	std::copy(s.begin(), s.end(), std::ostream_iterator< std::string >( std::cout, "\n" ) );
+	longjmp( context, 1 );
+}
+
+void zoo()
+{
+	volatile int* p = 0;
+	*p = 0;
 }
 
 void bar( void ( *f )() )
@@ -20,6 +31,10 @@
 
 int main()
 {
-	foo();
+	signal( SIGSEGV, signalHandler );
+	if ( setjmp( context ) == 0 )
+	{
+		foo();
+	}
 	return 0;
 }


More information about the pld-cvs-commit mailing list