2012-01-12 06:23:29 +08:00
|
|
|
"""Local variables tests"""
|
|
|
|
|
|
|
|
import unittest
|
|
|
|
import target
|
|
|
|
import pykd
|
|
|
|
|
|
|
|
class LocalVarsTest(unittest.TestCase):
|
|
|
|
def testLocalVariable(self):
|
2012-01-13 05:51:57 +08:00
|
|
|
"""Start new process and test local variables"""
|
2012-01-12 06:23:29 +08:00
|
|
|
|
2012-01-25 19:57:47 +08:00
|
|
|
newClnt = pykd.createDbgClient()
|
|
|
|
newClnt.startProcess( target.appPath + " -testEnumWindows" )
|
2012-01-12 06:23:29 +08:00
|
|
|
|
2012-01-25 19:57:47 +08:00
|
|
|
newClnt.go() # initial breakpoint -> wmain
|
|
|
|
newClnt.go() # wmain -> targetapp!EnumWindowsProc1
|
|
|
|
# pykd.dprint( "\n" + newClnt.dbgCommand("u") )
|
2012-01-12 06:23:29 +08:00
|
|
|
|
2012-01-25 19:57:47 +08:00
|
|
|
locals = newClnt.getLocals()
|
2012-01-12 06:23:29 +08:00
|
|
|
|
|
|
|
self.assertNotEqual( 0, locals["hWindow"] )
|
|
|
|
self.assertEqual( pykd.DataIsParam, locals["hWindow"].dataKind() )
|
|
|
|
|
|
|
|
self.assertEqual( 6, locals["lParam"] )
|
|
|
|
self.assertEqual( pykd.DataIsParam, locals["lParam"].dataKind() )
|
|
|
|
|
|
|
|
self.assertNotEqual( 0, locals["dwProccessId"] )
|
|
|
|
self.assertEqual( pykd.DataIsLocal, locals["dwProccessId"].dataKind() )
|
|
|
|
|
|
|
|
self.assertNotEqual( 0, locals["staticVar"] )
|
|
|
|
self.assertEqual( pykd.DataIsStaticLocal, locals["staticVar"].dataKind() )
|
|
|
|
|
2012-01-12 21:41:01 +08:00
|
|
|
self.assertEqual( locals["dwProccessId"] + 1, locals["staticVar"] )
|
2012-01-13 05:51:57 +08:00
|
|
|
|
2012-01-25 19:57:47 +08:00
|
|
|
newClnt.go() # targetapp!EnumWindowsProc1 -> targetapp!functionCalledFromEnumWindowsProc1
|
|
|
|
|
|
|
|
# get local variables from previous stack frame
|
2012-01-25 22:34:18 +08:00
|
|
|
prevLocals = newClnt.getCurrentStack()[1].getLocals()
|
2012-01-25 19:57:47 +08:00
|
|
|
|
|
|
|
self.assertEqual( len(prevLocals), len(locals) )
|
|
|
|
for varName in locals.iterkeys():
|
|
|
|
self.assertEqual( prevLocals[varName], locals[varName] )
|
|
|
|
|
|
|
|
newClnt.go() # targetapp!EnumWindowsProc1 -> targetapp!EnumWindowsProc2
|
|
|
|
locals = newClnt.getLocals()
|
2012-01-13 05:51:57 +08:00
|
|
|
self.assertEqual( len(locals), 2 )
|
|
|
|
locValues = locals.values()
|
|
|
|
self.assertTrue( locValues[0] == 7 or locValues[1] == 7 )
|
|
|
|
|
2012-01-25 19:57:47 +08:00
|
|
|
|