RecyclerObjectDumper.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #include "CommonMemoryPch.h"
  6. #ifdef PROFILE_RECYCLER_ALLOC
  7. // Initialization order
  8. // AB AutoSystemInfo
  9. // AD PerfCounter
  10. // AE PerfCounterSet
  11. // AM Output/Configuration
  12. // AN MemProtectHeap
  13. // AP DbgHelpSymbolManager
  14. // AQ CFGLogger
  15. // AR LeakReport
  16. // AS JavascriptDispatch/RecyclerObjectDumper
  17. // AT HeapAllocator/RecyclerHeuristic
  18. // AU RecyclerWriteBarrierManager
  19. #pragma warning(disable:4075) // initializers put in unrecognized initialization area on purpose
  20. #pragma init_seg(".CRT$XCAS")
  21. RecyclerObjectDumper::DumpFunctionMap * RecyclerObjectDumper::dumpFunctionMap = nullptr;
  22. RecyclerObjectDumper RecyclerObjectDumper::Instance;
  23. RecyclerObjectDumper::~RecyclerObjectDumper()
  24. {
  25. if (dumpFunctionMap)
  26. {
  27. NoCheckHeapDelete(dumpFunctionMap);
  28. }
  29. }
  30. BOOL
  31. RecyclerObjectDumper::EnsureDumpFunctionMap()
  32. {
  33. if (dumpFunctionMap == nullptr)
  34. {
  35. dumpFunctionMap = NoCheckHeapNew(DumpFunctionMap, &NoCheckHeapAllocator::Instance);
  36. }
  37. return (dumpFunctionMap != nullptr);
  38. }
  39. void
  40. RecyclerObjectDumper::RegisterDumper(type_info const * typeinfo, DumpFunction dumperFunction)
  41. {
  42. if (EnsureDumpFunctionMap())
  43. {
  44. Assert(!dumpFunctionMap->ContainsKey(typeinfo));
  45. dumpFunctionMap->Add(typeinfo, dumperFunction);
  46. }
  47. }
  48. void
  49. RecyclerObjectDumper::DumpObject(type_info const * typeinfo, bool isArray, void * objectAddress)
  50. {
  51. if (typeinfo == nullptr)
  52. {
  53. Output::Print(_u("Address %p"), objectAddress);
  54. }
  55. else
  56. {
  57. DumpFunction dumpFunction;
  58. if (dumpFunctionMap == nullptr || !dumpFunctionMap->TryGetValue(typeinfo, &dumpFunction) || !dumpFunction(typeinfo, isArray, objectAddress))
  59. {
  60. Output::Print(isArray? _u("%S[] %p") : _u("%S %p"), typeinfo->name(), objectAddress);
  61. }
  62. }
  63. }
  64. #endif