// Fix the inner type of containers (that is, make it work smoothly with AddSymbol) // by prefixing it with the module except for well-known types like STL/Qt types static inline std::string fixInnerType(std::string type, const SymbolGroupValue &container) { std::string stripped = SymbolGroupValue::stripConst(SymbolGroupValue::stripClassPrefixes(type)); // Unfortunately the cdb can not handle the vc exclusiv 64 bit integer // "__int64" but works fine with "int64", so we have to strip down "__" const size_t __int64pos = stripped.find("__int64"); if (__int64pos != std::string::npos) stripped.erase(__int64pos, 2); const KnownType kt = knownType(stripped, 0); // Resolve types unless they are POD or pointers to POD (that is, qualify 'Foo' and 'Foo*') const bool needResolve = kt == KT_Unknown || kt == KT_PointerType || !(kt & KT_POD_Type); const std::string fixed = needResolve ? SymbolGroupValue::resolveType(stripped, container.context(), container.module()) : stripped; if (SymbolGroupValue::verbose) { DebugPrint dp; dp << "fixInnerType (resolved=" << needResolve << ") '" << type << "' ["; formatKnownTypeFlags(dp, kt); dp << "] -> '" << fixed <<"'\n"; } return fixed; }
// Return size from an STL vector (last/first iterators). static inline int msvcStdVectorSize(const SymbolGroupValue &v) { const ULONG64 firstPtr = v.readPointerValueFromAncestor("_Myfirst"); const ULONG64 lastPtr = v.readPointerValueFromAncestor("_Mylast"); if (!firstPtr || lastPtr < firstPtr) return -1; const std::vector<std::string> innerTypes = v.innerTypes(); if (innerTypes.empty()) return -1; const std::string innerType = fixInnerType(SymbolGroupValue::stripPointerType(innerTypes[0]), v); const size_t size = SymbolGroupValue::sizeOf(innerType.c_str()); if (size == 0) return -1; if (lastPtr == firstPtr) return 0; // Subtract the pointers: We need to do the pointer arithmetics ourselves // as we get char *pointers. return static_cast<int>((lastPtr - firstPtr) / size); }
// Fix the inner type of containers (that is, make it work smoothly with AddSymbol) // by prefixing it with the module except for well-known types like STL/Qt types static inline std::string fixInnerType(std::string type, const SymbolGroupValue &container) { const std::string stripped = SymbolGroupValue::stripConst(SymbolGroupValue::stripClassPrefixes(type)); const KnownType kt = knownType(stripped, 0); // Resolve types unless they are POD or pointers to POD (that is, qualify 'Foo' and 'Foo*') const bool needResolve = kt == KT_Unknown || kt == KT_PointerType || !(kt & KT_POD_Type); const std::string fixed = needResolve ? SymbolGroupValue::resolveType(stripped, container.context(), container.module()) : stripped; if (SymbolGroupValue::verbose) { DebugPrint dp; dp << "fixInnerType (resolved=" << needResolve << ") '" << type << "' ["; formatKnownTypeFlags(dp, kt); dp << "] -> '" << fixed <<"'\n"; } return fixed; }