[0.3.x] added : getFrame routine

git-svn-id: https://pykd.svn.codeplex.com/svn@85399 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
SND\kernelnet_cp 2013-09-27 15:32:54 +00:00 committed by Mikhail I. Izmestev
parent 48daec4a9d
commit 6581062fe2
5 changed files with 40 additions and 35 deletions

View File

@ -30,6 +30,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripts", "scripts", "{FE24
test\scripts\mspdbtest.py = test\scripts\mspdbtest.py test\scripts\mspdbtest.py = test\scripts\mspdbtest.py
test\scripts\pykdtest.py = test\scripts\pykdtest.py test\scripts\pykdtest.py = test\scripts\pykdtest.py
test\scripts\regtest.py = test\scripts\regtest.py test\scripts\regtest.py = test\scripts\regtest.py
test\scripts\stacktest.py = test\scripts\stacktest.py
test\scripts\synsymtest.py = test\scripts\synsymtest.py test\scripts\synsymtest.py = test\scripts\synsymtest.py
test\scripts\target.py = test\scripts\target.py test\scripts\target.py = test\scripts\target.py
test\scripts\testutils.py = test\scripts\testutils.py test\scripts\testutils.py = test\scripts\testutils.py

View File

@ -8,52 +8,47 @@ namespace pykd {
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
python::object CPUContextAdaptor::getRegisterByName( kdlib::CPUContext& cpu, const std::wstring &name ) python::object CPUContextAdaptor::getRegisterByName( kdlib::CPUContextPtr& cpu, const std::wstring &name )
{ {
kdlib::NumVariant var = cpu.getRegisterByName(name); kdlib::NumVariant var = cpu->getRegisterByName(name);
return NumVariantAdaptor::convertToPython( var ); return NumVariantAdaptor::convertToPython( var );
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
python::object CPUContextAdaptor::getRegisterByIndex( kdlib::CPUContext& cpu, unsigned long index ) python::object CPUContextAdaptor::getRegisterByIndex( kdlib::CPUContextPtr& cpu, unsigned long index )
{ {
kdlib::NumVariant var = cpu.getRegisterByIndex(index); kdlib::NumVariant var = cpu->getRegisterByIndex(index);
std::wstring name = cpu.getRegisterName(index); std::wstring name = cpu->getRegisterName(index);
return python::make_tuple( name, NumVariantAdaptor::convertToPython( var ) ); return python::make_tuple( name, NumVariantAdaptor::convertToPython( var ) );
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
python::list CPUContextAdaptor::getStack( kdlib::CPUContext& cpu ) python::list CPUContextAdaptor::getStack( kdlib::CPUContextPtr& cpu )
{ {
unsigned long numberFrames = cpu.getStackLength(); kdlib::StackPtr stack = kdlib::getStack(cpu);
python::list lst;
python::object typeObj = python::object( python::handle<>(&PyType_Type) ); unsigned long numberFrames = stack->getFrameCount();
python::object frameType = typeObj("frameType", python::tuple(), python::dict() ); python::list lst;
for ( unsigned long i = 0; i < numberFrames; ++i ) for ( unsigned long i = 0; i < numberFrames; ++i )
{ lst.append( stack->getFrame(i) );
StackFrame frame;
cpu.getStackFrame( i, frame.ip, frame.ret, frame.fp, frame.sp );
lst.append( frame );
}
return lst; return lst;
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
std::wstring printStackFrame( StackFrame& frame ) std::wstring printStackFrame( kdlib::StackFramePtr& frame )
{ {
std::wstringstream sstr; std::wstringstream sstr;
sstr << L"Frame: "; sstr << L"Frame: ";
sstr << L"IP=" << std::hex << frame.ip << L" "; sstr << L"IP=" << std::hex << frame->getIP() << L" ";
sstr << L"Return=" << std::hex << frame.ret << L" "; sstr << L"Return=" << std::hex << frame->getRET() << L" ";
sstr << L"Frame Offset=" << std::hex << frame.fp << L" "; sstr << L"Frame Offset=" << std::hex << frame->getFP() << L" ";
sstr << L"Stack Offset=" << std::hex << frame.sp; sstr << L"Stack Offset=" << std::hex << frame->getSP();
return sstr.str(); return sstr.str();
} }

View File

@ -5,6 +5,7 @@ namespace python = boost::python;
#include "kdlib/dbgengine.h" #include "kdlib/dbgengine.h"
#include "kdlib/cpucontext.h" #include "kdlib/cpucontext.h"
#include "kdlib/stack.h"
namespace pykd { namespace pykd {
@ -13,20 +14,20 @@ namespace pykd {
class CPUContextAdaptor class CPUContextAdaptor
{ {
public: public:
static python::object getRegisterByName( kdlib::CPUContext& cpu, const std::wstring &name ); static python::object getRegisterByName( kdlib::CPUContextPtr& cpu, const std::wstring &name );
static python::object getRegisterByIndex( kdlib::CPUContext& cpu, unsigned long index ); static python::object getRegisterByIndex( kdlib::CPUContextPtr& cpu, unsigned long index );
static python::list getStack( kdlib::CPUContext& cpu ); static python::list getStack( kdlib::CPUContextPtr& cpu );
}; };
struct StackFrame { //struct StackFrame {
kdlib::MEMOFFSET_64 ip, ret, fp, sp; // kdlib::MEMOFFSET_64 ip, ret, fp, sp;
}; //};
std::wstring printStackFrame( StackFrame& frame ); std::wstring printStackFrame( kdlib::StackFramePtr& frame );
inline python::object getRegisterByName( const std::wstring &name ) inline python::object getRegisterByName( const std::wstring &name )
{ {
return CPUContextAdaptor::getRegisterByName( *kdlib::loadCPUCurrentContext().get(), name ); return CPUContextAdaptor::getRegisterByName( kdlib::loadCPUCurrentContext(), name );
} }
inline unsigned long long loadMSR( unsigned long msrIndex ) inline unsigned long long loadMSR( unsigned long msrIndex )
@ -56,9 +57,12 @@ inline void switchProcessorMode() {
} }
inline python::list getCurrentStack() { inline python::list getCurrentStack() {
return CPUContextAdaptor::getStack( *kdlib::loadCPUCurrentContext() ); return CPUContextAdaptor::getStack( kdlib::loadCPUCurrentContext() );
} }
inline kdlib::StackFramePtr getCurrentFrame() {
return kdlib::getStack()->getFrame(0);
}
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////

View File

@ -160,7 +160,8 @@ python::tuple findSymbolAndDisp( ULONG64 offset )
{ {
kdlib::MEMDISPLACEMENT displacement = 0; kdlib::MEMDISPLACEMENT displacement = 0;
std::wstring symbolName = kdlib::findSymbol( offset, displacement ); std::wstring symbolName = kdlib::findSymbol( offset, displacement );
return python::make_tuple(symbolName,displacement); std::wstring moduleName = kdlib::getModuleName( kdlib::findModuleBase( offset ) );
return python::make_tuple(moduleName,symbolName,displacement);
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////

View File

@ -277,6 +277,10 @@ BOOST_PYTHON_MODULE( pykd )
// stack and local variables // stack and local variables
python::def( "getStack", &getCurrentStack, python::def( "getStack", &getCurrentStack,
"Return a current stack as a list of stackFrame objects" ); "Return a current stack as a list of stackFrame objects" );
python::def( "getFrame", &getCurrentFrame,
"Return a current stack frame" );
// python::def( "getStackWow64", &getCurrentStackWow64, // python::def( "getStackWow64", &getCurrentStackWow64,
// "Return a stack for wow64 context as a list of stackFrame objects" ); // "Return a stack for wow64 context as a list of stackFrame objects" );
// python::def( "getFrame", &getCurrentStackFrame, // python::def( "getFrame", &getCurrentStackFrame,
@ -555,12 +559,12 @@ BOOST_PYTHON_MODULE( pykd )
.def("__init__", python::make_constructor(Breakpoint::setSoftwareBreakpoint) ) .def("__init__", python::make_constructor(Breakpoint::setSoftwareBreakpoint) )
; ;
python::class_<StackFrame>( "stackFrame", python::class_<kdlib::StackFrame, kdlib::StackFramePtr, boost::noncopyable>( "stackFrame",
"class for stack's frame representation", python::no_init ) "class for stack's frame representation", python::no_init )
.def_readonly( "ip", &StackFrame::ip, "instruction pointer" ) .def_readonly( "ip", &kdlib::StackFrame::getIP, "instruction pointer" )
.def_readonly( "ret", &StackFrame::ret, "return pointer" ) .def_readonly( "ret", &kdlib::StackFrame::getRET, "return pointer" )
.def_readonly( "fp", &StackFrame::fp, "frame pointer" ) .def_readonly( "fp", &kdlib::StackFrame::getFP, "frame pointer" )
.def_readonly( "sp", &StackFrame::sp, "stack pointer" ) .def_readonly( "sp", &kdlib::StackFrame::getSP, "stack pointer" )
.def( "__str__", &printStackFrame ); .def( "__str__", &printStackFrame );
python::class_<kdlib::CPUContext, kdlib::CPUContextPtr, boost::noncopyable>( "cpu", python::class_<kdlib::CPUContext, kdlib::CPUContextPtr, boost::noncopyable>( "cpu",