Updating trace recorder to allow limiting the number of messages stored

This commit is contained in:
guthadam
2021-04-21 15:57:44 -05:00
parent 0e6fea21fc
commit 215931a1ae
4 changed files with 56 additions and 35 deletions
@@ -13,20 +13,24 @@
#pragma once
#include <AzCore/Debug/TraceMessageBus.h>
#include <AzCore/std/containers/list.h>
#include <AzCore/std/string/string.h>
namespace AtomToolsFramework
{
// Records all TraceMessageBus activity to a string
class TraceRecorder
: private AZ::Debug::TraceMessageBus::Handler
class TraceRecorder : private AZ::Debug::TraceMessageBus::Handler
{
public:
AZ_TYPE_INFO(AtomToolsFramework::TraceRecorder, "{7B49AFD0-D0AB-4CB7-A4B5-6D88D30DCBFD}");
TraceRecorder();
TraceRecorder(size_t maxMessageCount = std::numeric_limits<size_t>::max());
~TraceRecorder();
//! Get the combined output of all messages
AZStd::string GetDump() const;
private:
//////////////////////////////////////////////////////////////////////////
// AZ::Debug::TraceMessageBus::Handler overrides...
bool OnAssert(const char* /*message*/) override;
@@ -36,6 +40,7 @@ namespace AtomToolsFramework
bool OnPrintf(const char* /*window*/, const char* /*message*/) override;
//////////////////////////////////////////////////////////////////////////
AZStd::string m_messageSink;
size_t m_maxMessageCount = std::numeric_limits<size_t>::max();
AZStd::list<AZStd::string> m_messages;
};
} // namespace AtomToolsFramework
@@ -11,10 +11,12 @@
*/
#include <AtomToolsFramework/Debug/TraceRecorder.h>
#include <AzCore/StringFunc/StringFunc.h>
namespace AtomToolsFramework
{
TraceRecorder::TraceRecorder()
TraceRecorder::TraceRecorder(size_t maxMessageCount)
: m_maxMessageCount(maxMessageCount)
{
AZ::Debug::TraceMessageBus::Handler::BusConnect();
}
@@ -24,42 +26,55 @@ namespace AtomToolsFramework
AZ::Debug::TraceMessageBus::Handler::BusDisconnect();
}
AZStd::string TraceRecorder::GetDump() const
{
AZStd::string dump;
AZ::StringFunc::Join(dump, m_messages.begin(), m_messages.end(), "\n");
return dump;
}
bool TraceRecorder::OnAssert(const char* message)
{
m_messageSink += "Assert: ";
m_messageSink += message;
m_messageSink += "\n";
if (m_messages.size() < m_maxMessageCount)
{
m_messages.push_back(AZStd::string::format("Assert: %s", message));
}
return false;
}
bool TraceRecorder::OnException(const char* message)
{
m_messageSink += "Exception: ";
m_messageSink += message;
m_messageSink += "\n";
if (m_messages.size() < m_maxMessageCount)
{
m_messages.push_back(AZStd::string::format("Exception: %s", message));
}
return false;
}
bool TraceRecorder::OnError(const char* /*window*/, const char* message)
{
m_messageSink += "Error: ";
m_messageSink += message;
m_messageSink += "\n";
if (m_messages.size() < m_maxMessageCount)
{
m_messages.push_back(AZStd::string::format("Error: %s", message));
}
return false;
}
bool TraceRecorder::OnWarning(const char* /*window*/, const char* message)
{
m_messageSink += "Warning: ";
m_messageSink += message;
m_messageSink += "\n";
if (m_messages.size() < m_maxMessageCount)
{
m_messages.push_back(AZStd::string::format("Warning: %s", message));
}
return false;
}
bool TraceRecorder::OnPrintf(const char* /*window*/, const char* message)
{
m_messageSink += message;
m_messageSink += "\n";
if (m_messages.size() < m_maxMessageCount)
{
m_messages.push_back(AZStd::string::format("%s", message));
}
return false;
}