RecyclerObjectGraphDumper.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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. #pragma once
  6. #ifdef RECYCLER_DUMP_OBJECT_GRAPH
  7. class RecyclerObjectGraphDumper
  8. {
  9. public:
  10. struct Param
  11. {
  12. bool (*dumpReferenceFunc)(char16 const *, void *objectAddress, void *referenceAddress);
  13. bool dumpRootOnly;
  14. bool skipStack;
  15. #ifdef RECYCLER_STATS
  16. RecyclerCollectionStats stats;
  17. #endif
  18. };
  19. RecyclerObjectGraphDumper(Recycler * recycler, Param * param);
  20. ~RecyclerObjectGraphDumper();
  21. void BeginDumpObject(void * objectAddres);
  22. void BeginDumpObject(char16 const * name);
  23. void BeginDumpObject(char16 const * name, void* objectAddress);
  24. void EndDumpObject();
  25. void DumpObjectReference(void * objectAddress, bool remark);
  26. Recycler * recycler;
  27. Param * param;
  28. char16 const * dumpObjectName;
  29. char16 tempObjectName[256];
  30. void * dumpObject;
  31. #ifdef PROFILE_RECYCLER_ALLOC
  32. type_info const * dumpObjectTypeInfo;
  33. bool dumpObjectIsArray;
  34. #endif
  35. bool isOutOfMemory;
  36. };
  37. #endif
  38. #ifdef RECYCLER_DUMP_OBJECT_GRAPH
  39. #define BEGIN_DUMP_OBJECT(recycler, address) { if (recycler->objectGraphDumper != nullptr) { recycler->objectGraphDumper->BeginDumpObject(address); }
  40. #define BEGIN_DUMP_OBJECT_ADDRESS(name, address) { if (this->objectGraphDumper != nullptr) { this->objectGraphDumper->BeginDumpObject(name, address); }
  41. #define DUMP_OBJECT_REFERENCE(recycler, address) if (recycler->objectGraphDumper != nullptr) { recycler->objectGraphDumper->DumpObjectReference(address, false); }
  42. #define DUMP_OBJECT_REFERENCE_REMARK(recycler, address) if (recycler->objectGraphDumper != nullptr && recycler->IsValidObject(address)) { recycler->objectGraphDumper->DumpObjectReference(address, true); }
  43. #define END_DUMP_OBJECT(recycler) if (recycler->objectGraphDumper != nullptr) { recycler->objectGraphDumper->EndDumpObject(); } }
  44. #define DUMP_IMPLICIT_ROOT(recycler, address) BEGIN_DUMP_OBJECT(recycler, _u("Implicit Root")); DUMP_OBJECT_REFERENCE(recycler, address); END_DUMP_OBJECT(recycler);
  45. #else
  46. #define BEGIN_DUMP_OBJECT(recycler, address)
  47. #define BEGIN_DUMP_OBJECT_ADDRESS(name, address)
  48. #define DUMP_OBJECT_REFERENCE(recycler, address)
  49. #define DUMP_OBJECT_REFERENCE_REMARK(recycler, address)
  50. #define END_DUMP_OBJECT(recycler)
  51. #define DUMP_IMPLICIT_ROOT(recycler, address)
  52. #endif