* Copyright 2009-2012, Ingo Weinhold, ingo_weinhold@gmx.de.
* Copyright 2013-2015, Rene Gollent, rene@gollent.com.
* Distributed under the terms of the MIT License.
*/
#include "Team.h"
#include <new>
#include <AutoLocker.h>
#include "Breakpoint.h"
#include "DisassembledCode.h"
#include "FileSourceCode.h"
#include "Function.h"
#include "ImageDebugInfo.h"
#include "SignalDispositionTypes.h"
#include "SourceCode.h"
#include "SpecificImageDebugInfo.h"
#include "Statement.h"
#include "TeamDebugInfo.h"
#include "Tracing.h"
#include "Value.h"
#include "Watchpoint.h"
struct Team::BreakpointByAddressPredicate
: UnaryPredicate<Breakpoint> {
BreakpointByAddressPredicate(target_addr_t address)
:
fAddress(address)
{
}
virtual int operator()(const Breakpoint* breakpoint) const
{
return -Breakpoint::CompareAddressBreakpoint(&fAddress, breakpoint);
}
private:
target_addr_t fAddress;
};
struct Team::WatchpointByAddressPredicate
: UnaryPredicate<Watchpoint> {
WatchpointByAddressPredicate(target_addr_t address)
:
fAddress(address)
{
}
virtual int operator()(const Watchpoint* watchpoint) const
{
return -Watchpoint::CompareAddressWatchpoint(&fAddress, watchpoint);
}
private:
target_addr_t fAddress;
};
Team::Team(team_id teamID, TeamMemory* teamMemory, Architecture* architecture,
TeamDebugInfo* debugInfo, TeamTypeInformation* typeInformation)
:
fLock("team lock"),
fID(teamID),
fTeamMemory(teamMemory),
fTypeInformation(typeInformation),
fArchitecture(architecture),
fDebugInfo(debugInfo),
fStopOnImageLoad(false),
fStopImageNameListEnabled(false),
fDefaultSignalDisposition(SIGNAL_DISPOSITION_IGNORE)
{
fDebugInfo->AcquireReference();
}
Team::~Team()
{
while (UserBreakpoint* userBreakpoint = fUserBreakpoints.RemoveHead())
userBreakpoint->ReleaseReference();
for (int32 i = 0; Breakpoint* breakpoint = fBreakpoints.ItemAt(i); i++)
breakpoint->ReleaseReference();
for (int32 i = 0; Watchpoint* watchpoint = fWatchpoints.ItemAt(i); i++)
watchpoint->ReleaseReference();
while (Image* image = fImages.RemoveHead())
image->ReleaseReference();
while (Thread* thread = fThreads.RemoveHead())
thread->ReleaseReference();
fDebugInfo->ReleaseReference();
}
status_t
Team::Init()
{
return fLock.InitCheck();
}
void
Team::SetName(const BString& name)
{
fName = name;
_NotifyTeamRenamed();
}
void
Team::AddThread(Thread* thread)
{
fThreads.Add(thread);
_NotifyThreadAdded(thread);
}
status_t
Team::AddThread(const ThreadInfo& threadInfo, Thread** _thread)
{
Thread* thread = new(std::nothrow) Thread(this, threadInfo.ThreadID());
if (thread == NULL)
return B_NO_MEMORY;
status_t error = thread->Init();
if (error != B_OK) {
delete thread;
return error;
}
thread->SetName(threadInfo.Name());
AddThread(thread);
if (_thread != NULL)
*_thread = thread;
return B_OK;
}
void
Team::RemoveThread(Thread* thread)
{
fThreads.Remove(thread);
_NotifyThreadRemoved(thread);
}
bool
Team::RemoveThread(thread_id threadID)
{
Thread* thread = ThreadByID(threadID);
if (thread == NULL)
return false;
RemoveThread(thread);
thread->ReleaseReference();
return true;
}
Thread*
Team::ThreadByID(thread_id threadID) const
{
for (ThreadList::ConstIterator it = fThreads.GetIterator();
Thread* thread = it.Next();) {
if (thread->ID() == threadID)
return thread;
}
return NULL;
}
const ThreadList&
Team::Threads() const
{
return fThreads;
}
status_t
Team::AddImage(const ImageInfo& imageInfo, LocatableFile* imageFile,
Image** _image)
{
Image* image = new(std::nothrow) Image(this, imageInfo, imageFile);
if (image == NULL)
return B_NO_MEMORY;
status_t error = image->Init();
if (error != B_OK) {
delete image;
return error;
}
if (image->Type() == B_APP_IMAGE)
SetName(image->Name());
fImages.Add(image);
_NotifyImageAdded(image);
if (_image != NULL)
*_image = image;
return B_OK;
}
void
Team::RemoveImage(Image* image)
{
fImages.Remove(image);
_NotifyImageRemoved(image);
}
bool
Team::RemoveImage(image_id imageID)
{
Image* image = ImageByID(imageID);
if (image == NULL)
return false;
RemoveImage(image);
image->ReleaseReference();
return true;
}
Image*
Team::ImageByID(image_id imageID) const
{
for (ImageList::ConstIterator it = fImages.GetIterator();
Image* image = it.Next();) {
if (image->ID() == imageID)
return image;
}
return NULL;
}
Image*
Team::ImageByAddress(target_addr_t address) const
{
for (ImageList::ConstIterator it = fImages.GetIterator();
Image* image = it.Next();) {
if (image->ContainsAddress(address))
return image;
}
return NULL;
}
const ImageList&
Team::Images() const
{
return fImages;
}
void
Team::ClearImages()
{
while (!fImages.IsEmpty())
RemoveImage(fImages.First());
}
bool
Team::AddStopImageName(const BString& name)
{
if (!fStopImageNames.Add(name))
return false;
fStopImageNames.Sort();
NotifyStopImageNameAdded(name);
return true;
}
void
Team::RemoveStopImageName(const BString& name)
{
fStopImageNames.Remove(name);
NotifyStopImageNameRemoved(name);
}
void
Team::SetStopOnImageLoad(bool enabled, bool useImageNameList)
{
fStopOnImageLoad = enabled;
fStopImageNameListEnabled = useImageNameList;
NotifyStopOnImageLoadChanged(enabled, useImageNameList);
}
const BStringList&
Team::StopImageNames() const
{
return fStopImageNames;
}
void
Team::SetDefaultSignalDisposition(int32 disposition)
{
if (disposition != fDefaultSignalDisposition) {
fDefaultSignalDisposition = disposition;
NotifyDefaultSignalDispositionChanged(disposition);
}
}
bool
Team::SetCustomSignalDisposition(int32 signal, int32 disposition)
{
SignalDispositionMappings::iterator it = fCustomSignalDispositions.find(
signal);
if (it != fCustomSignalDispositions.end() && it->second == disposition)
return true;
try {
fCustomSignalDispositions[signal] = disposition;
} catch (...) {
return false;
}
NotifyCustomSignalDispositionChanged(signal, disposition);
return true;
}
void
Team::RemoveCustomSignalDisposition(int32 signal)
{
SignalDispositionMappings::iterator it = fCustomSignalDispositions.find(
signal);
if (it == fCustomSignalDispositions.end())
return;
fCustomSignalDispositions.erase(it);
NotifyCustomSignalDispositionRemoved(signal);
}
int32
Team::SignalDispositionFor(int32 signal) const
{
SignalDispositionMappings::const_iterator it
= fCustomSignalDispositions.find(signal);
if (it != fCustomSignalDispositions.end())
return it->second;
return fDefaultSignalDisposition;
}
const SignalDispositionMappings&
Team::GetSignalDispositionMappings() const
{
return fCustomSignalDispositions;
}
void
Team::ClearSignalDispositionMappings()
{
fCustomSignalDispositions.clear();
}
bool
Team::AddBreakpoint(Breakpoint* breakpoint)
{
if (fBreakpoints.BinaryInsert(breakpoint, &Breakpoint::CompareBreakpoints))
return true;
breakpoint->ReleaseReference();
return false;
}
void
Team::RemoveBreakpoint(Breakpoint* breakpoint)
{
int32 index = fBreakpoints.BinarySearchIndex(*breakpoint,
&Breakpoint::CompareBreakpoints);
if (index < 0)
return;
fBreakpoints.RemoveItemAt(index);
breakpoint->ReleaseReference();
}
int32
Team::CountBreakpoints() const
{
return fBreakpoints.CountItems();
}
Breakpoint*
Team::BreakpointAt(int32 index) const
{
return fBreakpoints.ItemAt(index);
}
Breakpoint*
Team::BreakpointAtAddress(target_addr_t address) const
{
return fBreakpoints.BinarySearchByKey(address,
&Breakpoint::CompareAddressBreakpoint);
}
void
Team::GetBreakpointsInAddressRange(TargetAddressRange range,
BObjectList<UserBreakpoint>& breakpoints) const
{
int32 index = fBreakpoints.FindBinaryInsertionIndex(
BreakpointByAddressPredicate(range.Start()));
for (; Breakpoint* breakpoint = fBreakpoints.ItemAt(index); index++) {
if (breakpoint->Address() > range.End())
break;
for (UserBreakpointInstanceList::ConstIterator it
= breakpoint->UserBreakpoints().GetIterator();
UserBreakpointInstance* instance = it.Next();) {
breakpoints.AddItem(instance->GetUserBreakpoint());
}
}
}
void
Team::GetBreakpointsForSourceCode(SourceCode* sourceCode,
BObjectList<UserBreakpoint>& breakpoints) const
{
if (DisassembledCode* disassembledCode
= dynamic_cast<DisassembledCode*>(sourceCode)) {
GetBreakpointsInAddressRange(disassembledCode->StatementAddressRange(),
breakpoints);
return;
}
LocatableFile* sourceFile = sourceCode->GetSourceFile();
if (sourceFile == NULL)
return;
for (int32 i = 0; Breakpoint* breakpoint = fBreakpoints.ItemAt(i); i++) {
UserBreakpointInstance* userBreakpointInstance
= breakpoint->FirstUserBreakpoint();
if (userBreakpointInstance == NULL)
continue;
UserBreakpoint* userBreakpoint
= userBreakpointInstance->GetUserBreakpoint();
if (userBreakpoint->Location().SourceFile() == sourceFile)
breakpoints.AddItem(userBreakpoint);
}
}
void
Team::AddUserBreakpoint(UserBreakpoint* userBreakpoint)
{
fUserBreakpoints.Add(userBreakpoint);
userBreakpoint->AcquireReference();
}
void
Team::RemoveUserBreakpoint(UserBreakpoint* userBreakpoint)
{
fUserBreakpoints.Remove(userBreakpoint);
userBreakpoint->ReleaseReference();
}
bool
Team::AddWatchpoint(Watchpoint* watchpoint)
{
if (fWatchpoints.BinaryInsert(watchpoint, &Watchpoint::CompareWatchpoints))
return true;
watchpoint->ReleaseReference();
return false;
}
void
Team::RemoveWatchpoint(Watchpoint* watchpoint)
{
int32 index = fWatchpoints.BinarySearchIndex(*watchpoint,
&Watchpoint::CompareWatchpoints);
if (index < 0)
return;
fWatchpoints.RemoveItemAt(index);
watchpoint->ReleaseReference();
}
int32
Team::CountWatchpoints() const
{
return fWatchpoints.CountItems();
}
Watchpoint*
Team::WatchpointAt(int32 index) const
{
return fWatchpoints.ItemAt(index);
}
Watchpoint*
Team::WatchpointAtAddress(target_addr_t address) const
{
return fWatchpoints.BinarySearchByKey(address,
&Watchpoint::CompareAddressWatchpoint);
}
void
Team::GetWatchpointsInAddressRange(TargetAddressRange range,
BObjectList<Watchpoint>& watchpoints) const
{
int32 index = fWatchpoints.FindBinaryInsertionIndex(
WatchpointByAddressPredicate(range.Start()));
for (; Watchpoint* watchpoint = fWatchpoints.ItemAt(index); index++) {
if (watchpoint->Address() > range.End())
break;
watchpoints.AddItem(watchpoint);
}
}
status_t
Team::GetStatementAtAddress(target_addr_t address, FunctionInstance*& _function,
Statement*& _statement)
{
TRACE_CODE("Team::GetStatementAtAddress(%#" B_PRIx64 ")\n", address);
Image* image = ImageByAddress(address);
if (image == NULL) {
TRACE_CODE(" -> no image\n");
return B_ENTRY_NOT_FOUND;
}
ImageDebugInfo* imageDebugInfo = image->GetImageDebugInfo();
if (imageDebugInfo == NULL) {
TRACE_CODE(" -> no image debug info\n");
return B_ENTRY_NOT_FOUND;
}
FunctionInstance* functionInstance
= imageDebugInfo->FunctionAtAddress(address);
if (functionInstance == NULL) {
TRACE_CODE(" -> no function instance\n");
return B_ENTRY_NOT_FOUND;
}
if (DisassembledCode* code = functionInstance->GetSourceCode()) {
Statement* statement = code->StatementAtAddress(address);
if (statement == NULL)
return B_ENTRY_NOT_FOUND;
statement->AcquireReference();
_statement = statement;
_function = functionInstance;
return B_OK;
}
FunctionDebugInfo* functionDebugInfo
= functionInstance->GetFunctionDebugInfo();
status_t error = functionDebugInfo->GetSpecificImageDebugInfo()
->GetStatement(functionDebugInfo, address, _statement);
if (error != B_OK) {
TRACE_CODE(" -> no statement from the specific image debug info\n");
return error;
}
_function = functionInstance;
return B_OK;
}
status_t
Team::GetStatementAtSourceLocation(SourceCode* sourceCode,
const SourceLocation& location, Statement*& _statement)
{
TRACE_CODE("Team::GetStatementAtSourceLocation(%p, (%" B_PRId32 ", %"
B_PRId32 "))\n", sourceCode, location.Line(), location.Column());
if (DisassembledCode* code = dynamic_cast<DisassembledCode*>(sourceCode)) {
Statement* statement = code->StatementAtLocation(location);
if (statement == NULL)
return B_ENTRY_NOT_FOUND;
statement->AcquireReference();
_statement = statement;
return B_OK;
}
LocatableFile* sourceFile = sourceCode->GetSourceFile();
if (sourceFile == NULL)
return B_ENTRY_NOT_FOUND;
Function* function = fDebugInfo->FunctionAtSourceLocation(sourceFile,
location);
if (function == NULL)
return B_ENTRY_NOT_FOUND;
FunctionInstance* functionInstance = function->FirstInstance();
if (functionInstance == NULL)
return B_ENTRY_NOT_FOUND;
FunctionDebugInfo* functionDebugInfo
= functionInstance->GetFunctionDebugInfo();
return functionDebugInfo->GetSpecificImageDebugInfo()
->GetStatementAtSourceLocation(functionDebugInfo, location, _statement);
}
Function*
Team::FunctionByID(FunctionID* functionID) const
{
return fDebugInfo->FunctionByID(functionID);
}
void
Team::AddListener(Listener* listener)
{
AutoLocker<Team> locker(this);
fListeners.Add(listener);
}
void
Team::RemoveListener(Listener* listener)
{
AutoLocker<Team> locker(this);
fListeners.Remove(listener);
}
void
Team::NotifyThreadStateChanged(Thread* thread)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->ThreadStateChanged(
ThreadEvent(TEAM_EVENT_THREAD_STATE_CHANGED, thread));
}
}
void
Team::NotifyThreadCpuStateChanged(Thread* thread)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->ThreadCpuStateChanged(
ThreadEvent(TEAM_EVENT_THREAD_CPU_STATE_CHANGED, thread));
}
}
void
Team::NotifyThreadStackTraceChanged(Thread* thread)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->ThreadStackTraceChanged(
ThreadEvent(TEAM_EVENT_THREAD_STACK_TRACE_CHANGED, thread));
}
}
void
Team::NotifyImageDebugInfoChanged(Image* image)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->ImageDebugInfoChanged(
ImageEvent(TEAM_EVENT_IMAGE_DEBUG_INFO_CHANGED, image));
}
}
void
Team::NotifyStopOnImageLoadChanged(bool enabled, bool useImageNameList)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->StopOnImageLoadSettingsChanged(
ImageLoadEvent(TEAM_EVENT_IMAGE_LOAD_SETTINGS_CHANGED, this,
enabled, useImageNameList));
}
}
void
Team::NotifyStopImageNameAdded(const BString& name)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->StopOnImageLoadNameAdded(
ImageLoadNameEvent(TEAM_EVENT_IMAGE_LOAD_NAME_ADDED, this, name));
}
}
void
Team::NotifyStopImageNameRemoved(const BString& name)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->StopOnImageLoadNameRemoved(
ImageLoadNameEvent(TEAM_EVENT_IMAGE_LOAD_NAME_REMOVED, this,
name));
}
}
void
Team::NotifyDefaultSignalDispositionChanged(int32 disposition)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->DefaultSignalDispositionChanged(
DefaultSignalDispositionEvent(
TEAM_EVENT_DEFAULT_SIGNAL_DISPOSITION_CHANGED, this,
disposition));
}
}
void
Team::NotifyCustomSignalDispositionChanged(int32 signal, int32 disposition)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->CustomSignalDispositionChanged(
CustomSignalDispositionEvent(
TEAM_EVENT_CUSTOM_SIGNAL_DISPOSITION_CHANGED, this,
signal, disposition));
}
}
void
Team::NotifyCustomSignalDispositionRemoved(int32 signal)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->CustomSignalDispositionRemoved(
CustomSignalDispositionEvent(
TEAM_EVENT_CUSTOM_SIGNAL_DISPOSITION_REMOVED, this,
signal, SIGNAL_DISPOSITION_IGNORE));
}
}
void
Team::NotifyConsoleOutputReceived(int32 fd, const BString& output)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->ConsoleOutputReceived(
ConsoleOutputEvent(TEAM_EVENT_CONSOLE_OUTPUT_RECEIVED, this,
fd, output));
}
}
void
Team::NotifyUserBreakpointChanged(UserBreakpoint* breakpoint)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->UserBreakpointChanged(UserBreakpointEvent(
TEAM_EVENT_USER_BREAKPOINT_CHANGED, this, breakpoint));
}
}
void
Team::NotifyWatchpointChanged(Watchpoint* watchpoint)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->WatchpointChanged(WatchpointEvent(
TEAM_EVENT_WATCHPOINT_CHANGED, this, watchpoint));
}
}
void
Team::NotifyDebugReportChanged(const char* reportPath, status_t result)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->DebugReportChanged(DebugReportEvent(
TEAM_EVENT_DEBUG_REPORT_CHANGED, this, reportPath, result));
}
}
void
Team::NotifyCoreFileChanged(const char* targetPath)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->CoreFileChanged(CoreFileChangedEvent(
TEAM_EVENT_CORE_FILE_CHANGED, this, targetPath));
}
}
void
Team::NotifyMemoryChanged(target_addr_t address, target_size_t size)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->MemoryChanged(MemoryChangedEvent(
TEAM_EVENT_MEMORY_CHANGED, this, address, size));
}
}
void
Team::_NotifyTeamRenamed()
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->TeamRenamed(Event(TEAM_EVENT_TEAM_RENAMED, this));
}
}
void
Team::_NotifyThreadAdded(Thread* thread)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->ThreadAdded(ThreadEvent(TEAM_EVENT_THREAD_ADDED, thread));
}
}
void
Team::_NotifyThreadRemoved(Thread* thread)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->ThreadRemoved(ThreadEvent(TEAM_EVENT_THREAD_REMOVED, thread));
}
}
void
Team::_NotifyImageAdded(Image* image)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->ImageAdded(ImageEvent(TEAM_EVENT_IMAGE_ADDED, image));
}
}
void
Team::_NotifyImageRemoved(Image* image)
{
for (ListenerList::Iterator it = fListeners.GetIterator();
Listener* listener = it.Next();) {
listener->ImageRemoved(ImageEvent(TEAM_EVENT_IMAGE_REMOVED, image));
}
}
Team::Event::Event(uint32 type, Team* team)
:
fEventType(type),
fTeam(team)
{
}
Team::ThreadEvent::ThreadEvent(uint32 type, Thread* thread)
:
Event(type, thread->GetTeam()),
fThread(thread)
{
}
Team::ImageEvent::ImageEvent(uint32 type, Image* image)
:
Event(type, image->GetTeam()),
fImage(image)
{
}
Team::ImageLoadEvent::ImageLoadEvent(uint32 type, Team* team,
bool stopOnImageLoad, bool stopImageNameListEnabled)
:
Event(type, team),
fStopOnImageLoad(stopOnImageLoad),
fStopImageNameListEnabled(stopImageNameListEnabled)
{
}
Team::ImageLoadNameEvent::ImageLoadNameEvent(uint32 type, Team* team,
const BString& name)
:
Event(type, team),
fImageName(name)
{
}
Team::DefaultSignalDispositionEvent::DefaultSignalDispositionEvent(uint32 type,
Team* team, int32 disposition)
:
Event(type, team),
fDefaultDisposition(disposition)
{
}
Team::CustomSignalDispositionEvent::CustomSignalDispositionEvent(uint32 type,
Team* team, int32 signal, int32 disposition)
:
Event(type, team),
fSignal(signal),
fDisposition(disposition)
{
}
Team::BreakpointEvent::BreakpointEvent(uint32 type, Team* team,
Breakpoint* breakpoint)
:
Event(type, team),
fBreakpoint(breakpoint)
{
}
Team::ConsoleOutputEvent::ConsoleOutputEvent(uint32 type, Team* team,
int32 fd, const BString& output)
:
Event(type, team),
fDescriptor(fd),
fOutput(output)
{
}
Team::DebugReportEvent::DebugReportEvent(uint32 type, Team* team,
const char* reportPath, status_t finalStatus)
:
Event(type, team),
fReportPath(reportPath),
fFinalStatus(finalStatus)
{
}
Team::CoreFileChangedEvent::CoreFileChangedEvent(uint32 type, Team* team,
const char* targetPath)
:
Event(type, team),
fTargetPath(targetPath)
{
}
Team::MemoryChangedEvent::MemoryChangedEvent(uint32 type, Team* team,
target_addr_t address, target_size_t size)
:
Event(type, team),
fTargetAddress(address),
fSize(size)
{
}
Team::WatchpointEvent::WatchpointEvent(uint32 type, Team* team,
Watchpoint* watchpoint)
:
Event(type, team),
fWatchpoint(watchpoint)
{
}
Team::UserBreakpointEvent::UserBreakpointEvent(uint32 type, Team* team,
UserBreakpoint* breakpoint)
:
Event(type, team),
fBreakpoint(breakpoint)
{
}
Team::Listener::~Listener()
{
}
void
Team::Listener::TeamRenamed(const Team::Event& event)
{
}
void
Team::Listener::ThreadAdded(const Team::ThreadEvent& event)
{
}
void
Team::Listener::ThreadRemoved(const Team::ThreadEvent& event)
{
}
void
Team::Listener::ImageAdded(const Team::ImageEvent& event)
{
}
void
Team::Listener::ImageRemoved(const Team::ImageEvent& event)
{
}
void
Team::Listener::ThreadStateChanged(const Team::ThreadEvent& event)
{
}
void
Team::Listener::ThreadCpuStateChanged(const Team::ThreadEvent& event)
{
}
void
Team::Listener::ThreadStackTraceChanged(const Team::ThreadEvent& event)
{
}
void
Team::Listener::ImageDebugInfoChanged(const Team::ImageEvent& event)
{
}
void
Team::Listener::StopOnImageLoadSettingsChanged(
const Team::ImageLoadEvent& event)
{
}
void
Team::Listener::StopOnImageLoadNameAdded(const Team::ImageLoadNameEvent& event)
{
}
void
Team::Listener::StopOnImageLoadNameRemoved(
const Team::ImageLoadNameEvent& event)
{
}
void
Team::Listener::DefaultSignalDispositionChanged(
const Team::DefaultSignalDispositionEvent& event)
{
}
void
Team::Listener::CustomSignalDispositionChanged(
const Team::CustomSignalDispositionEvent& event)
{
}
void
Team::Listener::CustomSignalDispositionRemoved(
const Team::CustomSignalDispositionEvent& event)
{
}
void
Team::Listener::ConsoleOutputReceived(const Team::ConsoleOutputEvent& event)
{
}
void
Team::Listener::BreakpointAdded(const Team::BreakpointEvent& event)
{
}
void
Team::Listener::BreakpointRemoved(const Team::BreakpointEvent& event)
{
}
void
Team::Listener::UserBreakpointChanged(const Team::UserBreakpointEvent& event)
{
}
void
Team::Listener::WatchpointAdded(const Team::WatchpointEvent& event)
{
}
void
Team::Listener::WatchpointRemoved(const Team::WatchpointEvent& event)
{
}
void
Team::Listener::WatchpointChanged(const Team::WatchpointEvent& event)
{
}
void
Team::Listener::DebugReportChanged(const Team::DebugReportEvent& event)
{
}
void
Team::Listener::CoreFileChanged(const Team::CoreFileChangedEvent& event)
{
}
void
Team::Listener::MemoryChanged(const Team::MemoryChangedEvent& event)
{
}