Files
haiku-beta6/src/apps/debugger/controllers/TeamDebugger.h
T

267 lines
8.0 KiB
C++
Raw Normal View History

/*
* Copyright 2009, Ingo Weinhold, [email protected].
2015-05-23 16:12:43 -04:00
* Copyright 2013-2015, Rene Gollent, [email protected].
* Distributed under the terms of the MIT License.
*/
#ifndef TEAM_DEBUGGER_H
#define TEAM_DEBUGGER_H
#include <debugger.h>
#include <Looper.h>
#include <debug_support.h>
#include "DebugEvent.h"
#include "Jobs.h"
2009-06-19 22:13:32 +00:00
#include "Team.h"
#include "TeamSettings.h"
#include "ThreadHandler.h"
#include "UserInterface.h"
#include "Worker.h"
class DebuggerInterface;
2012-11-18 13:08:38 -05:00
class DebugReportGenerator;
2009-07-01 22:09:33 +00:00
class FileManager;
class SettingsManager;
2009-06-27 21:09:21 +00:00
class TeamDebugInfo;
class TeamMemoryBlockManager;
class Thread;
class WatchpointManager;
class TeamDebugger : public BLooper, private UserInterfaceListener,
private JobListener, private ImageDebugInfoJobListener,
private Team::Listener {
public:
class Listener;
public:
TeamDebugger(Listener* listener,
UserInterface* userInterface,
SettingsManager* settingsManager);
~TeamDebugger();
status_t Init(team_id teamID, thread_id threadID,
2013-05-29 19:16:08 -04:00
int argc,
const char* const* argv,
bool stopInMain);
void Activate();
team_id TeamID() const { return fTeamID; }
2013-05-29 19:16:08 -04:00
int ArgumentCount() const
{ return fCommandLineArgc; }
const char** Arguments() const
{ return fCommandLineArgv; }
virtual void MessageReceived(BMessage* message);
private:
// UserInterfaceListener
2009-07-18 23:52:16 +00:00
virtual void FunctionSourceCodeRequested(
2013-06-22 12:51:27 -04:00
FunctionInstance* function,
bool forceDisassembly = false);
virtual void SourceEntryLocateRequested(
const char* sourcePath,
const char* locatedPath);
virtual void SourceEntryInvalidateRequested(
LocatableFile* sourceFile);
2009-07-18 23:52:16 +00:00
virtual void ImageDebugInfoRequested(Image* image);
2009-11-05 18:15:21 +00:00
virtual void ValueNodeValueRequested(CpuState* cpuState,
ValueNodeContainer* container,
ValueNode* valueNode);
2009-07-18 23:52:16 +00:00
virtual void ThreadActionRequested(thread_id threadID,
2013-05-11 23:09:12 -04:00
uint32 action, target_addr_t address);
virtual void SetBreakpointRequested(target_addr_t address,
bool enabled, bool hidden = false);
virtual void SetBreakpointEnabledRequested(
UserBreakpoint* breakpoint,
bool enabled);
virtual void SetBreakpointConditionRequested(
UserBreakpoint* breakpoint,
const char* condition);
virtual void ClearBreakpointConditionRequested(
UserBreakpoint* breakpoint);
virtual void ClearBreakpointRequested(target_addr_t address);
virtual void ClearBreakpointRequested(
UserBreakpoint* breakpoint);
virtual void SetStopOnImageLoadRequested(bool enabled,
bool useImageNames);
virtual void AddStopImageNameRequested(
const char* name);
virtual void RemoveStopImageNameRequested(
const char* name);
virtual void SetWatchpointRequested(target_addr_t address,
uint32 type, int32 length, bool enabled);
virtual void SetWatchpointEnabledRequested(
Watchpoint *watchpoint, bool enabled);
virtual void ClearWatchpointRequested(target_addr_t address);
virtual void ClearWatchpointRequested(
Watchpoint* breakpoint);
virtual void InspectRequested(target_addr_t address,
TeamMemoryBlock::Listener* listener);
2015-05-23 16:12:43 -04:00
virtual void MemoryWriteRequested(target_addr_t address,
const void* data, target_size_t size);
2012-11-18 13:08:38 -05:00
virtual void ExpressionEvaluationRequested(
SourceLanguage* language,
2014-11-08 18:20:30 -05:00
ExpressionInfo* info,
StackFrame* frame = NULL,
::Thread* thread = NULL);
2012-11-18 13:08:38 -05:00
virtual void DebugReportRequested(entry_ref* targetPath);
virtual void TeamRestartRequested();
virtual bool UserInterfaceQuitRequested(
QuitOption quitOption);
// JobListener
virtual void JobDone(Job* job);
virtual void JobFailed(Job* job);
virtual void JobAborted(Job* job);
virtual void ImageDebugInfoJobNeedsUserInput(Job* job,
ImageDebugInfoLoadingState* state);
2009-06-19 22:13:32 +00:00
// Team::Listener
virtual void ThreadStateChanged(
const ::Team::ThreadEvent& event);
virtual void ThreadCpuStateChanged(
const ::Team::ThreadEvent& event);
virtual void ThreadStackTraceChanged(
const ::Team::ThreadEvent& event);
virtual void ImageDebugInfoChanged(
const ::Team::ImageEvent& event);
2009-06-19 22:13:32 +00:00
2009-07-01 22:09:33 +00:00
private:
struct ImageHandler;
struct ImageHandlerHashDefinition;
2012-11-28 19:11:50 -05:00
struct ImageInfoPendingThread;
struct ImageInfoPendingThreadHashDefinition;
typedef BOpenHashTable<ImageHandlerHashDefinition> ImageHandlerTable;
2012-11-28 19:11:50 -05:00
typedef BOpenHashTable<ImageInfoPendingThreadHashDefinition>
ImageInfoPendingThreadTable;
2009-07-01 22:09:33 +00:00
private:
static status_t _DebugEventListenerEntry(void* data);
status_t _DebugEventListener();
void _HandleDebuggerMessage(DebugEvent* event);
2013-04-23 23:05:36 -04:00
bool _HandleTeamDeleted(
TeamDeletedEvent* event);
bool _HandleThreadCreated(
ThreadCreatedEvent* event);
bool _HandleThreadRenamed(
ThreadRenamedEvent* event);
bool _HandleThreadPriorityChanged(
ThreadPriorityChangedEvent* event);
bool _HandleThreadDeleted(
ThreadDeletedEvent* event);
bool _HandleImageCreated(
ImageCreatedEvent* event);
bool _HandleImageDeleted(
ImageDeletedEvent* event);
bool _HandlePostSyscall(
PostSyscallEvent* event);
void _HandleImageDebugInfoChanged(image_id imageID);
2009-07-01 22:09:33 +00:00
void _HandleImageFileChanged(image_id imageID);
void _HandleSetUserBreakpoint(target_addr_t address,
bool enabled, bool hidden);
void _HandleSetUserBreakpoint(
UserBreakpoint* breakpoint, bool enabled);
void _HandleClearUserBreakpoint(
target_addr_t address);
void _HandleClearUserBreakpoint(
UserBreakpoint* breakpoint);
void _HandleSetWatchpoint(target_addr_t address,
uint32 type, int32 length, bool enabled);
void _HandleSetWatchpoint(
Watchpoint* watchpoint, bool enabled);
void _HandleClearWatchpoint( target_addr_t address);
void _HandleClearWatchpoint(Watchpoint* watchpoint);
void _HandleInspectAddress(
target_addr_t address,
TeamMemoryBlock::Listener* listener);
2015-05-23 16:12:43 -04:00
void _HandleWriteMemory(
target_addr_t address, void* data,
target_size_t size);
void _HandleEvaluateExpression(
SourceLanguage* language,
2014-11-08 18:20:30 -05:00
ExpressionInfo* info,
StackFrame* frame,
::Thread* thread);
2013-05-29 19:16:08 -04:00
status_t _HandleSetArguments(int argc,
const char* const* argv);
void _HandleDebugInfoJobUserInput(
ImageDebugInfoLoadingState* state);
ThreadHandler* _GetThreadHandler(thread_id threadID);
2009-06-19 22:13:32 +00:00
status_t _AddImage(const ImageInfo& imageInfo,
Image** _image = NULL);
2009-07-01 22:09:33 +00:00
void _LoadSettings();
void _SaveSettings();
void _NotifyUser(const char* title,
const char* text,...);
private:
Listener* fListener;
SettingsManager* fSettingsManager;
::Team* fTeam;
team_id fTeamID;
ThreadHandlerTable fThreadHandlers;
// protected by the team lock
2009-07-01 22:09:33 +00:00
ImageHandlerTable* fImageHandlers;
2012-11-28 19:11:50 -05:00
ImageInfoPendingThreadTable* fImageInfoPendingThreads;
DebuggerInterface* fDebuggerInterface;
2009-06-27 21:09:21 +00:00
TeamDebugInfo* fTeamDebugInfo;
2009-07-01 22:09:33 +00:00
FileManager* fFileManager;
Worker* fWorker;
BreakpointManager* fBreakpointManager;
WatchpointManager* fWatchpointManager;
TeamMemoryBlockManager*
fMemoryBlockManager;
2012-11-18 13:08:38 -05:00
DebugReportGenerator*
fReportGenerator;
thread_id fDebugEventListener;
UserInterface* fUserInterface;
volatile bool fTerminating;
bool fKillTeamOnQuit;
TeamSettings fTeamSettings;
2013-05-29 19:16:08 -04:00
int fCommandLineArgc;
const char** fCommandLineArgv;
};
class TeamDebugger::Listener {
public:
virtual ~Listener();
virtual void TeamDebuggerStarted(TeamDebugger* debugger) = 0;
2013-05-29 19:16:08 -04:00
virtual void TeamDebuggerRestartRequested(
TeamDebugger* debugger) = 0;
virtual void TeamDebuggerQuit(TeamDebugger* debugger) = 0;
};
#endif // TEAM_DEBUGGER_H