diff --git a/pykd/module.cpp b/pykd/module.cpp index 0ac28ac..11f2575 100644 --- a/pykd/module.cpp +++ b/pykd/module.cpp @@ -299,14 +299,13 @@ std::string Module::getSymbolNameByVa( ULONG64 offset, bool showDisplacement ) /////////////////////////////////////////////////////////////////////////////////// -python::tuple Module::getSymbolAndDispByVa( ULONG64 offset ) +void Module::getSymbolAndDispByVa( ULONG64 offset, std::string &symbolName, LONG &displacement) { offset = prepareVa(offset); - LONG displacement = 0; SymbolPtr sym = getSymSession()->findByRva( (ULONG)(offset - m_base ), SymTagNull, &displacement ); - return python::make_tuple(sym->getName(), displacement); + symbolName = sym->getName(); } /////////////////////////////////////////////////////////////////////////////////// diff --git a/pykd/module.h b/pykd/module.h index 0f08607..464558c 100644 --- a/pykd/module.h +++ b/pykd/module.h @@ -133,7 +133,7 @@ public: std::string getSymbolNameByVa( ULONG64 offset, bool showDisplacement = true ); - python::tuple getSymbolAndDispByVa( ULONG64 offset ); + void getSymbolAndDispByVa( ULONG64 offset, std::string &symbolName, LONG &displacement); void getSourceLine( ULONG64 offset, std::string &fileName, ULONG &lineNo, LONG &displacement ); diff --git a/pykd/python/pymod.cpp b/pykd/python/pymod.cpp index f6cd518..4fa0d29 100644 --- a/pykd/python/pymod.cpp +++ b/pykd/python/pymod.cpp @@ -231,8 +231,10 @@ BOOST_PYTHON_MODULE( pykd ) "Return source file name, line and displacement by the specified offset" ) ); python::def( "getOffset", &TypeInfo::getOffset, "Return traget virtual address for specified symbol" ); - python::def( "findSymbol", &TypeInfo::findSymbol, findSymbol_( python::args( "offset", "safe"), + python::def( "findSymbol", &TypeInfo::findSymbol, findSymbol_( python::args( "offset", "showDisplacement"), "Find symbol by the target virtual memory offset" ) ); + python::def("findSymbolAndDisp", &pysupport::findSymbolAndDisp, + "Return tuple(symbol_name, displacement) by virtual address" ); python::def( "sizeof", &TypeInfo::getSymbolSize, "Return a size of the type or variable" ); python::def("typedVarList", &getTypedVarListByTypeName, @@ -376,7 +378,7 @@ BOOST_PYTHON_MODULE( pykd ) "Return offset of the symbol" ) .def("findSymbol", &Module::getSymbolNameByVa, Module_findSymbol( python::args("offset", "showDisplacement"), "Return symbol name by virtual address" ) ) - .def("findSymbolAndDisp", &Module::getSymbolAndDispByVa, + .def("findSymbolAndDisp", &pysupport::moduleFindSymbolAndDisp, "Return tuple(symbol_name, displacement) by virtual address" ) .def("rva", &Module::getSymbolRva, "Return rva of the symbol" ) diff --git a/pykd/python/pysupport.cpp b/pykd/python/pysupport.cpp index 0f6ed06..3aeb444 100644 --- a/pykd/python/pysupport.cpp +++ b/pykd/python/pysupport.cpp @@ -2,6 +2,7 @@ #include "pysupport.h" #include "dbgengine.h" +#include "typeinfo.h" #include /////////////////////////////////////////////////////////////////////////////// @@ -32,6 +33,27 @@ python::tuple getBugCheckData() return python::make_tuple(bugCheckData.code, bugCheckData.arg1, bugCheckData.arg2, bugCheckData.arg3, bugCheckData.arg4); } +python::tuple findSymbolAndDisp( ULONG64 offset ) +{ + std::string symbolName; + LONG displacement; + + pykd::TypeInfo::findSymbolAndDisp( offset, symbolName, displacement ); + + return python::make_tuple(symbolName,displacement); +} + +python::tuple moduleFindSymbolAndDisp( pykd::Module &module, ULONG64 offset ) +{ + std::string symbolName; + LONG displacement; + + module.getSymbolAndDispByVa( offset, symbolName, displacement ); + + return python::make_tuple(symbolName,displacement); +} + + /////////////////////////////////////////////////////////////////////////////// } } //pykd::support namespace end \ No newline at end of file diff --git a/pykd/python/pysupport.h b/pykd/python/pysupport.h index 0e90640..f8c7bdc 100644 --- a/pykd/python/pysupport.h +++ b/pykd/python/pysupport.h @@ -2,6 +2,8 @@ #include +#include "module.h" + /////////////////////////////////////////////////////////////////////////////// namespace pykd { @@ -11,6 +13,10 @@ python::list getProcessThreads(); python::tuple getBugCheckData(); +python::tuple findSymbolAndDisp( ULONG64 offset ); + +python::tuple moduleFindSymbolAndDisp( pykd::Module &module, ULONG64 offset ); + } } //pykd::support namespace end /////////////////////////////////////////////////////////////////////////////// diff --git a/pykd/typeinfo.cpp b/pykd/typeinfo.cpp index d5f1fb7..da2ad2b 100644 --- a/pykd/typeinfo.cpp +++ b/pykd/typeinfo.cpp @@ -74,23 +74,15 @@ ULONG64 TypeInfo::getSymbolSize( const std::string &fullName ) ///////////////////////////////////////////////////////////////////////////////////// -std::string TypeInfo::findSymbol( ULONG64 offset, bool safe) +std::string TypeInfo::findSymbol( ULONG64 offset, bool showDisplacement) { - if ( !safe ) - { - ModulePtr module = Module::loadModuleByOffset( offset ); - - return module->getName() + '!' + module->getSymbolNameByVa( offset ); - } - try { ModulePtr module = Module::loadModuleByOffset( offset ); try { - - return module->getName() + '!' + module->getSymbolNameByVa( offset ); - + std::string symbolName = module->getSymbolNameByVa( offset, showDisplacement ); + return module->getName() + '!' + symbolName; } catch( DbgException& ) { @@ -110,6 +102,17 @@ std::string TypeInfo::findSymbol( ULONG64 offset, bool safe) ///////////////////////////////////////////////////////////////////////////////////// +void TypeInfo::findSymbolAndDisp( ULONG64 offset, std::string &symbolName, LONG &displacement ) +{ + ModulePtr module = Module::loadModuleByOffset( offset ); + + module->getSymbolAndDispByVa( offset, symbolName, displacement ); + + symbolName = module->getName() + '!' + symbolName; +} + +///////////////////////////////////////////////////////////////////////////////////// + ULONG64 TypeInfo::getOffset( const std::string &fullName ) { std::string moduleName; diff --git a/pykd/typeinfo.h b/pykd/typeinfo.h index 87c455f..f1a958d 100644 --- a/pykd/typeinfo.h +++ b/pykd/typeinfo.h @@ -29,7 +29,10 @@ public: ULONG64 getSymbolSize( const std::string &symName ); static - std::string findSymbol( ULONG64 offset, bool safe = true ); + std::string findSymbol( ULONG64 offset, bool showDisplacement = true ); + + static + void findSymbolAndDisp( ULONG64 offset, std::string &symbolName, LONG &displacement ); static ULONG64 getOffset( const std::string &symbolName ); diff --git a/test/scripts/moduletest.py b/test/scripts/moduletest.py index 317205f..44b6e30 100644 --- a/test/scripts/moduletest.py +++ b/test/scripts/moduletest.py @@ -52,14 +52,19 @@ class ModuleTest( unittest.TestCase ): def testFindSymbol( self ): self.assertEqual( "FuncWithName0", target.module.findSymbol( target.module.offset("FuncWithName0") ) ) self.assertEqual( "_FuncWithName2", target.module.findSymbol( target.module.offset("_FuncWithName2") ) ) - + self.assertEqual( "targetapp!FuncWithName0", pykd.findSymbol( target.module.offset("FuncWithName0") ) ) + self.assertEqual( "targetapp!_FuncWithName2", pykd.findSymbol( target.module.offset("_FuncWithName2") ) ) self.assertEqual( "_FuncWithName2+10", target.module.findSymbol( target.module.offset("_FuncWithName2") + 0x10 ) ) self.assertEqual( "_FuncWithName2", target.module.findSymbol( target.module.offset("_FuncWithName2") + 0x10, showDisplacement = False ) ) + self.assertEqual( "targetapp!_FuncWithName2+10", pykd.findSymbol( target.module.offset("_FuncWithName2") + 0x10 ) ) + self.assertEqual( "targetapp!_FuncWithName2", pykd.findSymbol( target.module.offset("_FuncWithName2") + 0x10, showDisplacement = False ) ) def testFindSymbolAndDisp( self ): vaFuncWithName0 = target.module.offset("FuncWithName0") self.assertEqual( ("FuncWithName0", 0), target.module.findSymbolAndDisp(vaFuncWithName0) ) self.assertEqual( ("FuncWithName0", 2), target.module.findSymbolAndDisp(vaFuncWithName0+2) ) + self.assertEqual( ("targetapp!FuncWithName0", 0), pykd.findSymbolAndDisp(vaFuncWithName0) ) + self.assertEqual( ("targetapp!FuncWithName0", 2), pykd.findSymbolAndDisp(vaFuncWithName0+2) ) def testType( self ): self.assertEqual( "structTest", target.module.type("structTest").name() ); diff --git a/test/scripts/pykdtest.py b/test/scripts/pykdtest.py index 725fc40..a74610b 100644 --- a/test/scripts/pykdtest.py +++ b/test/scripts/pykdtest.py @@ -72,3 +72,7 @@ if __name__ == "__main__": target.moduleName = os.path.splitext(os.path.basename(target.appPath))[0] unittest.TextTestRunner(stream=sys.stdout, verbosity=2).run( getTestSuite() ) + + #unittest.TextTestRunner(stream=sys.stdout, verbosity=2).run( getTestSuite("moduletest.ModuleTest.testFindSymbol") ) + + raw_input()