From fe448830c9e93906af7319af226af06e0738e759 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Thu, 27 Jun 2013 19:40:41 -0400 Subject: [PATCH] TeamDebugger: Implement post syscall event handling. We now watch for file write syscalls in the target team. If they constitute a write to either stdout or stderr, we attempt to capture the output, and notify interested listeners accordingly. --- src/apps/debugger/Jamfile | 9 ++++ .../debugger/controllers/TeamDebugger.cpp | 42 ++++++++++++++++++- src/apps/debugger/controllers/TeamDebugger.h | 2 + 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/apps/debugger/Jamfile b/src/apps/debugger/Jamfile index 03831a5cca..8cd2620460 100644 --- a/src/apps/debugger/Jamfile +++ b/src/apps/debugger/Jamfile @@ -4,6 +4,10 @@ CCFLAGS += -Werror ; C++FLAGS += -Werror ; UseHeaders [ FDirName $(HAIKU_TOP) headers compatibility bsd ] : true ; + +# for syscall_numbers.h +UseHeaders [ FDirName $(HAIKU_COMMON_DEBUG_OBJECT_DIR) system kernel ] ; + UsePrivateHeaders app debug interface kernel shared libroot ; UsePrivateSystemHeaders ; @@ -58,6 +62,11 @@ SourceHdrs : [ FDirName $(SUBDIR) dwarf ] ; +# since syscall_numbers.h is generated on the fly, we need to explicitly +# let Jam know about the dependency. +Includes [ FGristFiles TeamDebugger.cpp ] + : syscall_numbers.h ; + Application Debugger : Debugger.cpp diff --git a/src/apps/debugger/controllers/TeamDebugger.cpp b/src/apps/debugger/controllers/TeamDebugger.cpp index 7fce6fb7b1..8a0b42d20a 100644 --- a/src/apps/debugger/controllers/TeamDebugger.cpp +++ b/src/apps/debugger/controllers/TeamDebugger.cpp @@ -18,6 +18,7 @@ #include #include "debug_utils.h" +#include "syscall_numbers.h" #include "BreakpointManager.h" #include "BreakpointSetting.h" @@ -1261,8 +1262,16 @@ TeamDebugger::_HandleDebuggerMessage(DebugEvent* event) handled = _HandleImageDeleted(imageEvent); break; } - case B_DEBUGGER_MESSAGE_PRE_SYSCALL: case B_DEBUGGER_MESSAGE_POST_SYSCALL: + { + PostSyscallEvent* postSyscallEvent + = dynamic_cast(event); + TRACE_EVENTS("B_DEBUGGER_MESSAGE_POST_SYSCALL: syscall: %" + B_PRIu32 "\n", postSyscallEvent->GetSyscallInfo().Syscall()); + handled = _HandlePostSyscall(postSyscallEvent); + break; + } + case B_DEBUGGER_MESSAGE_PRE_SYSCALL: case B_DEBUGGER_MESSAGE_SIGNAL_RECEIVED: case B_DEBUGGER_MESSAGE_PROFILER_UPDATE: case B_DEBUGGER_MESSAGE_HANDED_OVER: @@ -1402,6 +1411,37 @@ TeamDebugger::_HandleImageDeleted(ImageDeletedEvent* event) } +bool +TeamDebugger::_HandlePostSyscall(PostSyscallEvent* event) +{ + const SyscallInfo& info = event->GetSyscallInfo(); + const uint32* args = info.Arguments(); + + switch (info.Syscall()) { + case SYSCALL_WRITE: + { + int32 fd = (int32)args[0]; + if (fd == 1 || fd == 2) { + BString data; + ssize_t result = fDebuggerInterface->ReadMemoryString( + (target_addr_t)args[3], (size_t)args[4], data); + if (result >= 0) + fTeam->NotifyConsoleOutputReceived(fd, data); + } + break; + } + case SYSCALL_WRITEV: + { + // TODO: handle + } + default: + break; + } + + return false; +} + + void TeamDebugger::_HandleImageDebugInfoChanged(image_id imageID) { diff --git a/src/apps/debugger/controllers/TeamDebugger.h b/src/apps/debugger/controllers/TeamDebugger.h index 3aa5f1f90f..bfdfc452de 100644 --- a/src/apps/debugger/controllers/TeamDebugger.h +++ b/src/apps/debugger/controllers/TeamDebugger.h @@ -141,6 +141,8 @@ private: ImageCreatedEvent* event); bool _HandleImageDeleted( ImageDeletedEvent* event); + bool _HandlePostSyscall( + PostSyscallEvent* event); void _HandleImageDebugInfoChanged(image_id imageID); void _HandleImageFileChanged(image_id imageID);