diff --git a/src/apps/debugger/MessageCodes.h b/src/apps/debugger/MessageCodes.h index b3e0f9717b..610935a959 100644 --- a/src/apps/debugger/MessageCodes.h +++ b/src/apps/debugger/MessageCodes.h @@ -55,7 +55,8 @@ enum { MSG_INSPECT_ADDRESS = 'isad', MSG_SHOW_TYPECAST_NODE_PROMPT = 'stnp', MSG_TYPECAST_NODE = 'tyno', - MSG_SHOW_WATCH_VARIABLE_PROMPT = 'swvp' + MSG_SHOW_WATCH_VARIABLE_PROMPT = 'swvp', + MSG_GENERATE_DEBUG_REPORT = 'gdrp' }; diff --git a/src/apps/debugger/controllers/TeamDebugger.cpp b/src/apps/debugger/controllers/TeamDebugger.cpp index e316d8b7f8..d0865ec68c 100644 --- a/src/apps/debugger/controllers/TeamDebugger.cpp +++ b/src/apps/debugger/controllers/TeamDebugger.cpp @@ -12,6 +12,7 @@ #include +#include #include #include @@ -22,6 +23,7 @@ #include "BreakpointSetting.h" #include "CpuState.h" #include "DebuggerInterface.h" +#include "DebugReportGenerator.h" #include "FileManager.h" #include "Function.h" #include "FunctionID.h" @@ -146,6 +148,7 @@ TeamDebugger::TeamDebugger(Listener* listener, UserInterface* userInterface, fBreakpointManager(NULL), fWatchpointManager(NULL), fMemoryBlockManager(NULL), + fReportGenerator(NULL), fDebugEventListener(-1), fUserInterface(userInterface), fTerminating(false), @@ -204,6 +207,7 @@ TeamDebugger::~TeamDebugger() delete fBreakpointManager; delete fWatchpointManager; delete fMemoryBlockManager; + delete fReportGenerator; delete fWorker; delete fTeam; delete fFileManager; @@ -327,6 +331,15 @@ TeamDebugger::Init(team_id teamID, thread_id threadID, bool stopInMain) if (error != B_OK) return error; + // create the debug report generator + fReportGenerator = new(std::nothrow) DebugReportGenerator(fTeam); + if (fReportGenerator == NULL) + return B_NO_MEMORY; + + error = fReportGenerator->Init(); + if (error != B_OK) + return error; + // set team debugging flags fDebuggerInterface->SetTeamDebuggingFlags( B_TEAM_DEBUG_THREADS | B_TEAM_DEBUG_IMAGES); @@ -535,6 +548,14 @@ TeamDebugger::MessageReceived(BMessage* message) break; } + case MSG_GENERATE_DEBUG_REPORT: + { + entry_ref ref; + if (message->FindRef("target", &ref) == B_OK) + _HandleGenerateDebugReport(ref); + break; + } + case MSG_THREAD_STATE_CHANGED: { int32 threadID; @@ -809,6 +830,15 @@ TeamDebugger::InspectRequested(target_addr_t address, } +void +TeamDebugger::DebugReportRequested(entry_ref* targetPath) +{ + BMessage message(MSG_GENERATE_DEBUG_REPORT); + message.AddRef("target", targetPath); + PostMessage(&message); +} + + bool TeamDebugger::UserInterfaceQuitRequested(QuitOption quitOption) { @@ -1502,6 +1532,13 @@ TeamDebugger::_HandleInspectAddress(target_addr_t address, } +void +TeamDebugger::_HandleGenerateDebugReport(const entry_ref& ref) +{ + fReportGenerator->GenerateReport(ref); +} + + ThreadHandler* TeamDebugger::_GetThreadHandler(thread_id threadID) { diff --git a/src/apps/debugger/controllers/TeamDebugger.h b/src/apps/debugger/controllers/TeamDebugger.h index b66d5405d8..8607aae119 100644 --- a/src/apps/debugger/controllers/TeamDebugger.h +++ b/src/apps/debugger/controllers/TeamDebugger.h @@ -20,6 +20,7 @@ class DebuggerInterface; +class DebugReportGenerator; class FileManager; class SettingsManager; class TeamDebugInfo; @@ -78,6 +79,9 @@ private: virtual void InspectRequested(target_addr_t address, TeamMemoryBlock::Listener* listener); + + virtual void DebugReportRequested(entry_ref* targetPath); + virtual bool UserInterfaceQuitRequested( QuitOption quitOption); @@ -143,6 +147,9 @@ private: target_addr_t address, TeamMemoryBlock::Listener* listener); + void _HandleGenerateDebugReport( + const entry_ref& target); + ThreadHandler* _GetThreadHandler(thread_id threadID); status_t _AddImage(const ImageInfo& imageInfo, @@ -170,6 +177,8 @@ private: WatchpointManager* fWatchpointManager; TeamMemoryBlockManager* fMemoryBlockManager; + DebugReportGenerator* + fReportGenerator; thread_id fDebugEventListener; UserInterface* fUserInterface; volatile bool fTerminating; diff --git a/src/apps/debugger/user_interface/UserInterface.h b/src/apps/debugger/user_interface/UserInterface.h index a69303711d..9ed4657440 100644 --- a/src/apps/debugger/user_interface/UserInterface.h +++ b/src/apps/debugger/user_interface/UserInterface.h @@ -14,6 +14,8 @@ #include "Types.h" +class entry_ref; + class CpuState; class FunctionInstance; class Image; @@ -116,6 +118,8 @@ public: target_addr_t address, TeamMemoryBlock::Listener* listener) = 0; + virtual void DebugReportRequested(entry_ref* path) = 0; + virtual bool UserInterfaceQuitRequested( QuitOption quitOption = QUIT_OPTION_ASK_USER) = 0;