mirror of
https://github.com/ivellioscolin/pykd.git
synced 2025-04-21 12:24:52 +08:00
[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:
parent
4024ce424f
commit
e69047ac19
@ -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);
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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 )
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user