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.
This commit is contained in:
@@ -4,6 +4,10 @@ CCFLAGS += -Werror ;
|
|||||||
C++FLAGS += -Werror ;
|
C++FLAGS += -Werror ;
|
||||||
|
|
||||||
UseHeaders [ FDirName $(HAIKU_TOP) headers compatibility bsd ] : true ;
|
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 ;
|
UsePrivateHeaders app debug interface kernel shared libroot ;
|
||||||
UsePrivateSystemHeaders ;
|
UsePrivateSystemHeaders ;
|
||||||
|
|
||||||
@@ -58,6 +62,11 @@ SourceHdrs
|
|||||||
: [ FDirName $(SUBDIR) dwarf ]
|
: [ 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 ]
|
||||||
|
: <syscalls>syscall_numbers.h ;
|
||||||
|
|
||||||
Application Debugger :
|
Application Debugger :
|
||||||
Debugger.cpp
|
Debugger.cpp
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
#include <AutoLocker.h>
|
#include <AutoLocker.h>
|
||||||
|
|
||||||
#include "debug_utils.h"
|
#include "debug_utils.h"
|
||||||
|
#include "syscall_numbers.h"
|
||||||
|
|
||||||
#include "BreakpointManager.h"
|
#include "BreakpointManager.h"
|
||||||
#include "BreakpointSetting.h"
|
#include "BreakpointSetting.h"
|
||||||
@@ -1261,8 +1262,16 @@ TeamDebugger::_HandleDebuggerMessage(DebugEvent* event)
|
|||||||
handled = _HandleImageDeleted(imageEvent);
|
handled = _HandleImageDeleted(imageEvent);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case B_DEBUGGER_MESSAGE_PRE_SYSCALL:
|
|
||||||
case B_DEBUGGER_MESSAGE_POST_SYSCALL:
|
case B_DEBUGGER_MESSAGE_POST_SYSCALL:
|
||||||
|
{
|
||||||
|
PostSyscallEvent* postSyscallEvent
|
||||||
|
= dynamic_cast<PostSyscallEvent*>(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_SIGNAL_RECEIVED:
|
||||||
case B_DEBUGGER_MESSAGE_PROFILER_UPDATE:
|
case B_DEBUGGER_MESSAGE_PROFILER_UPDATE:
|
||||||
case B_DEBUGGER_MESSAGE_HANDED_OVER:
|
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
|
void
|
||||||
TeamDebugger::_HandleImageDebugInfoChanged(image_id imageID)
|
TeamDebugger::_HandleImageDebugInfoChanged(image_id imageID)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -141,6 +141,8 @@ private:
|
|||||||
ImageCreatedEvent* event);
|
ImageCreatedEvent* event);
|
||||||
bool _HandleImageDeleted(
|
bool _HandleImageDeleted(
|
||||||
ImageDeletedEvent* event);
|
ImageDeletedEvent* event);
|
||||||
|
bool _HandlePostSyscall(
|
||||||
|
PostSyscallEvent* event);
|
||||||
|
|
||||||
void _HandleImageDebugInfoChanged(image_id imageID);
|
void _HandleImageDebugInfoChanged(image_id imageID);
|
||||||
void _HandleImageFileChanged(image_id imageID);
|
void _HandleImageFileChanged(image_id imageID);
|
||||||
|
|||||||
Reference in New Issue
Block a user