1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-07 19:18:19 +02:00
Beef/IDEHelper/HotScanner.h

115 lines
No EOL
2.3 KiB
C++

#pragma once
#include "DebugCommon.h"
#include "BeefySysLib/util/HashSet.h"
#include "Debugger.h"
NS_BF_DBG_BEGIN
namespace TCFake
{
struct Span;
static const size_t kPageShift = 13;
static const size_t kNumClasses = 88;
struct PageHeap
{
struct PageMap
{
#ifdef BF_DBG_32
static const int BITS = 32 - kPageShift;
static const int ROOT_BITS = 5;
static const int ROOT_LENGTH = 1 << ROOT_BITS;
static const int LEAF_BITS = BITS - ROOT_BITS;
static const int LEAF_LENGTH = 1 << LEAF_BITS;
struct Leaf
{
addr_target ptrs[LEAF_LENGTH];
};
struct Root
{
addr_target ptrs[ROOT_LENGTH];
};
#else
static const int BITS = 48 - kPageShift;
static const int INTERIOR_BITS = (BITS + 2) / 3; // Round-up
static const int INTERIOR_LENGTH = 1 << INTERIOR_BITS;
static const int LEAF_BITS = BITS - 2 * INTERIOR_BITS;
static const int LEAF_LENGTH = 1 << LEAF_BITS;
struct Node
{
addr_target ptrs[INTERIOR_LENGTH];
};
struct Leaf
{
addr_target ptrs[LEAF_LENGTH];
};
#endif
};
};
}
class WinDebugger;
class DbgSubprogram;
enum BfRtFlags
{
BfRtFlags_ObjectHasDebugFlags = 1,
BfRtFlags_LeakCheck = 2,
BfRtFlags_SilentCrash = 4,
BfRtFlags_DebugAlloc = 8
};
class DbgGCData
{
public:
BfRtFlags mDbgFlags;
addr_target mObjRootPtr;
addr_target mRawRootPtr;
addr_target mRawObjectSentinel;
int mSizeClasses[TCFake::kNumClasses];
};
class DbgHotScanner
{
public:
WinDebugger* mDebugger;
DbgGCData mDbgGCData;
addr_target mBfTypesInfoAddr;
Beefy::Dictionary<addr_target, int> mFoundClassVDataAddrs;
Beefy::Dictionary<addr_target, int> mFoundRawAllocDataAddrs;
Beefy::Dictionary<addr_target, int> mFoundTypeAddrs;
Beefy::HashSet<addr_target> mFoundFuncPtrs;
#ifdef BF_DBG_32
TCFake::PageHeap::PageMap::Root mRoot;
TCFake::PageHeap::PageMap::Leaf mNode;
#else
TCFake::PageHeap::PageMap::Node mRoot;
TCFake::PageHeap::PageMap::Node mNode1;
TCFake::PageHeap::PageMap::Leaf mNode2;
#endif
Beefy::Array<uint8> mScanData;
public:
void AddSubProgram(DbgSubprogram* subProgram, bool followInlineParent, const Beefy::StringImpl& prefix);
void PopulateHotCallstacks();
void ScanSpan(TCFake::Span* span, int expectedStartPage, int memKind);
void ScanRoot(addr_target rootPtr, int memKind);
public:
DbgHotScanner(WinDebugger* debugger);
void Scan(Beefy::DbgHotResolveFlags flags);
};
NS_BF_DBG_END