34 #define MLD_CUSTOMSTACKWALK 1
36 #define MLD_MAX_NAME_LENGTH 256
37 #define MLD_MAX_TRACEINFO 256
38 #define MLD_TRACEINFO_EMPTY _T("")
39 #define MLD_TRACEINFO_NOSYMBOL _T("?(?)")
41 #ifdef MLD_CUSTOMSTACKWALK
42 #define MLD_STACKWALKER symStackTrace2
44 #define MLD_STACKWALKER symStackTrace
47 #if !defined(_MSC_VER) || defined(_WIN64)
57 std::basic_string<TCHAR> toString()
59 return _T(
"<Call stack unavailable>");
62 static void initSymbols()
66 static void deinitSymbols()
75 struct CallStackFrameEntry {
86 memset(traceinfo, 0, MLD_MAX_TRACEINFO *
sizeof(CallStackFrameEntry));
90 std::basic_string<TCHAR> toString();
92 static void initSymbols();
93 static void deinitSymbols();
97 friend class CMemLeakDetect;
99 CallStackFrameEntry traceinfo[MLD_MAX_TRACEINFO];
101 static HANDLE m_hProcess;
102 static PIMAGEHLP_SYMBOL m_pSymbol;
103 static DWORD m_dwsymBufSize;
105 static BOOL initSymInfo(TCHAR* lpUserPath);
106 static BOOL cleanupSymInfo();
107 static void symbolPaths( TCHAR* lpszSymbolPaths, UINT BufSizeTCHARs);
108 static void symStackTrace(CallStackFrameEntry* pStacktrace);
109 static void symStackTrace2(CallStackFrameEntry* pStacktrace);
110 static BOOL symFunctionInfoFromAddresses(ULONG fnAddress, ULONG stackAddress, TCHAR* lpszSymbol, UINT BufSizeTCHARs);
111 static BOOL symSourceInfoFromAddress(UINT address, TCHAR* lpszSourceInfo, UINT BufSizeTCHARs);
112 static BOOL symModuleNameFromAddress(UINT address, TCHAR* lpszModule, UINT BufSizeTCHARs);