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