/* * 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 #include #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" // #pragma mark - BreakpointByAddressPredicate struct Team::BreakpointByAddressPredicate : UnaryPredicate { BreakpointByAddressPredicate(target_addr_t address) : fAddress(address) { } virtual int operator()(const Breakpoint* breakpoint) const { return -Breakpoint::CompareAddressBreakpoint(&fAddress, breakpoint); } private: target_addr_t fAddress; }; // #pragma mark - WatchpointByAddressPredicate struct Team::WatchpointByAddressPredicate : UnaryPredicate { WatchpointByAddressPredicate(target_addr_t address) : fAddress(address) { } virtual int operator()(const Watchpoint* watchpoint) const { return -Watchpoint::CompareAddressWatchpoint(&fAddress, watchpoint); } private: target_addr_t fAddress; }; // #pragma mark - Team 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& 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()); } } // TODO: Avoid duplicates! } void Team::GetBreakpointsForSourceCode(SourceCode* sourceCode, BObjectList& breakpoints) const { if (DisassembledCode* disassembledCode = dynamic_cast(sourceCode)) { GetBreakpointsInAddressRange(disassembledCode->StatementAddressRange(), breakpoints); return; } LocatableFile* sourceFile = sourceCode->GetSourceFile(); if (sourceFile == NULL) return; // TODO: This can probably be optimized. Maybe by registering the user // breakpoints with the team and sorting them by source code. 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& 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); // get the image at the 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; } // get the function FunctionInstance* functionInstance = imageDebugInfo->FunctionAtAddress(address); if (functionInstance == NULL) { TRACE_CODE(" -> no function instance\n"); return B_ENTRY_NOT_FOUND; } // If the function instance has disassembled code attached, we can get the // statement directly. 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; } // get the statement from the image debug info 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 we're lucky the source code can provide us with a statement. if (DisassembledCode* code = dynamic_cast(sourceCode)) { Statement* statement = code->StatementAtLocation(location); if (statement == NULL) return B_ENTRY_NOT_FOUND; statement->AcquireReference(); _statement = statement; return B_OK; } // Go the long and stony way over the source file and the team debug info. // get the source file for the source code LocatableFile* sourceFile = sourceCode->GetSourceFile(); if (sourceFile == NULL) return B_ENTRY_NOT_FOUND; // get the function at the source location Function* function = fDebugInfo->FunctionAtSourceLocation(sourceFile, location); if (function == NULL) return B_ENTRY_NOT_FOUND; // Get some function instance and ask its image debug info to provide us // with a statement. 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 locker(this); fListeners.Add(listener); } void Team::RemoveListener(Listener* listener) { AutoLocker 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)); } } // #pragma mark - Event Team::Event::Event(uint32 type, Team* team) : fEventType(type), fTeam(team) { } // #pragma mark - ThreadEvent Team::ThreadEvent::ThreadEvent(uint32 type, Thread* thread) : Event(type, thread->GetTeam()), fThread(thread) { } // #pragma mark - ImageEvent Team::ImageEvent::ImageEvent(uint32 type, Image* image) : Event(type, image->GetTeam()), fImage(image) { } // #pragma mark - ImageLoadEvent Team::ImageLoadEvent::ImageLoadEvent(uint32 type, Team* team, bool stopOnImageLoad, bool stopImageNameListEnabled) : Event(type, team), fStopOnImageLoad(stopOnImageLoad), fStopImageNameListEnabled(stopImageNameListEnabled) { } // #pragma mark - ImageLoadNameEvent Team::ImageLoadNameEvent::ImageLoadNameEvent(uint32 type, Team* team, const BString& name) : Event(type, team), fImageName(name) { } // #pragma mark - DefaultSignalDispositionEvent Team::DefaultSignalDispositionEvent::DefaultSignalDispositionEvent(uint32 type, Team* team, int32 disposition) : Event(type, team), fDefaultDisposition(disposition) { } // #pragma mark - CustomSignalDispositionEvent Team::CustomSignalDispositionEvent::CustomSignalDispositionEvent(uint32 type, Team* team, int32 signal, int32 disposition) : Event(type, team), fSignal(signal), fDisposition(disposition) { } // #pragma mark - BreakpointEvent Team::BreakpointEvent::BreakpointEvent(uint32 type, Team* team, Breakpoint* breakpoint) : Event(type, team), fBreakpoint(breakpoint) { } // #pragma mark - ConsoleOutputEvent Team::ConsoleOutputEvent::ConsoleOutputEvent(uint32 type, Team* team, int32 fd, const BString& output) : Event(type, team), fDescriptor(fd), fOutput(output) { } // #pragma mark - DebugReportEvent Team::DebugReportEvent::DebugReportEvent(uint32 type, Team* team, const char* reportPath, status_t finalStatus) : Event(type, team), fReportPath(reportPath), fFinalStatus(finalStatus) { } // #pragma mark - CoreFileChangedEvent Team::CoreFileChangedEvent::CoreFileChangedEvent(uint32 type, Team* team, const char* targetPath) : Event(type, team), fTargetPath(targetPath) { } // #pragma mark - MemoryChangedEvent Team::MemoryChangedEvent::MemoryChangedEvent(uint32 type, Team* team, target_addr_t address, target_size_t size) : Event(type, team), fTargetAddress(address), fSize(size) { } // #pragma mark - WatchpointEvent Team::WatchpointEvent::WatchpointEvent(uint32 type, Team* team, Watchpoint* watchpoint) : Event(type, team), fWatchpoint(watchpoint) { } // #pragma mark - UserBreakpointEvent Team::UserBreakpointEvent::UserBreakpointEvent(uint32 type, Team* team, UserBreakpoint* breakpoint) : Event(type, team), fBreakpoint(breakpoint) { } // #pragma mark - Listener 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) { }