Don't recreate callstacks, instead re-set stack in consistent instance

This commit is contained in:
baldurk
2015-09-13 16:44:25 +02:00
parent c136dcfcfe
commit e6621c8956
5 changed files with 35 additions and 28 deletions
+9 -4
View File
@@ -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)
+4 -1
View File
@@ -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);
+17 -18
View File
@@ -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)
+4 -4
View File
@@ -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)
+1 -1
View File
@@ -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;
}
//////////////////////////////////////////