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;
}
@@ -209,7 +209,7 @@ namespace MaterialEditor
QString("Would you like to reopen the document:\n%1?").arg(documentPath.c_str()),
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes)
{
AtomToolsFramework::TraceRecorder traceRecorder;
AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount);
bool openResult = false;
MaterialDocumentRequestBus::EventResult(openResult, documentId, &MaterialDocumentRequestBus::Events::Open, documentPath);
@@ -217,7 +217,7 @@ namespace MaterialEditor
{
QMessageBox::critical(
QApplication::activeWindow(), QString("Material document could not be opened"),
QString("Failed to open: \n%1\n\n%2").arg(documentPath.c_str()).arg(traceRecorder.m_messageSink.c_str()));
QString("Failed to open: \n%1\n\n%2").arg(documentPath.c_str()).arg(traceRecorder.GetDump().c_str()));
MaterialDocumentSystemRequestBus::Broadcast(&MaterialDocumentSystemRequestBus::Events::CloseDocument, documentId);
}
}
@@ -233,7 +233,7 @@ namespace MaterialEditor
QString("Would you like to update the document with these changes:\n%1?").arg(documentPath.c_str()),
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes)
{
AtomToolsFramework::TraceRecorder traceRecorder;
AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount);
bool openResult = false;
MaterialDocumentRequestBus::EventResult(openResult, documentId, &MaterialDocumentRequestBus::Events::Rebuild);
@@ -241,7 +241,7 @@ namespace MaterialEditor
{
QMessageBox::critical(
QApplication::activeWindow(), QString("Material document could not be opened"),
QString("Failed to open: \n%1\n\n%2").arg(documentPath.c_str()).arg(traceRecorder.m_messageSink.c_str()));
QString("Failed to open: \n%1\n\n%2").arg(documentPath.c_str()).arg(traceRecorder.GetDump().c_str()));
MaterialDocumentSystemRequestBus::Broadcast(&MaterialDocumentSystemRequestBus::Events::CloseDocument, documentId);
}
}
@@ -313,7 +313,7 @@ namespace MaterialEditor
}
}
AtomToolsFramework::TraceRecorder traceRecorder;
AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount);
bool closeResult = true;
MaterialDocumentRequestBus::EventResult(closeResult, documentId, &MaterialDocumentRequestBus::Events::Close);
@@ -321,7 +321,7 @@ namespace MaterialEditor
{
QMessageBox::critical(
QApplication::activeWindow(), QString("Material document could not be closed"),
QString("Failed to close: \n%1\n\n%2").arg(documentPath.c_str()).arg(traceRecorder.m_messageSink.c_str()));
QString("Failed to close: \n%1\n\n%2").arg(documentPath.c_str()).arg(traceRecorder.GetDump().c_str()));
return false;
}
@@ -379,7 +379,7 @@ namespace MaterialEditor
return false;
}
AtomToolsFramework::TraceRecorder traceRecorder;
AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount);
bool result = false;
MaterialDocumentRequestBus::EventResult(result, documentId, &MaterialDocumentRequestBus::Events::Save);
@@ -387,7 +387,7 @@ namespace MaterialEditor
{
QMessageBox::critical(
QApplication::activeWindow(), QString("Material document could not be saved"),
QString("Failed to save: \n%1\n\n%2").arg(saveMaterialPath.c_str()).arg(traceRecorder.m_messageSink.c_str()));
QString("Failed to save: \n%1\n\n%2").arg(saveMaterialPath.c_str()).arg(traceRecorder.GetDump().c_str()));
return false;
}
@@ -409,7 +409,7 @@ namespace MaterialEditor
return false;
}
AtomToolsFramework::TraceRecorder traceRecorder;
AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount);
bool result = false;
MaterialDocumentRequestBus::EventResult(result, documentId, &MaterialDocumentRequestBus::Events::SaveAsCopy, saveMaterialPath);
@@ -417,7 +417,7 @@ namespace MaterialEditor
{
QMessageBox::critical(
QApplication::activeWindow(), QString("Material document could not be saved"),
QString("Failed to save: \n%1\n\n%2").arg(saveMaterialPath.c_str()).arg(traceRecorder.m_messageSink.c_str()));
QString("Failed to save: \n%1\n\n%2").arg(saveMaterialPath.c_str()).arg(traceRecorder.GetDump().c_str()));
return false;
}
@@ -439,7 +439,7 @@ namespace MaterialEditor
return false;
}
AtomToolsFramework::TraceRecorder traceRecorder;
AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount);
bool result = false;
MaterialDocumentRequestBus::EventResult(result, documentId, &MaterialDocumentRequestBus::Events::SaveAsChild, saveMaterialPath);
@@ -447,7 +447,7 @@ namespace MaterialEditor
{
QMessageBox::critical(
QApplication::activeWindow(), QString("Material document could not be saved"),
QString("Failed to save: \n%1\n\n%2").arg(saveMaterialPath.c_str()).arg(traceRecorder.m_messageSink.c_str()));
QString("Failed to save: \n%1\n\n%2").arg(saveMaterialPath.c_str()).arg(traceRecorder.GetDump().c_str()));
return false;
}
@@ -497,7 +497,7 @@ namespace MaterialEditor
}
}
AtomToolsFramework::TraceRecorder traceRecorder;
AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount);
AZ::Uuid documentId = AZ::Uuid::CreateNull();
MaterialDocumentSystemRequestBus::BroadcastResult(documentId, &MaterialDocumentSystemRequestBus::Events::CreateDocument);
@@ -505,11 +505,11 @@ namespace MaterialEditor
{
QMessageBox::critical(
QApplication::activeWindow(), QString("Material document could not be created"),
QString("Failed to create: \n%1\n\n%2").arg(requestedPath.c_str()).arg(traceRecorder.m_messageSink.c_str()));
QString("Failed to create: \n%1\n\n%2").arg(requestedPath.c_str()).arg(traceRecorder.GetDump().c_str()));
return AZ::Uuid::CreateNull();
}
traceRecorder.m_messageSink.clear();
traceRecorder.GetDump().clear();
bool openResult = false;
MaterialDocumentRequestBus::EventResult(openResult, documentId, &MaterialDocumentRequestBus::Events::Open, requestedPath);
@@ -517,7 +517,7 @@ namespace MaterialEditor
{
QMessageBox::critical(
QApplication::activeWindow(), QString("Material document could not be opened"),
QString("Failed to open: \n%1\n\n%2").arg(requestedPath.c_str()).arg(traceRecorder.m_messageSink.c_str()));
QString("Failed to open: \n%1\n\n%2").arg(requestedPath.c_str()).arg(traceRecorder.GetDump().c_str()));
MaterialDocumentSystemRequestBus::Broadcast(&MaterialDocumentSystemRequestBus::Events::DestroyDocument, documentId);
return AZ::Uuid::CreateNull();
}
@@ -98,5 +98,6 @@ namespace MaterialEditor
AZStd::unordered_set<AZ::Uuid> m_documentIdsToRebuild;
AZStd::unordered_set<AZ::Uuid> m_documentIdsToReopen;
AZStd::unique_ptr<MaterialEditorSettings> m_settings;
const size_t m_maxMessageBoxLineCount = 15;
};
}