mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-22 05:13:22 +08:00
[0.3.x] added : targetProcess.getMangedHeap ( Return object representing a managed heap )
[0.3.x] added : targetProcess.getManagedVar (Return object representing a managed object in the target managed process) git-svn-id: https://pykd.svn.codeplex.com/svn@91257 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
parent
db521b8c7a
commit
61bab00356
@ -19,10 +19,10 @@ kdlib::PROCESS_DEBUG_ID startProcess(const std::wstring &processName, const kdl
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline
|
inline
|
||||||
kdlib::PROCESS_DEBUG_ID attachProcess(kdlib::PROCESS_ID pid, const kdlib::ProcessDebugFlags& flags = kdlib::ProcessDebugDefault)
|
kdlib::PROCESS_DEBUG_ID attachProcess(kdlib::PROCESS_ID pid)
|
||||||
{
|
{
|
||||||
AutoRestorePyState pystate;
|
AutoRestorePyState pystate;
|
||||||
return kdlib::attachProcess(pid, flags);
|
return kdlib::attachProcess(pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline
|
inline
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
|
|
||||||
#define PYKD_VERSION_MAJOR 0
|
#define PYKD_VERSION_MAJOR 0
|
||||||
#define PYKD_VERSION_MINOR 3
|
#define PYKD_VERSION_MINOR 3
|
||||||
#define PYKD_VERSION_SUBVERSION 2
|
#define PYKD_VERSION_SUBVERSION 3
|
||||||
#define PYKD_VERSION_BUILDNO 8
|
#define PYKD_VERSION_BUILDNO 0
|
||||||
|
|
||||||
#define __VER_STR2__(x) #x
|
#define __VER_STR2__(x) #x
|
||||||
#define __VER_STR1__(x) __VER_STR2__(x)
|
#define __VER_STR1__(x) __VER_STR2__(x)
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
|
||||||
#include <boost/bind.hpp>
|
#include <boost/bind.hpp>
|
||||||
@ -36,7 +35,6 @@ static const std::string pykdVersion = PYKD_VERSION_BUILD_STR
|
|||||||
|
|
||||||
|
|
||||||
BOOST_PYTHON_FUNCTION_OVERLOADS( startProcess_, pykd::startProcess, 1, 2 );
|
BOOST_PYTHON_FUNCTION_OVERLOADS( startProcess_, pykd::startProcess, 1, 2 );
|
||||||
BOOST_PYTHON_FUNCTION_OVERLOADS( attachProcess_, pykd::attachProcess, 1, 2);
|
|
||||||
BOOST_PYTHON_FUNCTION_OVERLOADS( detachProcess_, pykd::detachProcess, 0, 1 );
|
BOOST_PYTHON_FUNCTION_OVERLOADS( detachProcess_, pykd::detachProcess, 0, 1 );
|
||||||
BOOST_PYTHON_FUNCTION_OVERLOADS( terminateProcess_, pykd::terminateProcess, 0, 1 );
|
BOOST_PYTHON_FUNCTION_OVERLOADS( terminateProcess_, pykd::terminateProcess, 0, 1 );
|
||||||
BOOST_PYTHON_FUNCTION_OVERLOADS(closeDump_, pykd::closeDump, 0, 1);
|
BOOST_PYTHON_FUNCTION_OVERLOADS(closeDump_, pykd::closeDump, 0, 1);
|
||||||
@ -94,6 +92,8 @@ BOOST_PYTHON_FUNCTION_OVERLOADS( defineFunction_, pykd::defineFunction, 1, 2 );
|
|||||||
BOOST_PYTHON_FUNCTION_OVERLOADS( setSoftwareBreakpoint_, Breakpoint::setSoftwareBreakpoint, 1, 2 );
|
BOOST_PYTHON_FUNCTION_OVERLOADS( setSoftwareBreakpoint_, Breakpoint::setSoftwareBreakpoint, 1, 2 );
|
||||||
BOOST_PYTHON_FUNCTION_OVERLOADS( setHardwareBreakpoint_, Breakpoint::setHardwareBreakpoint, 3, 4 );
|
BOOST_PYTHON_FUNCTION_OVERLOADS( setHardwareBreakpoint_, Breakpoint::setHardwareBreakpoint, 3, 4 );
|
||||||
|
|
||||||
|
BOOST_PYTHON_FUNCTION_OVERLOADS( TargetHeap_getEntries, TargetHeapAdapter::getEntries, 1, 4);
|
||||||
|
|
||||||
BOOST_PYTHON_FUNCTION_OVERLOADS( Module_enumSymbols, ModuleAdapter::enumSymbols, 1, 2 );
|
BOOST_PYTHON_FUNCTION_OVERLOADS( Module_enumSymbols, ModuleAdapter::enumSymbols, 1, 2 );
|
||||||
BOOST_PYTHON_FUNCTION_OVERLOADS( Module_findSymbol, ModuleAdapter::findSymbol, 2, 3 );
|
BOOST_PYTHON_FUNCTION_OVERLOADS( Module_findSymbol, ModuleAdapter::findSymbol, 2, 3 );
|
||||||
BOOST_PYTHON_FUNCTION_OVERLOADS( Module_enumTypes, ModuleAdapter::enumTypes, 1, 2 );
|
BOOST_PYTHON_FUNCTION_OVERLOADS( Module_enumTypes, ModuleAdapter::enumTypes, 1, 2 );
|
||||||
@ -156,8 +156,8 @@ BOOST_PYTHON_MODULE( pykd )
|
|||||||
|
|
||||||
python::def( "startProcess", pykd::startProcess, startProcess_( boost::python::args( "commandline", "debugOptions"),
|
python::def( "startProcess", pykd::startProcess, startProcess_( boost::python::args( "commandline", "debugOptions"),
|
||||||
"Start process for debugging" ) );
|
"Start process for debugging" ) );
|
||||||
python::def("attachProcess", pykd::attachProcess, attachProcess_(boost::python::args("pid", "debugOptions"),
|
python::def("attachProcess", pykd::attachProcess,
|
||||||
"Attach debugger to a exsisting process") );
|
"Attach debugger to a exsisting process");
|
||||||
python::def( "detachProcess", pykd::detachProcess, detachProcess_( boost::python::args( "id" ),
|
python::def( "detachProcess", pykd::detachProcess, detachProcess_( boost::python::args( "id" ),
|
||||||
"Stop process debugging") );
|
"Stop process debugging") );
|
||||||
python::def( "detachAllProcesses", pykd::detachAllProcesses,
|
python::def( "detachAllProcesses", pykd::detachAllProcesses,
|
||||||
@ -706,6 +706,8 @@ BOOST_PYTHON_MODULE( pykd )
|
|||||||
"Return the process executable file name")
|
"Return the process executable file name")
|
||||||
.def("isCurrent", TargetProcessAdapter::isCurrent,
|
.def("isCurrent", TargetProcessAdapter::isCurrent,
|
||||||
"Check if the target is current")
|
"Check if the target is current")
|
||||||
|
.def("isManaged", TargetProcessAdapter::isManaged,
|
||||||
|
"Check if the taget process is managed")
|
||||||
.def("getNumberThreads", TargetProcessAdapter::getNumberThreads,
|
.def("getNumberThreads", TargetProcessAdapter::getNumberThreads,
|
||||||
"Return number of threads for this process" )
|
"Return number of threads for this process" )
|
||||||
.def("getThread", TargetProcessAdapter::getThreadByIndex,
|
.def("getThread", TargetProcessAdapter::getThreadByIndex,
|
||||||
@ -736,10 +738,14 @@ BOOST_PYTHON_MODULE( pykd )
|
|||||||
"Return list of breakpoints for the target process")
|
"Return list of breakpoints for the target process")
|
||||||
.def("modules", TargetProcessAdapter::getModulesList,
|
.def("modules", TargetProcessAdapter::getModulesList,
|
||||||
"Return list of modules for the target process")
|
"Return list of modules for the target process")
|
||||||
|
.def("getManagedHeap", TargetProcessAdapter::getManagedHeap,
|
||||||
|
"Return object representing a managed heap")
|
||||||
|
.def("getManagedVar", TargetProcessAdapter::getManagedVar,
|
||||||
|
"Return object representing a managed object in the target managed process")
|
||||||
.def("__str__", TargetProcessAdapter::print)
|
.def("__str__", TargetProcessAdapter::print)
|
||||||
;
|
;
|
||||||
|
|
||||||
python::class_<kdlib::TargetThread, kdlib::TargetThreadPtr, boost::noncopyable>("targetThread", "Class representing process in the target system", python::no_init )
|
python::class_<kdlib::TargetThread, kdlib::TargetThreadPtr, boost::noncopyable>("targetThread", "Class representing thread in the target process", python::no_init )
|
||||||
.def("__init__", python::make_constructor(&TargetThreadAdapter::getThread))
|
.def("__init__", python::make_constructor(&TargetThreadAdapter::getThread))
|
||||||
.def("__init__", python::make_constructor(&TargetThreadAdapter::getCurrent))
|
.def("__init__", python::make_constructor(&TargetThreadAdapter::getCurrent))
|
||||||
.def("getNumber", TargetThreadAdapter::getNumberThreads,
|
.def("getNumber", TargetThreadAdapter::getNumberThreads,
|
||||||
@ -775,6 +781,17 @@ BOOST_PYTHON_MODULE( pykd )
|
|||||||
.def("__str__", TargetThreadAdapter::print)
|
.def("__str__", TargetThreadAdapter::print)
|
||||||
;
|
;
|
||||||
|
|
||||||
|
python::class_<TargetHeapIterator>("targetHeapIterator", "iterator for typedVar array", python::no_init)
|
||||||
|
.def("__iter__", &TargetHeapIterator::self)
|
||||||
|
.def("__len__", &TargetHeapIterator::length)
|
||||||
|
.def("next", &TargetHeapIterator::next)
|
||||||
|
;
|
||||||
|
|
||||||
|
python::class_<kdlib::TargetHeap, kdlib::TargetHeapPtr, boost::noncopyable>("targetHeap", "Class representing heap in the target process", python::no_init )
|
||||||
|
.def("entries", &TargetHeapAdapter::getEntries, TargetHeap_getEntries(python::args("typeName", "minSize", "maxSize"),
|
||||||
|
"Return heap's entries iterator object")[python::return_value_policy<python::manage_new_object>()] )
|
||||||
|
;
|
||||||
|
|
||||||
python::class_<kdlib::Module, kdlib::ModulePtr, python::bases<kdlib::NumBehavior>, boost::noncopyable>("module", "Class representing executable module", python::no_init)
|
python::class_<kdlib::Module, kdlib::ModulePtr, python::bases<kdlib::NumBehavior>, boost::noncopyable>("module", "Class representing executable module", python::no_init)
|
||||||
.def("__init__", python::make_constructor(&ModuleAdapter::loadModuleByName))
|
.def("__init__", python::make_constructor(&ModuleAdapter::loadModuleByName))
|
||||||
.def("__init__", python::make_constructor(&ModuleAdapter::loadModuleByOffset))
|
.def("__init__", python::make_constructor(&ModuleAdapter::loadModuleByOffset))
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#include "pythreadstate.h"
|
#include "pythreadstate.h"
|
||||||
#include "pyeventhandler.h"
|
#include "pyeventhandler.h"
|
||||||
|
#include "dbgexcept.h"
|
||||||
|
|
||||||
namespace pykd {
|
namespace pykd {
|
||||||
|
|
||||||
@ -245,6 +246,24 @@ struct TargetProcessAdapter {
|
|||||||
return process.getModuleByName(name);
|
return process.getModuleByName(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool isManaged(kdlib::TargetProcess& process)
|
||||||
|
{
|
||||||
|
AutoRestorePyState pystate;
|
||||||
|
return process.isManaged();
|
||||||
|
}
|
||||||
|
|
||||||
|
static kdlib::TargetHeapPtr getManagedHeap(kdlib::TargetProcess& process)
|
||||||
|
{
|
||||||
|
AutoRestorePyState pystate;
|
||||||
|
return process.getManagedHeap();
|
||||||
|
}
|
||||||
|
|
||||||
|
static kdlib::TypedVarPtr getManagedVar(kdlib::TargetProcess& process, kdlib::MEMOFFSET_64 address)
|
||||||
|
{
|
||||||
|
AutoRestorePyState pystate;
|
||||||
|
return process.getManagedVar(address);
|
||||||
|
}
|
||||||
|
|
||||||
static python::list getThreadList(kdlib::TargetProcess& process);
|
static python::list getThreadList(kdlib::TargetProcess& process);
|
||||||
|
|
||||||
static python::list getBreakpointsList(kdlib::TargetProcess& process);
|
static python::list getBreakpointsList(kdlib::TargetProcess& process);
|
||||||
@ -334,5 +353,53 @@ struct TargetThreadAdapter {
|
|||||||
static std::wstring print(kdlib::TargetThread& thread);
|
static std::wstring print(kdlib::TargetThread& thread);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class TargetHeapIterator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
explicit TargetHeapIterator(kdlib::TargetHeapEnumPtr& heapEnum) :
|
||||||
|
m_heapEnum(heapEnum)
|
||||||
|
{}
|
||||||
|
|
||||||
|
static python::object self(const python::object& obj)
|
||||||
|
{
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
python::tuple next()
|
||||||
|
{
|
||||||
|
AutoRestorePyState pystate;
|
||||||
|
|
||||||
|
kdlib::MEMOFFSET_64 addr;
|
||||||
|
std::wstring name;
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
if (!m_heapEnum->next(addr, name, size))
|
||||||
|
throw StopIteration("No more data.");
|
||||||
|
|
||||||
|
return python::make_tuple(addr, name, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t length()
|
||||||
|
{
|
||||||
|
AutoRestorePyState pystate;
|
||||||
|
return m_heapEnum->getCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
kdlib::TargetHeapEnumPtr m_heapEnum;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TargetHeapAdapter {
|
||||||
|
|
||||||
|
static TargetHeapIterator* getEntries(kdlib::TargetHeap& heap, const std::wstring& typeName=L"", size_t minSize=0, size_t maxSize=-1)
|
||||||
|
{
|
||||||
|
return new TargetHeapIterator(heap.getEnum(typeName, minSize, maxSize));
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
} // pykd namespace
|
} // pykd namespace
|
||||||
|
|
||||||
|
@ -258,5 +258,5 @@ void TypedVarAdapter::setFieldAttr(kdlib::TypedVar& typedVar, const std::wstring
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
} // namesapce pykd
|
} // namespace pykd
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user