SVN: backtracexx: backtracexx.cpp backtracexx.hpp
pluto
pluto at pld-linux.org
Fri Aug 24 09:13:49 CEST 2007
Author: pluto
Date: Fri Aug 24 09:13:48 2007
New Revision: 8699
Modified:
backtracexx/backtracexx.cpp
backtracexx/backtracexx.hpp
Log:
- support line info on windows.
Modified: backtracexx/backtracexx.cpp
==============================================================================
--- backtracexx/backtracexx.cpp (original)
+++ backtracexx/backtracexx.cpp Fri Aug 24 09:13:48 2007
@@ -2,6 +2,11 @@
#include <iomanip>
#include <iostream>
+//
+// TODO:
+// - use libdwarf for printing line info for ELF objects.
+//
+
#if defined( __GNUC__ )
#include <cxxabi.h>
#include <dlfcn.h>
@@ -132,6 +137,14 @@
{
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;
+ }
}
::SymUnloadModule64( ::GetCurrentProcess(), reinterpret_cast< ::DWORD64 >( mbi.AllocationBase ) );
}
@@ -142,7 +155,7 @@
Frame::Frame()
:
- address(), displacement(), signalTrampoline()
+ address(), displacement(), lineNumber(), signalTrampoline()
{
}
@@ -161,7 +174,7 @@
::HANDLE process = ::GetCurrentProcess();
::SymInitialize( process, 0, FALSE );
- ::SymSetOptions( ::SymGetOptions() | SYMOPT_UNDNAME );
+ ::SymSetOptions( ::SymGetOptions() | SYMOPT_UNDNAME | SYMOPT_LOAD_LINES );
::CONTEXT context = { 0 };
::STACKFRAME64 stackFrame = { 0 };
stackFrame.AddrPC.Mode = stackFrame.AddrFrame.Mode = stackFrame.AddrStack.Mode = AddrModeFlat;
@@ -224,6 +237,11 @@
if ( f.signalTrampoline )
os << " [signal trampoline]";
os << " [" << f.moduleName << " @ " << std::showbase << std::hex << f.moduleBaseAddress << " ]" << std::endl;
+ if ( !f.fileName.empty() )
+ {
+ static std::string filler( 14, ' ' );
+ os << filler << "at : " << f.fileName << ':' << std::dec << f.lineNumber << std::endl;
+ }
}
os << "==================" << std::endl;
return os;
Modified: backtracexx/backtracexx.hpp
==============================================================================
--- backtracexx/backtracexx.hpp (original)
+++ backtracexx/backtracexx.hpp Fri Aug 24 09:13:48 2007
@@ -34,6 +34,8 @@
unsigned long displacement;
std::string moduleName;
unsigned long moduleBaseAddress;
+ std::string fileName;
+ unsigned long lineNumber;
bool signalTrampoline;
};
More information about the pld-cvs-commit
mailing list