From e65c2bf418cefb6b5b65057728388a64e8bb837b Mon Sep 17 00:00:00 2001 From: "SND\\kernelnet_cp" Date: Fri, 4 Feb 2011 07:44:15 +0000 Subject: [PATCH] [+] added : locals() routine; it returns local var for current scope git-svn-id: https://pykd.svn.codeplex.com/svn@61030 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/dbgext.cpp | 1 + pykd/dbgprocess.cpp | 114 +++++++++++++++++++++++++++++++++++++++++++- pykd/dbgprocess.h | 9 ++-- 3 files changed, 118 insertions(+), 6 deletions(-) diff --git a/pykd/dbgext.cpp b/pykd/dbgext.cpp index 478701d..16d6df4 100644 --- a/pykd/dbgext.cpp +++ b/pykd/dbgext.cpp @@ -139,6 +139,7 @@ BOOST_PYTHON_MODULE( pykd ) boost::python::def( "ptrSignMWord", &loadSignMWord ); boost::python::def( "compareMemory", &compareMemory, compareMemoryOver( boost::python::args( "addr1", "addr2", "length", "phyAddr" ), "" ) ); boost::python::def( "getCurrentStack", &getCurrentStack ); + boost::python::def( "locals", &getLocals ); boost::python::def( "reloadModule", &reloadModule ); boost::python::def( "getPdbFile", &getPdbFile ); boost::python::def( "getImplicitThread", &getImplicitThread ); diff --git a/pykd/dbgprocess.cpp b/pykd/dbgprocess.cpp index 53c836d..eb5f9ab 100644 --- a/pykd/dbgprocess.cpp +++ b/pykd/dbgprocess.cpp @@ -3,6 +3,7 @@ #include "dbgprocess.h" #include "dbgext.h" #include "dbgexcept.h" +#include "dbgtype.h" ///////////////////////////////////////////////////////////////////////////////// @@ -133,9 +134,14 @@ getCurrentStack() { HRESULT hres; PDEBUG_STACK_FRAME frames = NULL; + ULONG currentScope = 0; try { + hres = dbgExt->symbols3->GetCurrentScopeFrameIndex( ¤tScope ); + if ( FAILED( hres ) ) + throw DbgException( "IDebugSymbol3::GetCurrentScopeFrameIndex failed" ); + frames = new DEBUG_STACK_FRAME [ 1000 ]; ULONG filledFrames; @@ -147,11 +153,21 @@ getCurrentStack() for ( ULONG i = 0; i < filledFrames; ++i ) { - frameList.append( boost::python::object( dbgStackFrameClass( frames[i] ) ) ); + dbgStackFrameClass frame( frames[i] ); + + boost::python::object frameObj( frame ); + + hres = dbgExt->symbols->SetScope( NULL, &frames[i], NULL, sizeof(DEBUG_STACK_FRAME) ); + if ( SUCCEEDED( hres ) ) + frameObj.attr( "locals" ) = getLocals(); + + frameList.append( frameObj ); } if ( frames ) delete[] frames; + + dbgExt->symbols3->SetScopeFrameByIndex( currentScope ); return frameList; @@ -167,6 +183,8 @@ getCurrentStack() if ( frames ) delete[] frames; + + dbgExt->symbols3->SetScopeFrameByIndex( currentScope ); return boost::python::object(); } @@ -303,4 +321,96 @@ setCurrentProcess( } } -///////////////////////////////////////////////////////////////////////////////// \ No newline at end of file +///////////////////////////////////////////////////////////////////////////////// + +dbgStackFrameClass::dbgStackFrameClass( const DEBUG_STACK_FRAME &stackFrame ) +{ + memcpy( static_cast( this ), &stackFrame, sizeof(DEBUG_STACK_FRAME) ); +} + +///////////////////////////////////////////////////////////////////////////////// + +boost::python::object +getLocals() +{ + HRESULT hres; + IDebugSymbolGroup *localSymbols = NULL; + IDebugSymbolGroup2 *localSymbols2 = NULL; + + try { + + hres = dbgExt->symbols->GetScopeSymbolGroup( DEBUG_SCOPE_GROUP_ARGUMENTS|DEBUG_SCOPE_GROUP_LOCALS, NULL, &localSymbols ); + if ( FAILED( hres ) ) + throw DbgException( "IDebugSymbols::GetScopeSymbolGroup failed" ); + + hres = localSymbols->QueryInterface( __uuidof(IDebugSymbolGroup2), (void**) &localSymbols2 ); + if ( FAILED( hres ) ) + throw DbgException( "IDebugSymbols::QueryInterface failed to get IDebugSymbolGroup2" ); + + ULONG localNumber; + hres = localSymbols->GetNumberSymbols( &localNumber ); + + boost::python::dict arr; + + for ( ULONG i = 0; i < localNumber; ++i ) + { + char varName[0x100]; + + hres = localSymbols->GetSymbolName( i, varName, sizeof(varName), NULL ); + if ( FAILED( hres ) ) + throw DbgException( "IDebugSymbolGroup::GetSymbolName failed" ); + + DEBUG_SYMBOL_PARAMETERS symbolParam = {}; + hres = localSymbols->GetSymbolParameters( i, 1, &symbolParam ); + if ( FAILED( hres ) ) + throw DbgException( "IDebugSymbolGroup::GetSymbolParameters failed" ); + + char typeName[0x100]; + hres = dbgExt->symbols->GetTypeName( symbolParam.Module, symbolParam.TypeId, typeName, sizeof(typeName), NULL ); + if ( FAILED( hres ) ) + throw DbgException( "IDebugSymbols::GetTypeName failed" ); + + char moduleName[0x100]; + hres = dbgExt->symbols2->GetModuleNameString( + DEBUG_MODNAME_MODULE, + DEBUG_ANY_ID, + symbolParam.Module, + moduleName, + sizeof(moduleName), + NULL ); + if ( FAILED( hres ) ) + throw DbgException( "IDebugSymbols2::GetModuleNameString failed" ); + + + ULONG64 varOffset; + hres = localSymbols2->GetSymbolOffset( i, &varOffset ); + if ( FAILED( hres ) ) + throw DbgException( "IDebugSymbolGroup2::GetSymbolOffset failed" ); + + arr[ varName ] = loadTypedVar( moduleName, typeName, varOffset ); + } + + return arr; + } + 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" ); + } + + if ( localSymbols ) + localSymbols->Release(); + + if ( localSymbols2 ) + localSymbols2->Release(); + + return boost::python::object(); + +} + +///////////////////////////////////////////////////////////////////////////////// + + diff --git a/pykd/dbgprocess.h b/pykd/dbgprocess.h index b40771f..8b14da2 100644 --- a/pykd/dbgprocess.h +++ b/pykd/dbgprocess.h @@ -19,6 +19,10 @@ getImplicitThread(); boost::python::object getCurrentStack(); +boost::python::object +getLocals(); + + class dbgStackFrameClass : public DEBUG_STACK_FRAME { public: @@ -28,10 +32,7 @@ public: memset( static_cast( this ), 0, sizeof(DEBUG_STACK_FRAME) ); } - dbgStackFrameClass( const DEBUG_STACK_FRAME &stackFrame ) - { - memcpy( static_cast( this ), &stackFrame, sizeof(DEBUG_STACK_FRAME) ); - } + dbgStackFrameClass( const DEBUG_STACK_FRAME &stackFrame ); }; boost::python::object