[0.1.x] ~ processing un-named ("__formal") parameters

git-svn-id: https://pykd.svn.codeplex.com/svn@73132 9b283d60-5439-405e-af05-b73fd8c4d996
This commit is contained in:
SND\EreTIk_cp 2012-01-12 21:51:57 +00:00 committed by Mikhail I. Izmestev
parent 4024ce424f
commit e69047ac19
4 changed files with 46 additions and 6 deletions

View File

@ -21,12 +21,15 @@ struct addLocals {
ULONG m_rva; ULONG m_rva;
Ctx::ContextPtr m_ctx; Ctx::ContextPtr m_ctx;
IDebugClient4 *m_client; IDebugClient4 *m_client;
ULONG m_formalNameCounter;
void append(pyDia::SymbolPtr symParent); void append(pyDia::SymbolPtr symParent);
private: private:
void appendVar(pyDia::SymbolPtr symData); void appendVar(pyDia::SymbolPtr symData);
void generateUniqueName(std::string &varName);
TypedVarPtr getTypeVarByOffset( TypedVarPtr getTypeVarByOffset(
pyDia::SymbolPtr symData, pyDia::SymbolPtr symData,
ULONG64 varOffset ULONG64 varOffset
@ -81,6 +84,10 @@ void addLocals::appendVar(pyDia::SymbolPtr symData)
std::string varName = symData->getName(); std::string varName = symData->getName();
// check name for unique. f.e. may be may be somewhat parameters
// with name "__formal"
generateUniqueName(varName);
switch (symData->getLocType()) switch (symData->getLocType())
{ {
case LocIsStatic: case LocIsStatic:
@ -107,6 +114,22 @@ void addLocals::appendVar(pyDia::SymbolPtr symData)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void addLocals::generateUniqueName(std::string &varName)
{
if ( !m_locals.has_key(varName) )
return;
std::string origVarName = varName;
while ( m_locals.has_key(varName) )
{
std::stringstream sstream;
sstream << origVarName << ++m_formalNameCounter;
varName = sstream.str();
}
}
////////////////////////////////////////////////////////////////////////////////
TypedVarPtr addLocals::getTypeVarByOffset( TypedVarPtr addLocals::getTypeVarByOffset(
pyDia::SymbolPtr symData, pyDia::SymbolPtr symData,
ULONG64 varOffset ULONG64 varOffset
@ -176,7 +199,7 @@ python::dict DebugClient::getLocals(Ctx::ContextPtr ctx OPTIONAL)
return python::dict(); // out of function debug range return python::dict(); // out of function debug range
python::dict locals; python::dict locals;
impl::addLocals Locals = { locals, mod, rva, ctx, m_client }; impl::addLocals Locals = { locals, mod, rva, ctx, m_client, 0 };
Locals.append(symFunc); Locals.append(symFunc);

View File

@ -232,7 +232,7 @@ class DiaTest( unittest.TestCase ):
try: try:
gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) gScope = pykd.diaLoadPdb( str(target.module.pdb()) )
self.assertEqual( pykd.DataIsGlobal, gScope["g_structTest"].dataKind() ) self.assertEqual( pykd.DataIsGlobal, gScope["g_structTest"].dataKind() )
self.assertEqual( pykd.DataIsParam, gScope["EnumWindowsProc"]["hWindow"].dataKind() ) self.assertEqual( pykd.DataIsParam, gScope["EnumWindowsProc1"]["hWindow"].dataKind() )
except pykd.DiaException as diaExcept: except pykd.DiaException as diaExcept:
print diaExcept print diaExcept
self.assertTrue(False) self.assertTrue(False)

View File

@ -6,13 +6,13 @@ import pykd
class LocalVarsTest(unittest.TestCase): class LocalVarsTest(unittest.TestCase):
def testLocalVariable(self): def testLocalVariable(self):
"""Start new process and break in targetapp!EnumWindowsProc""" """Start new process and test local variables"""
testClient = pykd.createDbgClient() testClient = pykd.createDbgClient()
testClient.startProcess( target.appPath + " -testEnumWindows" ) testClient.startProcess( target.appPath + " -testEnumWindows" )
testClient.go() # initial breakpoint -> wmain testClient.go() # initial breakpoint -> wmain
testClient.go() # wmain -> targetapp!EnumWindowsProc testClient.go() # wmain -> targetapp!EnumWindowsProc1
# pykd.dprint( "\n" + testClient.dbgCommand("u") ) # pykd.dprint( "\n" + testClient.dbgCommand("u") )
locals = testClient.getLocals() locals = testClient.getLocals()
@ -30,3 +30,10 @@ class LocalVarsTest(unittest.TestCase):
self.assertEqual( pykd.DataIsStaticLocal, locals["staticVar"].dataKind() ) self.assertEqual( pykd.DataIsStaticLocal, locals["staticVar"].dataKind() )
self.assertEqual( locals["dwProccessId"] + 1, locals["staticVar"] ) self.assertEqual( locals["dwProccessId"] + 1, locals["staticVar"] )
testClient.go() # targetapp!EnumWindowsProc1 -> targetapp!EnumWindowsProc2
locals = testClient.getLocals()
self.assertEqual( len(locals), 2 )
locValues = locals.values()
self.assertTrue( locValues[0] == 7 or locValues[1] == 7 )

View File

@ -259,7 +259,7 @@ void FuncWithName1(int a)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#pragma optimize("g", off) #pragma optimize("g", off)
BOOL CALLBACK EnumWindowsProc( BOOL CALLBACK EnumWindowsProc1(
HWND hWindow, HWND hWindow,
const LPARAM lParam const LPARAM lParam
) )
@ -278,6 +278,15 @@ BOOL CALLBACK EnumWindowsProc(
} }
return hWindow ? FALSE : TRUE; return hWindow ? FALSE : TRUE;
} }
////////////////////////////////////////////////////////////////////////////////
BOOL CALLBACK EnumWindowsProc2(HWND, LPARAM)
{
__debugbreak();
return FALSE;
}
#pragma optimize("g", on) #pragma optimize("g", on)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -317,7 +326,8 @@ int _tmain(int argc, _TCHAR* argv[])
if ( !_tcsicmp(argv[1], _T("-testEnumWindows")) ) if ( !_tcsicmp(argv[1], _T("-testEnumWindows")) )
{ {
::EnumWindows(&EnumWindowsProc, 6); ::EnumWindows(&EnumWindowsProc1, 6);
::EnumWindows(&EnumWindowsProc2, 7);
return ERROR_SUCCESS; return ERROR_SUCCESS;
} }
} }