diff --git a/pykd/dbgcmd.cpp b/pykd/dbgcmd.cpp index 3779089..d7a2f45 100644 --- a/pykd/dbgcmd.cpp +++ b/pykd/dbgcmd.cpp @@ -1,5 +1,7 @@ #include "stdafx.h" +#include + #include "dbgext.h" #include "dbgcmd.h" #include "dbgexcept.h" @@ -37,7 +39,7 @@ dbgCommand( const std::string &command ) /////////////////////////////////////////////////////////////////////////////// -dbgExtensionClass::dbgExtensionClass( const char* path ) +dbgExtensionClass::dbgExtensionClass( const char* path ) : m_path(path) { HRESULT hres; @@ -97,6 +99,29 @@ dbgExtensionClass::call( const std::string &command, const std::string params ) /////////////////////////////////////////////////////////////////////////////// +std::string +dbgExtensionClass::print() const +{ + HRESULT status = S_OK; + + try + { + return m_handle ? m_path : ""; + } + catch (std::exception & e) + { + dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd error: %s\n", e.what() ); + } + catch (...) + { + dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd unexpected error\n" ); + } + + return ""; +} + +/////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////// @@ -170,6 +195,43 @@ dbgBreakpointClass::remove() /////////////////////////////////////////////////////////////////////////////// +std::string +dbgBreakpointClass::print() const +{ + HRESULT status = S_OK; + + try + { + if (!m_breakpoint) + return "not set"; + + DEBUG_BREAKPOINT_PARAMETERS params; + status = m_breakpoint->GetParameters(¶ms); + if (FAILED(status)) + throw DbgException("IDebugBreakpoint::GetParameters failed"); + + boost::format fmt("%1$2d %2%%3% %4%:*** "); + fmt % params.Id + % (params.Flags & DEBUG_BREAKPOINT_ENABLED ? 'e' : 'd') + % 'u' + % params.CurrentPassCount; + + return fmt.str(); + } + catch (std::exception & e) + { + dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd error: %s\n", e.what() ); + } + catch (...) + { + dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd unexpected error\n" ); + } + + return ""; +} + +/////////////////////////////////////////////////////////////////////////////// + ULONG64 evaluate( const std::string &expression ) { diff --git a/pykd/dbgcmd.h b/pykd/dbgcmd.h index de93b82..d262a0d 100644 --- a/pykd/dbgcmd.h +++ b/pykd/dbgcmd.h @@ -67,10 +67,14 @@ public: std::string call( const std::string &command, const std::string param ); + + std::string + print() const; private: - ULONG64 m_handle; + ULONG64 m_handle; + std::string m_path; }; ///////////////////////////////////////////////////////////////////////////////// @@ -90,6 +94,9 @@ public: void remove(); + std::string + print() const; + private: ULONG64 m_offset; diff --git a/pykd/dbgext.cpp b/pykd/dbgext.cpp index f083c0a..73ea371 100644 --- a/pykd/dbgext.cpp +++ b/pykd/dbgext.cpp @@ -166,18 +166,21 @@ BOOST_PYTHON_MODULE( pykd ) .def("image", &dbgModuleClass::getImageSymbolName ) .def("pdb", &dbgModuleClass::getPdbName ) .def("addSynSymbol", &dbgModuleClass::addSyntheticSymbol ) - .def("__getattr__", &dbgModuleClass::getOffset ); + .def("__getattr__", &dbgModuleClass::getOffset ) + .def("__str__", &dbgModuleClass::print ); boost::python::class_( "ext", "windbg extension", boost::python::init( boost::python::args("path"), "__init__ dbgExtensionClass" ) ) - .def("call", &dbgExtensionClass::call ); + .def("call", &dbgExtensionClass::call ) + .def("__str__", &dbgExtensionClass::print ); boost::python::class_( "dbgStackFrameClass", "dbgStackFrameClass" ) .def_readonly( "instructionOffset", &dbgStackFrameClass::InstructionOffset ) .def_readonly( "returnOffset", &dbgStackFrameClass::ReturnOffset ) .def_readonly( "frameOffset", &dbgStackFrameClass::FrameOffset ) .def_readonly( "stackOffset", &dbgStackFrameClass::StackOffset ) - .def_readonly( "frameNumber", &dbgStackFrameClass::FrameNumber ); + .def_readonly( "frameNumber", &dbgStackFrameClass::FrameNumber ) + .def( "__str__", &dbgStackFrameClass::print ); boost::python::class_( "windbgOut", "windbgOut" ) .def( "write", &dbgOut::write ); boost::python::class_( "windbgIn", "windbgIn" ) @@ -187,7 +190,8 @@ BOOST_PYTHON_MODULE( pykd ) "break point", boost::python::init( boost::python::args("offset"), "__init__ dbgBreakpointClass" ) ) .def( "set", &dbgBreakpointClass::set ) - .def( "remove", &dbgBreakpointClass::remove ); + .def( "remove", &dbgBreakpointClass::remove ) + .def( "__str__", &dbgBreakpointClass::print ); } diff --git a/pykd/dbgmodule.cpp b/pykd/dbgmodule.cpp index 39b2659..185e941 100644 --- a/pykd/dbgmodule.cpp +++ b/pykd/dbgmodule.cpp @@ -1,5 +1,7 @@ #include "stdafx.h" +#include + #include "dbgext.h" #include "dbgmodule.h" #include "dbgexcept.h" @@ -317,6 +319,31 @@ dbgModuleClass::getImagePath() delete[] pathBuffer; } +std::string +dbgModuleClass::print() const +{ + try + { + const char * format_string(dbgExt->control->IsPointer64Bit() == S_OK ? + "%1$016x %2$016x %3$20s %4$20s" : "%1$08x %2$08x %3$20s %4$20s"); + boost::format fmt(format_string); + std::vector v(MAX_PATH); + ::WideCharToMultiByte( CP_ACP, 0, m_imageFullName.c_str(), -1, &v[0], v.size(), 0, 0); + std::string fullname(&v[0]); + fmt % m_base % (m_end - m_base) % m_name % fullname; + return fmt.str(); + } + catch (std::exception & e) + { + dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd error: %s\n", e.what() ); + } + catch (...) + { + dbgExt->control->Output( DEBUG_OUTPUT_ERROR, "pykd unexpected error\n" ); + } + return ""; +} + ///////////////////////////////////////////////////////////////////////////////// void @@ -344,4 +371,4 @@ addSyntheticSymbol( ULONG64 addr, ULONG size, const std::string &symName ) } } -///////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/pykd/dbgmodule.h b/pykd/dbgmodule.h index e86dd60..80bfc32 100644 --- a/pykd/dbgmodule.h +++ b/pykd/dbgmodule.h @@ -61,6 +61,10 @@ public: void addSyntheticSymbol( ULONG64 offset, ULONG size, const std::string &symName ); + + std::string + print() const; + private: ULONG64 m_base; diff --git a/pykd/dbgprocess.cpp b/pykd/dbgprocess.cpp index eb5f9ab..46de8be 100644 --- a/pykd/dbgprocess.cpp +++ b/pykd/dbgprocess.cpp @@ -1,5 +1,7 @@ #include "stdafx.h" +#include + #include "dbgprocess.h" #include "dbgext.h" #include "dbgexcept.h" @@ -330,6 +332,16 @@ dbgStackFrameClass::dbgStackFrameClass( const DEBUG_STACK_FRAME &stackFrame ) ///////////////////////////////////////////////////////////////////////////////// +std::string +dbgStackFrameClass::print() const +{ + boost::format fmt(dbgExt->control->IsPointer64Bit() == S_OK ? "%1$4d %2$16x" : "%1$4d %2$08x"); + fmt % FrameNumber % ReturnOffset; + return fmt.str(); +} + +///////////////////////////////////////////////////////////////////////////////// + boost::python::object getLocals() { diff --git a/pykd/dbgprocess.h b/pykd/dbgprocess.h index 8b14da2..9e8805a 100644 --- a/pykd/dbgprocess.h +++ b/pykd/dbgprocess.h @@ -33,6 +33,9 @@ public: } dbgStackFrameClass( const DEBUG_STACK_FRAME &stackFrame ); + + std::string + print() const; }; boost::python::object diff --git a/pykd/make.bat b/pykd/make.bat index 6b8eec7..fb37c75 100644 --- a/pykd/make.bat +++ b/pykd/make.bat @@ -1,4 +1,4 @@ -@set CL=/nologo /EHsc /LD /I%BOOST_ROOT% /I%PYTHON_ROOT%\include /I%DBG_SDK_ROOT%\inc +@set CL=/nologo /EHsc /LD /MD /D "NDEBUG" /Ox /I%BOOST_ROOT% /I%PYTHON_ROOT%\include /I%DBG_SDK_ROOT%\inc @rc /fo resource.res pykd.rc > nul @cvtres /out:resource.obj /nologo /machine:x86 resource.res @cl pykd.cpp ^ @@ -17,7 +17,11 @@ dbgtype.cpp ^ stdafx.cpp ^ pykd.def ^ - resource.obj ^ - %PYTHON_ROOT%\libs\python26.lib ^ - %DBG_SDK_ROOT%\lib\i386\dbgeng.lib + %DBG_SDK_ROOT%\lib\i386\dbgeng.lib ^ + /link /out:pykd.pyd +@mt -nologo -manifest pykd.pyd.manifest -outputresource:pykd.pyd;1 @if exist *.obj del *.obj +@if exist *.res del *.res +@if exist *.lib del *.lib +@if exist *.exp del *.exp +@if exist *.manifest del *.manifest