mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-29 20:03:33 +08:00
[0.3.x] added : getStack routine
git-svn-id: https://pykd.svn.codeplex.com/svn@84471 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
parent
95162f8de7
commit
b011fc2da3
@ -26,4 +26,38 @@ python::object CPUContextAdaptor::getRegisterByIndex( kdlib::CPUContext& cpu, si
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
python::list CPUContextAdaptor::getStack( kdlib::CPUContext& cpu )
|
||||||
|
{
|
||||||
|
size_t numberFrames = cpu.getStackLength();
|
||||||
|
python::list lst;
|
||||||
|
|
||||||
|
python::object typeObj = python::object( python::handle<>(&PyType_Type) );
|
||||||
|
python::object frameType = typeObj("frameType", python::tuple(), python::dict() );
|
||||||
|
|
||||||
|
for ( size_t i = 0; i < numberFrames; ++i )
|
||||||
|
{
|
||||||
|
StackFrame frame;
|
||||||
|
cpu.getStackFrame( i, frame.ip, frame.ret, frame.fp, frame.sp );
|
||||||
|
lst.append( frame );
|
||||||
|
}
|
||||||
|
|
||||||
|
return lst;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
std::wstring printStackFrame( StackFrame& frame )
|
||||||
|
{
|
||||||
|
std::wstringstream sstr;
|
||||||
|
sstr << L"Frame: ";
|
||||||
|
sstr << L"IP=" << std::hex << frame.ip << L" ";
|
||||||
|
sstr << L"Return=" << std::hex << frame.ret << L" ";
|
||||||
|
sstr << L"Frame Offset=" << std::hex << frame.fp << L" ";
|
||||||
|
sstr << L"Stack Offset=" << std::hex << frame.sp;
|
||||||
|
|
||||||
|
return sstr.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
} // end namespace pykd
|
} // end namespace pykd
|
||||||
|
@ -15,8 +15,15 @@ class CPUContextAdaptor
|
|||||||
public:
|
public:
|
||||||
static python::object getRegisterByName( kdlib::CPUContext& cpu, const std::wstring &name );
|
static python::object getRegisterByName( kdlib::CPUContext& cpu, const std::wstring &name );
|
||||||
static python::object getRegisterByIndex( kdlib::CPUContext& cpu, size_t index );
|
static python::object getRegisterByIndex( kdlib::CPUContext& cpu, size_t index );
|
||||||
|
static python::list getStack( kdlib::CPUContext& cpu );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct StackFrame {
|
||||||
|
kdlib::MEMOFFSET_64 ip, ret, fp, sp;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::wstring printStackFrame( StackFrame& 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().get(), name );
|
||||||
@ -40,6 +47,10 @@ inline kdlib::CPUType getProcessorType() {
|
|||||||
return kdlib::loadCPUCurrentContext()->getCPUType();
|
return kdlib::loadCPUCurrentContext()->getCPUType();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline python::list getCurrentStack() {
|
||||||
|
return CPUContextAdaptor::getStack( *kdlib::loadCPUCurrentContext() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@ -155,20 +155,24 @@ python::tuple findSymbolAndDisp( ULONG64 offset )
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
python::object getSystemVersion()
|
kdlib::SystemInfo getSystemVersion()
|
||||||
{
|
{
|
||||||
|
|
||||||
kdlib::SystemInfo sysInfo;
|
kdlib::SystemInfo sysInfo;
|
||||||
kdlib::getSystemInfo( sysInfo );
|
kdlib::getSystemInfo( sysInfo );
|
||||||
|
return sysInfo;
|
||||||
|
}
|
||||||
|
|
||||||
python::object obj;
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
obj.attr("majorVersion") = sysInfo.majorVersion;
|
std::wstring printSystemVersion( kdlib::SystemInfo& sysInfo )
|
||||||
obj.attr("minorVersion") = sysInfo.minorVersion;
|
{
|
||||||
obj.attr("buildNumber") = sysInfo.buildNumber;
|
std::wstringstream sstr;
|
||||||
obj.attr("buildDescription") = sysInfo.buildDescription;
|
|
||||||
|
|
||||||
return obj;
|
sstr << L"Major Version: " << sysInfo.majorVersion << std::endl;
|
||||||
|
sstr << L"Minor Version: " << sysInfo.minorVersion << std::endl;;
|
||||||
|
sstr << L"Description: " << sysInfo.buildDescription << std::endl;
|
||||||
|
|
||||||
|
return sstr.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -25,7 +25,9 @@ python::tuple getSourceLine( kdlib::MEMOFFSET_64 offset = 0 );
|
|||||||
|
|
||||||
python::tuple findSymbolAndDisp( ULONG64 offset );
|
python::tuple findSymbolAndDisp( ULONG64 offset );
|
||||||
|
|
||||||
python::object getSystemVersion();
|
kdlib::SystemInfo getSystemVersion();
|
||||||
|
|
||||||
|
std::wstring printSystemVersion( kdlib::SystemInfo& sysInfo );
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@ -262,9 +262,9 @@ BOOST_PYTHON_MODULE( pykd )
|
|||||||
// python::def( "setProcessorMode", &setProcessorMode,
|
// python::def( "setProcessorMode", &setProcessorMode,
|
||||||
// "Set current processor mode by string (X86, ARM, IA64 or X64)" );
|
// "Set current processor mode by string (X86, ARM, IA64 or X64)" );
|
||||||
|
|
||||||
// // 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( "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,
|
||||||
@ -543,6 +543,13 @@ BOOST_PYTHON_MODULE( pykd )
|
|||||||
.def("__init__", python::make_constructor(Breakpoint::setSoftwareBreakpoint) )
|
.def("__init__", python::make_constructor(Breakpoint::setSoftwareBreakpoint) )
|
||||||
;
|
;
|
||||||
|
|
||||||
|
python::class_<StackFrame>( "stackFrame",
|
||||||
|
"class for stack's frame representation", python::no_init )
|
||||||
|
.def_readonly( "ip", &StackFrame::ip, "instruction pointer" )
|
||||||
|
.def_readonly( "ret", &StackFrame::ret, "return pointer" )
|
||||||
|
.def_readonly( "fp", &StackFrame::fp, "frame pointer" )
|
||||||
|
.def_readonly( "sp", &StackFrame::sp, "stack pointer" )
|
||||||
|
.def( "__str__", &printStackFrame );
|
||||||
|
|
||||||
python::class_<kdlib::CPUContext, kdlib::CPUContextPtr, boost::noncopyable>( "cpu",
|
python::class_<kdlib::CPUContext, kdlib::CPUContextPtr, boost::noncopyable>( "cpu",
|
||||||
"class for CPU context representation", python::no_init )
|
"class for CPU context representation", python::no_init )
|
||||||
@ -553,6 +560,7 @@ BOOST_PYTHON_MODULE( pykd )
|
|||||||
.add_property("fp", &kdlib::CPUContext::getSP )
|
.add_property("fp", &kdlib::CPUContext::getSP )
|
||||||
.def("getCPUType", &kdlib::CPUContext::getCPUType )
|
.def("getCPUType", &kdlib::CPUContext::getCPUType )
|
||||||
.def("getCPUMode", &kdlib::CPUContext::getCPUMode )
|
.def("getCPUMode", &kdlib::CPUContext::getCPUMode )
|
||||||
|
.def("getStack", &CPUContextAdaptor::getStack )
|
||||||
.def("__getattr__", &CPUContextAdaptor::getRegisterByName )
|
.def("__getattr__", &CPUContextAdaptor::getRegisterByName )
|
||||||
.def("__getitem__", &CPUContextAdaptor::getRegisterByIndex );
|
.def("__getitem__", &CPUContextAdaptor::getRegisterByIndex );
|
||||||
|
|
||||||
@ -587,24 +595,24 @@ BOOST_PYTHON_MODULE( pykd )
|
|||||||
// .def( "__str__", &StackFrame::print,
|
// .def( "__str__", &StackFrame::print,
|
||||||
// "Return stacks frame as a string");
|
// "Return stacks frame as a string");
|
||||||
|
|
||||||
// python::class_< SystemVersion, SystemVersionPtr, boost::noncopyable >(
|
python::class_< kdlib::SystemInfo>(
|
||||||
// "systemVersion", "Operation system version", python::no_init)
|
"systemVersion", "Operation system version", python::no_init)
|
||||||
// .def_readonly( "platformId", &SystemVersion::platformId,
|
//.def_readonly( "platformId", &SystemVersion::platformId,
|
||||||
// "Platform ID: VER_PLATFORM_WIN32_NT for NT-based Windows")
|
// "Platform ID: VER_PLATFORM_WIN32_NT for NT-based Windows")
|
||||||
// .def_readonly( "win32Major", &SystemVersion::win32Major,
|
.def_readonly( "win32Major", &kdlib::SystemInfo::majorVersion,
|
||||||
// "Major version number of the target's operating system")
|
"Major version number of the target's operating system")
|
||||||
// .def_readonly( "win32Minor", &SystemVersion::win32Minor,
|
.def_readonly( "win32Minor", &kdlib::SystemInfo::minorVersion,
|
||||||
// "Minor version number of the target's operating system")
|
"Minor version number of the target's operating system")
|
||||||
// .def_readonly( "buildNumber", &SystemVersion::buildNumber,
|
//.def_readonly( "buildNumber", &SystemVersion::buildNumber,
|
||||||
// "Build number for the target's operating system")
|
// "Build number for the target's operating system")
|
||||||
// .def_readonly( "buildString", &SystemVersion::buildString,
|
.def_readonly( "buildString", &kdlib::SystemInfo::buildDescription,
|
||||||
// "String that identifies the build of the system")
|
"String that identifies the build of the system")
|
||||||
// .def_readonly( "servicePackString", &SystemVersion::servicePackString,
|
//.def_readonly( "servicePackString", &SystemVersion::servicePackString,
|
||||||
// "String for the service pack level of the target computer")
|
// "String for the service pack level of the target computer")
|
||||||
// .def_readonly( "isCheckedBuild", &SystemVersion::isCheckedBuild,
|
//.def_readonly( "isCheckedBuild", &SystemVersion::isCheckedBuild,
|
||||||
// "Checked build flag")
|
// "Checked build flag")
|
||||||
// .def("__str__", pysupport::printSystemVersion,
|
.def("__str__", &printSystemVersion,
|
||||||
// "Return object as a string");
|
"Return object as a string");
|
||||||
|
|
||||||
|
|
||||||
// python::class_< ExceptionInfo, ExceptionInfoPtr, boost::noncopyable >(
|
// python::class_< ExceptionInfo, ExceptionInfoPtr, boost::noncopyable >(
|
||||||
|
Loading…
Reference in New Issue
Block a user