From 932fc9392636857b8f8d98f1b62e9abca223e005 Mon Sep 17 00:00:00 2001 From: "SND\\EreTIk_cp" Date: Wed, 28 Dec 2011 13:32:50 +0000 Subject: [PATCH] [0.1.x] + classification of data symbol: data kind git-svn-id: https://pykd.svn.codeplex.com/svn@72739 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/dbgext.cpp | 15 ++++++++++ pykd/diadata.cpp | 18 ++++++++++++ pykd/diaprint.cpp | 7 +++++ pykd/diawrapper.h | 2 ++ test/scripts/diatest.py | 9 ++++++ test/targetapp/targetapp.cpp | 53 ++++++++++++++++++++++++++++++++++++ 6 files changed, 104 insertions(+) diff --git a/pykd/dbgext.cpp b/pykd/dbgext.cpp index 7e7f9a9..efb3ad6 100644 --- a/pykd/dbgext.cpp +++ b/pykd/dbgext.cpp @@ -625,6 +625,8 @@ BOOST_PYTHON_MODULE( pykd ) "Retrieves the unique symbol identifier") .def( "udtKind", &pyDia::Symbol::getUdtKind, "Retrieves the variety of a user-defined type") + .def( "dataKind", &pyDia::Symbol::getDataKind, + "Retrieves the variable classification of a data symbol") .def("registerId", &pyDia::Symbol::getRegisterId, "Retrieves the register designator of the location:\n" "CV_REG_XXX (for IMAGE_FILE_MACHINE_I386) or CV_AMD64_XXX (for IMAGE_FILE_MACHINE_AMD64)") @@ -682,6 +684,19 @@ BOOST_PYTHON_MODULE( pykd ) python::scope().attr("diaSymTagName") = genDict(pyDia::Symbol::symTagName, _countof(pyDia::Symbol::symTagName)); + DEF_PY_CONST_ULONG(DataIsUnknown); + DEF_PY_CONST_ULONG(DataIsLocal); + DEF_PY_CONST_ULONG(DataIsStaticLocal); + DEF_PY_CONST_ULONG(DataIsParam); + DEF_PY_CONST_ULONG(DataIsObjectPtr); + DEF_PY_CONST_ULONG(DataIsFileStatic); + DEF_PY_CONST_ULONG(DataIsGlobal); + DEF_PY_CONST_ULONG(DataIsMember); + DEF_PY_CONST_ULONG(DataIsStaticMember); + DEF_PY_CONST_ULONG(DataIsConstant); + python::scope().attr("diaDataKind") = + genDict(pyDia::Symbol::dataKindName, _countof(pyDia::Symbol::dataKindName)); + // search options for symbol and file names DEF_PY_CONST_ULONG(nsfCaseSensitive); DEF_PY_CONST_ULONG(nsfCaseInsensitive); diff --git a/pykd/diadata.cpp b/pykd/diadata.cpp index c29e75a..aa345d9 100644 --- a/pykd/diadata.cpp +++ b/pykd/diadata.cpp @@ -43,6 +43,24 @@ const Symbol::ValueNameEntry Symbol::symTagName[SymTagMax] = { }; #undef _DEF_SYM_TAG_VAL +//////////////////////////////////////////////////////////////////////////////// + +#define _DEF_DATA_KIND_VAL(x) Symbol::ValueNameEntry(DataIs##x, #x) +const Symbol::ValueNameEntry Symbol::dataKindName[DataIsConstant + 1] = { + _DEF_DATA_KIND_VAL(Unknown), + _DEF_DATA_KIND_VAL(Local), + _DEF_DATA_KIND_VAL(StaticLocal), + _DEF_DATA_KIND_VAL(Param), + _DEF_DATA_KIND_VAL(ObjectPtr), + _DEF_DATA_KIND_VAL(FileStatic), + _DEF_DATA_KIND_VAL(Global), + _DEF_DATA_KIND_VAL(Member), + _DEF_DATA_KIND_VAL(StaticMember), + _DEF_DATA_KIND_VAL(Constant) +}; +#undef _DEF_DATA_KIND_VAL + + //////////////////////////////////////////////////////////////////////////////// #define _DEF_LOC_TYPE(x) Symbol::ValueNameEntry(LocIs##x, #x) diff --git a/pykd/diaprint.cpp b/pykd/diaprint.cpp index 6c21ea8..3921f6e 100644 --- a/pykd/diaprint.cpp +++ b/pykd/diaprint.cpp @@ -202,6 +202,13 @@ std::string Symbol::printImpl( bFuncDebugRange = (SymTagFuncDebugStart == symTagName[dwValue].first) || (SymTagFuncDebugEnd == symTagName[dwValue].first); + + hres = _symbol->get_dataKind(&dwValue); + if ((S_OK == hres) && (DataIsUnknown != dwValue)) + { + if (dwValue < _countof(dataKindName)) + sstream << ", " << dataKindName[dwValue].second; + } } else { diff --git a/pykd/diawrapper.h b/pykd/diawrapper.h index f315c97..8530299 100644 --- a/pykd/diawrapper.h +++ b/pykd/diawrapper.h @@ -151,6 +151,8 @@ public: public: typedef std::pair ValueNameEntry; + static const ValueNameEntry dataKindName[DataIsConstant + 1]; + static const ValueNameEntry symTagName[SymTagMax]; static const ValueNameEntry locTypeName[LocTypeMax]; diff --git a/test/scripts/diatest.py b/test/scripts/diatest.py index ea5c835..251885c 100644 --- a/test/scripts/diatest.py +++ b/test/scripts/diatest.py @@ -227,3 +227,12 @@ class DiaTest( unittest.TestCase ): except pykd.DiaException as diaExcept: print diaExcept self.assertTrue(False) + + def testDataKind(self): + try: + gScope = pykd.diaLoadPdb( str(target.module.pdb()) ) + self.assertEqual( pykd.DataIsGlobal, gScope["g_structTest"].dataKind() ) + self.assertEqual( pykd.DataIsParam, gScope["EnumWindowsProc"]["hWindow"].dataKind() ) + except pykd.DiaException as diaExcept: + print diaExcept + self.assertTrue(False) diff --git a/test/targetapp/targetapp.cpp b/test/targetapp/targetapp.cpp index 766a07e..772b002 100644 --- a/test/targetapp/targetapp.cpp +++ b/test/targetapp/targetapp.cpp @@ -146,6 +146,16 @@ struct listStruct1 { struct listStruct1 *next; }; +class classWithDestructor +{ +public: + classWithDestructor(DWORD errCode) : m_errCode(errCode) {} + virtual ~classWithDestructor() {::SetLastError(m_errCode);} + +private: + DWORD m_errCode; +}; + listStruct1 g_listItem11 = { 100 }; listStruct1 g_listItem12 = { 200 }; listStruct1 g_listItem13 = { 300 }; @@ -217,6 +227,47 @@ void FuncWithName1(int a) std::cout << g_string; } +void FuncWithVolatileArg(volatile long *arg1) +{ + InterlockedIncrement(arg1); +} + +BOOL CALLBACK EnumWindowsProc( + HWND hWindow, + LPARAM lParam +) +{ + if (hWindow) + std::cout << lParam; + + switch(lParam) + { + case 1: + std::cout << "case 1"; + break; + + case 2: + std::cout << "case 2"; + break; + + case 3: + std::cout << "case 2"; + break; + + default: + { + DWORD dwProccessId = 0; + DWORD dwThreadId = ::GetWindowThreadProcessId(hWindow, &dwProccessId); + std::cout << dwProccessId << dwThreadId; + classWithDestructor classInstance(dwProccessId); + std::cout << GetWindowLong(hWindow, GWL_STYLE); + } + + } + + return FALSE; +} + #pragma pack( pop ) //////////////////////////////////////////////////////////////////////////////// @@ -261,6 +312,8 @@ int _tmain(int argc, _TCHAR* argv[]) __debugbreak(); FuncWithName0(); FuncWithName1(2); + + EnumWindows(&::EnumWindowsProc, 6); } catch(std::exception & ex) {