SVN: backtracexx: backtracexx.cpp backtracexx.hpp
pluto
pluto at pld-linux.org
Wed Mar 19 22:45:07 CET 2008
Author: pluto
Date: Wed Mar 19 22:45:07 2008
New Revision: 9648
Modified:
backtracexx/backtracexx.cpp
backtracexx/backtracexx.hpp
Log:
- export bool lookupSymbol( Frame& ).
- make Frame constructor explicit.
--Ta li nastêpne zostan± zignorowane--
M backtracexx.cpp
M backtracexx.hpp
Modified: backtracexx/backtracexx.cpp
==============================================================================
--- backtracexx/backtracexx.cpp (original)
+++ backtracexx/backtracexx.cpp Wed Mar 19 22:45:07 2008
@@ -36,111 +36,107 @@
namespace backtracexx
{
- namespace
- {
#if defined( __GNUC__ )
- bool lookupSymbol( Frame& frame )
+ bool lookupSymbol( Frame& frame )
+ {
+ Dl_info info;
+ if ( ::dladdr( reinterpret_cast< void* >( frame.address ), &info ) )
{
- Dl_info info;
- if ( ::dladdr( reinterpret_cast< void* >( frame.address ), &info ) )
+ frame.moduleBaseAddress = reinterpret_cast< unsigned long >( info.dli_fbase );
+ if ( info.dli_fname && std::strlen( info.dli_fname ) )
+ frame.moduleName = info.dli_fname;
+ if ( info.dli_saddr )
{
- frame.moduleBaseAddress = reinterpret_cast< unsigned long >( info.dli_fbase );
- if ( info.dli_fname && std::strlen( info.dli_fname ) )
- frame.moduleName = info.dli_fname;
- if ( info.dli_saddr )
+ frame.displacement = frame.address - reinterpret_cast< unsigned long >( info.dli_saddr );
+ int status;
+ char* demangled = abi::__cxa_demangle( info.dli_sname, 0, 0, &status );
+ if ( status != -1 )
{
- frame.displacement = frame.address - reinterpret_cast< unsigned long >( info.dli_saddr );
- int status;
- char* demangled = abi::__cxa_demangle( info.dli_sname, 0, 0, &status );
- if ( status != -1 )
+ if ( status == 0 )
{
- if ( status == 0 )
- {
- frame.symbol = demangled;
- std::free( demangled );
- }
- else
- frame.symbol = info.dli_sname;
+ frame.symbol = demangled;
+ std::free( demangled );
}
+ else
+ frame.symbol = info.dli_sname;
}
- return true;
}
- return false;
+ return true;
}
+ return false;
+ }
+ namespace
+ {
_Unwind_Reason_Code helper( struct _Unwind_Context* ctx, Trace* trace )
{
- Frame frame;
_Unwind_Ptr ip;
#if ( __GNUC__ >= 4 ) && ( __GNUC_PATCHLEVEL__ >= 2 )
int beforeInsn;
ip = _Unwind_GetIPInfo( ctx, &beforeInsn );
+ Frame frame( ip );
if ( beforeInsn )
frame.signalTrampoline = true;
-
#else
-
ip = _Unwind_GetIP( ctx );
-
+ Frame frame( ip );
#endif
-
- frame.address = ip;
lookupSymbol( frame );
trace->push_back( frame );
return _URC_NO_REASON;
}
+ }
#elif defined( _MSC_VER ) && defined( WIN32 )
- bool lookupSymbol( Frame& frame )
- {
- ::MEMORY_BASIC_INFORMATION mbi;
- if ( !::VirtualQuery( reinterpret_cast< ::LPCVOID >( frame.address ), &mbi, sizeof( mbi ) ) )
- return false;
- ::CHAR moduleName[ MAX_PATH ];
- ::GetModuleFileNameA( reinterpret_cast< ::HMODULE >( mbi.AllocationBase ), moduleName, sizeof( moduleName ) );
- if ( mbi.Protect & PAGE_NOACCESS )
- return false;
- frame.moduleBaseAddress = reinterpret_cast< unsigned long >( mbi.AllocationBase );
- frame.moduleName = moduleName;
- int const MaxSymbolNameLength = 8192;
- ::BYTE symbolBuffer[ sizeof( ::IMAGEHLP_SYMBOL64 ) + MaxSymbolNameLength ];
- ::PIMAGEHLP_SYMBOL64 symbol = reinterpret_cast< ::PIMAGEHLP_SYMBOL64 >( symbolBuffer );
- symbol->SizeOfStruct = sizeof( symbolBuffer );
- symbol->MaxNameLength = MaxSymbolNameLength - 1;
- if ( ::SymLoadModule64( ::GetCurrentProcess(), 0, moduleName, 0,
- reinterpret_cast< ::DWORD64 >( mbi.AllocationBase ), 0 ) )
+ bool lookupSymbol( Frame& frame )
+ {
+ ::MEMORY_BASIC_INFORMATION mbi;
+ if ( !::VirtualQuery( reinterpret_cast< ::LPCVOID >( frame.address ), &mbi, sizeof( mbi ) ) )
+ return false;
+ ::CHAR moduleName[ MAX_PATH ];
+ ::GetModuleFileNameA( reinterpret_cast< ::HMODULE >( mbi.AllocationBase ), moduleName, sizeof( moduleName ) );
+ if ( mbi.Protect & PAGE_NOACCESS )
+ return false;
+ frame.moduleBaseAddress = reinterpret_cast< unsigned long >( mbi.AllocationBase );
+ frame.moduleName = moduleName;
+ int const MaxSymbolNameLength = 8192;
+ ::BYTE symbolBuffer[ sizeof( ::IMAGEHLP_SYMBOL64 ) + MaxSymbolNameLength ];
+ ::PIMAGEHLP_SYMBOL64 symbol = reinterpret_cast< ::PIMAGEHLP_SYMBOL64 >( symbolBuffer );
+ symbol->SizeOfStruct = sizeof( symbolBuffer );
+ symbol->MaxNameLength = MaxSymbolNameLength - 1;
+ if ( ::SymLoadModule64( ::GetCurrentProcess(), 0, moduleName, 0,
+ reinterpret_cast< ::DWORD64 >( mbi.AllocationBase ), 0 ) )
+ {
+ ::DWORD64 displacement;
+ if ( ::SymGetSymFromAddr64( ::GetCurrentProcess(), static_cast< ::DWORD64 >( frame.address ),
+ &displacement, symbol ) )
{
- ::DWORD64 displacement;
- if ( ::SymGetSymFromAddr64( ::GetCurrentProcess(), static_cast< ::DWORD64 >( frame.address ),
- &displacement, symbol ) )
+ frame.symbol = symbol->Name;
+ frame.displacement = static_cast< unsigned long >( displacement );
+ ::IMAGEHLP_LINE64 line;
+ line.SizeOfStruct = sizeof( ::IMAGEHLP_LINE64 );
+ ::DWORD lineDisplacement;
+ if ( ::SymGetLineFromAddr64( ::GetCurrentProcess(), frame.address, &lineDisplacement, &line ) )
{
- frame.symbol = symbol->Name;
- frame.displacement = static_cast< unsigned long >( displacement );
- ::IMAGEHLP_LINE64 line;
- line.SizeOfStruct = sizeof( ::IMAGEHLP_LINE64 );
- ::DWORD lineDisplacement;
- if ( ::SymGetLineFromAddr64( ::GetCurrentProcess(), frame.address, &lineDisplacement, &line ) )
- {
- frame.fileName = line.FileName;
- frame.lineNumber = line.LineNumber;
- }
+ frame.fileName = line.FileName;
+ frame.lineNumber = line.LineNumber;
}
- ::SymUnloadModule64( ::GetCurrentProcess(), reinterpret_cast< ::DWORD64 >( mbi.AllocationBase ) );
}
- return true;
+ ::SymUnloadModule64( ::GetCurrentProcess(), reinterpret_cast< ::DWORD64 >( mbi.AllocationBase ) );
}
+ return true;
+ }
#endif
- }
- Frame::Frame()
+ Frame::Frame( unsigned long address )
:
- address(), displacement(), lineNumber(), signalTrampoline( boost::logic::indeterminate )
+ address( address ), displacement(), lineNumber(), signalTrampoline( boost::logic::indeterminate )
{
}
@@ -166,8 +162,7 @@
if ( ctx )
{
context = *ctx;
- Frame frame;
- frame.address = context.Eip;
+ Frame frame( context.Eip );
lookupSymbol( frame );
trace.push_back( frame );
}
@@ -196,8 +191,7 @@
//
if ( !offset )
break;
- Frame frame;
- frame.address = offset;
+ Frame frame( offset );
if ( lookupSymbol( frame ) )
trace.push_back( frame );
}
Modified: backtracexx/backtracexx.hpp
==============================================================================
--- backtracexx/backtracexx.hpp (original)
+++ backtracexx/backtracexx.hpp Wed Mar 19 22:45:07 2008
@@ -39,7 +39,7 @@
{
struct BACKTRACEXX_EXPORT Frame
{
- Frame();
+ explicit Frame( unsigned long address );
unsigned long address;
std::string symbol;
@@ -58,6 +58,7 @@
// ex != 0, scan() stack from specified context (e.g. passed from SEH handler).
//
BACKTRACEXX_EXPORT Trace scan( ::PCONTEXT /* not used on linux */ ctx = 0 );
+ BACKTRACEXX_EXPORT bool lookupSymbol( Frame& );
BACKTRACEXX_EXPORT std::ostream& operator << ( std::ostream&, Trace const& );
}
More information about the pld-cvs-commit
mailing list