mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-06 01:50:38 +00:00
Don't recreate callstacks, instead re-set stack in consistent instance
This commit is contained in:
@@ -45,11 +45,16 @@ class LinuxCallstack : public Callstack::Stackwalk
|
||||
}
|
||||
LinuxCallstack(uint64_t *calls, size_t num)
|
||||
{
|
||||
numLevels = (int)RDCMIN(ARRAY_COUNT(addrs), num);
|
||||
Set(calls, num);
|
||||
}
|
||||
~LinuxCallstack() {}
|
||||
|
||||
void Set(uint64_t *calls, size_t num)
|
||||
{
|
||||
numLevels = num;
|
||||
for(int i=0; i < numLevels; i++)
|
||||
addrs[i] = calls[i];
|
||||
}
|
||||
~LinuxCallstack() {}
|
||||
|
||||
size_t NumLevels() const { return size_t(numLevels); }
|
||||
const uint64_t *GetAddrs() const { return addrs; }
|
||||
@@ -107,9 +112,9 @@ namespace Callstack
|
||||
return new LinuxCallstack();
|
||||
}
|
||||
|
||||
Stackwalk *Load(uint64_t *calls, size_t numLevels)
|
||||
Stackwalk *Create()
|
||||
{
|
||||
return new LinuxCallstack(calls, numLevels);
|
||||
return new LinuxCallstack(NULL, 0);
|
||||
}
|
||||
|
||||
bool GetLoadedModules(char *&buf, size_t &size)
|
||||
|
||||
@@ -140,6 +140,9 @@ namespace Callstack
|
||||
{
|
||||
public:
|
||||
virtual ~Stackwalk() {}
|
||||
|
||||
virtual void Set(uint64_t *calls, size_t numLevels) = 0;
|
||||
|
||||
virtual size_t NumLevels() const = 0;
|
||||
virtual const uint64_t *GetAddrs() const = 0;
|
||||
};
|
||||
@@ -165,7 +168,7 @@ namespace Callstack
|
||||
void Init();
|
||||
|
||||
Stackwalk *Collect();
|
||||
Stackwalk *Load(uint64_t *calls, size_t numLevels);
|
||||
Stackwalk *Create();
|
||||
|
||||
StackResolver *MakeResolver(char *moduleDB, size_t DBSize, string pdbSearchPaths, volatile bool *killSignal);
|
||||
|
||||
|
||||
@@ -42,19 +42,19 @@ class Win32Callstack : public Callstack::Stackwalk
|
||||
{
|
||||
public:
|
||||
Win32Callstack();
|
||||
Win32Callstack(uint64_t *calls, size_t numLevels);
|
||||
Win32Callstack(DWORD64 *calls, size_t numLevels);
|
||||
~Win32Callstack();
|
||||
|
||||
size_t NumLevels() const { return m_NumLevels; }
|
||||
const uint64_t *GetAddrs() const { return m_AddrStack; }
|
||||
void Set(DWORD64 *calls, size_t numLevels);
|
||||
|
||||
size_t NumLevels() const { return m_AddrStack.size(); }
|
||||
const uint64_t *GetAddrs() const { return &m_AddrStack[0]; }
|
||||
private:
|
||||
Win32Callstack(const Callstack::Stackwalk &other);
|
||||
|
||||
void Collect();
|
||||
|
||||
size_t m_NumLevels;
|
||||
DWORD64 *m_AddrStack;
|
||||
DWORD64 *m_AllocStack;
|
||||
vector<DWORD64> m_AddrStack;
|
||||
};
|
||||
|
||||
class Win32CallstackResolver : public Callstack::StackResolver
|
||||
@@ -333,9 +333,8 @@ void Win32Callstack::Collect()
|
||||
stack32.erase(stack32.begin());
|
||||
}
|
||||
|
||||
m_NumLevels = stack32.size();
|
||||
m_AllocStack = m_AddrStack = new DWORD64[m_NumLevels];
|
||||
for(size_t i=0; i < m_NumLevels; i++)
|
||||
m_AddrStack.resize(stack32.size());
|
||||
for(size_t i=0; i < stack32.size(); i++)
|
||||
m_AddrStack[i] = (DWORD64)stack32[i];
|
||||
}
|
||||
|
||||
@@ -343,24 +342,24 @@ Win32Callstack::Win32Callstack()
|
||||
{
|
||||
bool ret = InitDbgHelp();
|
||||
|
||||
m_AllocStack = m_AddrStack = NULL;
|
||||
m_NumLevels = 0;
|
||||
|
||||
if(ret && renderdocBase != NULL)
|
||||
Collect();
|
||||
}
|
||||
|
||||
Win32Callstack::Win32Callstack(DWORD64 *calls, size_t numLevels)
|
||||
{
|
||||
m_NumLevels = numLevels;
|
||||
m_AllocStack = m_AddrStack = new DWORD64[m_NumLevels];
|
||||
for(size_t i=0; i < m_NumLevels; i++)
|
||||
Set(calls, numLevels);
|
||||
}
|
||||
|
||||
void Win32Callstack::Set(DWORD64 *calls, size_t numLevels)
|
||||
{
|
||||
m_AddrStack.resize(numLevels);
|
||||
for(size_t i=0; i < numLevels; i++)
|
||||
m_AddrStack[i] = calls[i];
|
||||
}
|
||||
|
||||
Win32Callstack::~Win32Callstack()
|
||||
{
|
||||
SAFE_DELETE_ARRAY(m_AllocStack);
|
||||
}
|
||||
|
||||
wstring Win32CallstackResolver::pdbBrowse(wstring startingPoint)
|
||||
@@ -762,9 +761,9 @@ namespace Callstack
|
||||
return new Win32Callstack();
|
||||
}
|
||||
|
||||
Stackwalk *Load(uint64_t *calls, size_t numLevels)
|
||||
Stackwalk *Create()
|
||||
{
|
||||
return new Win32Callstack(calls, numLevels);
|
||||
return new Win32Callstack(NULL, 0);
|
||||
}
|
||||
|
||||
StackResolver *MakeResolver(char *moduleDB, size_t DBSize, string pdbSearchPaths, volatile bool *killSignal)
|
||||
|
||||
@@ -131,7 +131,7 @@ void Serialiser::Reset()
|
||||
m_Indent = 0;
|
||||
|
||||
SAFE_DELETE_ARRAY(m_pCallstack);
|
||||
SAFE_DELETE_ARRAY(m_pResolver);
|
||||
SAFE_DELETE(m_pResolver);
|
||||
if(m_Buffer)
|
||||
{
|
||||
FreeAlignedBuffer(m_Buffer);
|
||||
@@ -392,10 +392,10 @@ void Serialiser::InitCallstackResolver()
|
||||
|
||||
void Serialiser::SetCallstack(uint64_t *levels, size_t numLevels)
|
||||
{
|
||||
SAFE_DELETE(m_pCallstack);
|
||||
if(m_pCallstack == NULL)
|
||||
m_pCallstack = Callstack::Create();
|
||||
|
||||
if(levels != NULL && numLevels != 0)
|
||||
m_pCallstack = Callstack::Load(levels, numLevels);
|
||||
m_pCallstack->Set(levels, numLevels);
|
||||
}
|
||||
|
||||
void Serialiser::CreateResolver(void *ths)
|
||||
|
||||
@@ -324,7 +324,7 @@ class Serialiser
|
||||
// get the callstack associated with the last scope
|
||||
Callstack::Stackwalk *GetLastCallstack()
|
||||
{
|
||||
return m_pCallstack;
|
||||
return (m_pCallstack && m_pCallstack->NumLevels() > 0) ? m_pCallstack : NULL;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////
|
||||
|
||||
Reference in New Issue
Block a user