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;
        };
 
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to