[0.2.x] fixed : issue #12739 ( How to use getParams()? )

git-svn-id: https://pykd.svn.codeplex.com/svn@87274 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
SND\kernelnet_cp 2014-02-11 07:52:59 +00:00 committed by Mikhail I. Izmestev
parent 64501a6598
commit 0398c9358e
8 changed files with 192 additions and 19 deletions

View File

@ -2,7 +2,7 @@
#define PYKD_VERSION_MAJOR 0 #define PYKD_VERSION_MAJOR 0
#define PYKD_VERSION_MINOR 2 #define PYKD_VERSION_MINOR 2
#define PYKD_VERSION_SUBVERSION 0 #define PYKD_VERSION_SUBVERSION 0
#define PYKD_VERSION_BUILDNO 27 #define PYKD_VERSION_BUILDNO 28
#define __VER_STR2__(x) #x #define __VER_STR2__(x) #x

View File

@ -77,7 +77,7 @@ BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS( Module_findSymbol, Module::getSymbolName
BOOST_PYTHON_MODULE( pykd ) BOOST_PYTHON_MODULE( pykd )
{ {
python::scope().attr("version") = pykdVersion; python::scope().attr("__version__") = pykdVersion;
// DbgEng services // DbgEng services
python::def( "setSymSrvDir", &setSymSrvDir, python::def( "setSymSrvDir", &setSymSrvDir,
@ -574,7 +574,8 @@ BOOST_PYTHON_MODULE( pykd )
"Class for access to local vars", python::no_init ) "Class for access to local vars", python::no_init )
.def("__len__", &ScopeVars::getVarCount ) .def("__len__", &ScopeVars::getVarCount )
.def("__getitem__", &ScopeVars::getVarByIndex ) .def("__getitem__", &ScopeVars::getVarByIndex )
.def("__getitem__", &ScopeVars::getVarByName ); .def("__getitem__", &ScopeVars::getVarByName )
.def("__contains__", &ScopeVars::isContainsVar );
python::class_<StackFrame, StackFramePtr,boost::noncopyable>( "stackFrame", python::class_<StackFrame, StackFramePtr,boost::noncopyable>( "stackFrame",
"Class representing a frame of the call stack", python::no_init ) "Class representing a frame of the call stack", python::no_init )

View File

@ -260,15 +260,20 @@ python::object StackFrame::getParamByName( const std::string& name )
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
ULONG StackFrame::getLocalCount() bool StackFrame::isContainsLocal( const std::string& name )
{ {
ULONG count = 0; ModulePtr mod = Module::loadModuleByOffset( m_instructionOffset);
ModulePtr mod;
mod = Module::loadModuleByOffset( m_instructionOffset);
LONG displacemnt; LONG displacemnt;
SymbolPtr func = mod->getSymbolByVa( m_instructionOffset, SymTagFunction, &displacemnt ); SymbolPtr func;
try {
func = mod->getSymbolByVa( m_instructionOffset, SymTagFunction, &displacemnt );
}
catch(SymbolException&)
{
return false;
}
#ifdef _DEBUG #ifdef _DEBUG
std::string funcName; std::string funcName;
@ -277,7 +282,120 @@ ULONG StackFrame::getLocalCount()
if (!IsInDebugRange(func, static_cast<ULONG>( m_instructionOffset - mod->getBase()))) if (!IsInDebugRange(func, static_cast<ULONG>( m_instructionOffset - mod->getBase())))
{ {
throw DbgException("is not debug range"); return false;
}
// find var in current scope
SymbolPtrList symList = func->findChildren(SymTagData);
SymbolPtrList::iterator itVar = symList.begin();
for (; itVar != symList.end(); ++itVar)
{
if ( (*itVar)->getName() == name )
{
return true;
}
}
if ( itVar == symList.end() )
{
// find inners scopes
SymbolPtrList scopeList = func->findChildren(SymTagBlock);
SymbolPtrList::iterator itScope = scopeList.begin();
ULONG ipRva = static_cast<ULONG>( m_instructionOffset - mod->getBase());
for (; itScope != scopeList.end(); ++itScope)
{
SymbolPtr scope = *itScope;
ULONG scopeRva = scope->getRva();
if (scopeRva <= ipRva && (scopeRva + scope->getSize()) > ipRva)
{
SymbolPtrList symList = scope->findChildren(SymTagData);
SymbolPtrList::iterator itVar = symList.begin();
for (; itVar != symList.end(); ++itVar)
{
if ( (*itVar)->getName() == name )
{
return true;
}
}
}
}
}
return false;
}
////////////////////////////////////////////////////////////////////////////////
bool StackFrame::isContainsParam( const std::string& name )
{
ModulePtr mod = Module::loadModuleByOffset( m_instructionOffset);
LONG displacemnt;
SymbolPtr func;
try {
func = mod->getSymbolByVa( m_instructionOffset, SymTagFunction, &displacemnt );
}
catch(SymbolException&)
{
return false;
}
#ifdef _DEBUG
std::string funcName;
funcName = func->getName();
#endif // _DEBUG
if (!IsInDebugRange(func, static_cast<ULONG>( m_instructionOffset - mod->getBase())))
{
return false;
}
// find var in current scope
SymbolPtrList symList = func->findChildren(SymTagData);
SymbolPtrList::iterator itVar = symList.begin();
for (; itVar != symList.end(); ++itVar)
{
if ( (*itVar)->getDataKind() == DataIsParam && (*itVar)->getName() == name )
{
return true;
}
}
return false;
}
////////////////////////////////////////////////////////////////////////////////
ULONG StackFrame::getLocalCount()
{
ULONG count = 0;
ModulePtr mod;
mod = Module::loadModuleByOffset( m_instructionOffset);
LONG displacemnt;
SymbolPtr func;
try {
func = mod->getSymbolByVa( m_instructionOffset, SymTagFunction, &displacemnt );
}
catch(SymbolException&)
{
return 0;
}
#ifdef _DEBUG
std::string funcName;
funcName = func->getName();
#endif // _DEBUG
if (!IsInDebugRange(func, static_cast<ULONG>( m_instructionOffset - mod->getBase())))
{
return 0;
} }
// find var in current scope // find var in current scope
@ -320,7 +438,15 @@ ULONG StackFrame::getParamCount()
mod = Module::loadModuleByOffset( m_instructionOffset); mod = Module::loadModuleByOffset( m_instructionOffset);
LONG displacemnt; LONG displacemnt;
SymbolPtr func = mod->getSymbolByVa( m_instructionOffset, SymTagFunction, &displacemnt ); SymbolPtr func;
try {
func = mod->getSymbolByVa( m_instructionOffset, SymTagFunction, &displacemnt );
}
catch(SymbolException&)
{
return 0;
}
#ifdef _DEBUG #ifdef _DEBUG
std::string funcName; std::string funcName;
@ -329,7 +455,7 @@ ULONG StackFrame::getParamCount()
if (!IsInDebugRange(func, static_cast<ULONG>( m_instructionOffset - mod->getBase()))) if (!IsInDebugRange(func, static_cast<ULONG>( m_instructionOffset - mod->getBase())))
{ {
throw DbgException("is not debug range"); return 0;
} }
// find var in current scope // find var in current scope
@ -352,7 +478,15 @@ python::object StackFrame::getLocalByIndex( ULONG index )
ModulePtr mod = Module::loadModuleByOffset( m_instructionOffset); ModulePtr mod = Module::loadModuleByOffset( m_instructionOffset);
LONG displacemnt; LONG displacemnt;
SymbolPtr func = mod->getSymbolByVa( m_instructionOffset, SymTagFunction, &displacemnt ); SymbolPtr func;
try {
func = mod->getSymbolByVa( m_instructionOffset, SymTagFunction, &displacemnt );
}
catch(SymbolException&)
{
throw PyException( PyExc_IndexError, "index out of range" );
}
#ifdef _DEBUG #ifdef _DEBUG
std::string funcName; std::string funcName;
@ -361,7 +495,7 @@ python::object StackFrame::getLocalByIndex( ULONG index )
if (!IsInDebugRange(func, static_cast<ULONG>( m_instructionOffset - mod->getBase()))) if (!IsInDebugRange(func, static_cast<ULONG>( m_instructionOffset - mod->getBase())))
{ {
throw DbgException("is not debug range"); throw PyException( PyExc_IndexError, "index out of range" );
} }
// find var in current scope // find var in current scope
@ -445,7 +579,15 @@ python::object StackFrame::getParamByIndex( ULONG index )
ModulePtr mod = Module::loadModuleByOffset( m_instructionOffset); ModulePtr mod = Module::loadModuleByOffset( m_instructionOffset);
LONG displacemnt; LONG displacemnt;
SymbolPtr func = mod->getSymbolByVa( m_instructionOffset, SymTagFunction, &displacemnt ); SymbolPtr func;
try {
func = mod->getSymbolByVa( m_instructionOffset, SymTagFunction, &displacemnt );
}
catch(SymbolException&)
{
throw PyException( PyExc_IndexError, "index out of range" );
}
#ifdef _DEBUG #ifdef _DEBUG
std::string funcName; std::string funcName;
@ -454,7 +596,7 @@ python::object StackFrame::getParamByIndex( ULONG index )
if (!IsInDebugRange(func, static_cast<ULONG>( m_instructionOffset - mod->getBase()))) if (!IsInDebugRange(func, static_cast<ULONG>( m_instructionOffset - mod->getBase())))
{ {
throw DbgException("is not debug range"); throw PyException( PyExc_IndexError, "index out of range" );
} }
// find var in current scope // find var in current scope

View File

@ -46,6 +46,10 @@ public:
python::object getParamByName( const std::string& name ); python::object getParamByName( const std::string& name );
bool isContainsLocal( const std::string& name );
bool isContainsParam( const std::string& name );
python::object getLocalByIndex( ULONG index ); python::object getLocalByIndex( ULONG index );
python::object getParamByIndex( ULONG index ); python::object getParamByIndex( ULONG index );
@ -71,6 +75,7 @@ public:
virtual ULONG getVarCount() const = 0; virtual ULONG getVarCount() const = 0;
virtual python::object getVarByName( const std::string &name ) = 0; virtual python::object getVarByName( const std::string &name ) = 0;
virtual python::object getVarByIndex(ULONG index) const = 0 ; virtual python::object getVarByIndex(ULONG index) const = 0 ;
virtual bool isContainsVar( const std::string &name ) = 0;
protected: protected:
@ -100,6 +105,10 @@ private:
python::object getVarByIndex(ULONG index) const { python::object getVarByIndex(ULONG index) const {
return m_frame->getLocalByIndex( index ); return m_frame->getLocalByIndex( index );
} }
bool isContainsVar( const std::string &name ) {
return m_frame->isContainsLocal(name);
}
}; };
@ -124,6 +133,10 @@ private:
python::object getVarByIndex(ULONG index) const { python::object getVarByIndex(ULONG index) const {
return m_frame->getParamByIndex(index); return m_frame->getParamByIndex(index);
} }
bool isContainsVar( const std::string &name ) {
return m_frame->isContainsParam(name);
}
}; };
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////

View File

@ -231,7 +231,13 @@ public:
} }
python::object nonzero() { python::object nonzero() {
return boost::apply_visitor( VariantToPyobj(), getValue() ) != 0; try {
return boost::apply_visitor( VariantToPyobj(), getValue() ) != 0;
}
catch( DbgException& )
{}
return python::object(true);
} }
operator ULONG64() { operator ULONG64() {

View File

@ -47,6 +47,10 @@ class IntBaseTest( unittest.TestCase ):
self.assertTrue( -0x8000000000000000 - 1 != intBase(-0x8000000000000000) ) self.assertTrue( -0x8000000000000000 - 1 != intBase(-0x8000000000000000) )
self.assertTrue( intBase(1) != intBase(2) ) self.assertTrue( intBase(1) != intBase(2) )
def testIs( self ):
a = b = intBase(0x1)
self.assertTrue( a is b )
def testLtGt( self ): def testLtGt( self ):
self.assertTrue( 0xFE < intBase(0xFF) and intBase(0xFE) < 0xFF ) self.assertTrue( 0xFE < intBase(0xFF) and intBase(0xFE) < 0xFF )
self.assertFalse( -99 < intBase(-100) and intBase(-99) < - 100 ) self.assertFalse( -99 < intBase(-100) and intBase(-99) < - 100 )

View File

@ -46,4 +46,11 @@ class LocalVarsTest(unittest.TestCase):
funcParams = pykd.getParams() funcParams = pykd.getParams()
self.assertEqual( len(funcParams), 2 ) self.assertEqual( len(funcParams), 2 )
self.assertTrue( funcParams[0] == 7 or funcParams[1] == 7 ) self.assertTrue( funcParams[0] == 7 or funcParams[1] == 7 )
def testNoLocals(self):
"""Start new process and test local variables"""
_locProcessId = pykd.startProcess( target.appPath + " -testEnumWindows" )
with testutils.ContextCallIt( testutils.KillProcess(_locProcessId) ) as killStartedProcess :
#initial break
self.assertEqual(0, len(pykd.getLocals()))
self.assertEqual(0, len(pykd.getParams()))

View File

@ -70,7 +70,7 @@ def getTestSuite( singleName = "" ):
if __name__ == "__main__": if __name__ == "__main__":
print "\nTesting PyKd ver. " + pykd.version print "\nTesting PyKd ver. " + pykd.__version__
target.appPath = sys.argv[1] target.appPath = sys.argv[1]
target.moduleName = os.path.splitext(os.path.basename(target.appPath))[0] target.moduleName = os.path.splitext(os.path.basename(target.appPath))[0]