From 4ed8088f9a98fa69526c08721087a942becc7545 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sat, 20 Sep 2008 13:59:41 +0000 Subject: [PATCH] Added new debugger message B_DEBUGGER_MESSAGE_TEAM_EXEC, sent when exec*() has been called. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27650 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/os/kernel/debugger.h | 8 ++++++++ headers/private/kernel/user_debugger.h | 1 + src/system/kernel/debug/user_debugger.cpp | 20 ++++++++++++++++++++ src/system/kernel/team.cpp | 2 ++ 4 files changed, 31 insertions(+) diff --git a/headers/os/kernel/debugger.h b/headers/os/kernel/debugger.h index ca180dd87a..15d58f39ed 100644 --- a/headers/os/kernel/debugger.h +++ b/headers/os/kernel/debugger.h @@ -166,6 +166,7 @@ typedef enum { B_DEBUGGER_MESSAGE_TEAM_CREATED, // the debugged team created a new // one B_DEBUGGER_MESSAGE_TEAM_DELETED, // the debugged team is gone + B_DEBUGGER_MESSAGE_TEAM_EXEC, // the debugged team executes exec() B_DEBUGGER_MESSAGE_THREAD_CREATED, // a thread has been created B_DEBUGGER_MESSAGE_THREAD_DELETED, // a thread has been deleted B_DEBUGGER_MESSAGE_IMAGE_CREATED, // an image has been created @@ -510,6 +511,12 @@ typedef struct { // (asynchronous message) } debug_team_deleted; +// B_DEBUGGER_MESSAGE_TEAM_EXEC + +typedef struct { + debug_origin origin; +} debug_team_exec; + // B_DEBUGGER_MESSAGE_THREAD_CREATED typedef struct { @@ -575,6 +582,7 @@ typedef union { debug_exception_occurred exception_occurred; debug_team_created team_created; debug_team_deleted team_deleted; + debug_team_exec team_exec; debug_thread_created thread_created; debug_thread_deleted thread_deleted; debug_image_created image_created; diff --git a/headers/private/kernel/user_debugger.h b/headers/private/kernel/user_debugger.h index ac34f10e27..bdd13f2e5c 100644 --- a/headers/private/kernel/user_debugger.h +++ b/headers/private/kernel/user_debugger.h @@ -195,6 +195,7 @@ bool user_debug_handle_signal(int signal, struct sigaction *handler, void user_debug_stop_thread(); void user_debug_team_created(team_id teamID); void user_debug_team_deleted(team_id teamID, port_id debuggerPort); +void user_debug_team_exec(); void user_debug_update_new_thread_flags(thread_id threadID); void user_debug_thread_created(thread_id threadID); void user_debug_thread_deleted(team_id teamID, thread_id threadID); diff --git a/src/system/kernel/debug/user_debugger.cpp b/src/system/kernel/debug/user_debugger.cpp index a57b5a9b89..e969e7f132 100644 --- a/src/system/kernel/debug/user_debugger.cpp +++ b/src/system/kernel/debug/user_debugger.cpp @@ -884,6 +884,26 @@ user_debug_team_deleted(team_id teamID, port_id debuggerPort) } +void +user_debug_team_exec() +{ + // check, if a debugger is installed and is interested in team creation + // events + struct thread *thread = thread_get_current_thread(); + int32 teamDebugFlags = atomic_get(&thread->team->debug_info.flags); + if (~teamDebugFlags + & (B_TEAM_DEBUG_DEBUGGER_INSTALLED | B_TEAM_DEBUG_TEAM_CREATION)) { + return; + } + + // prepare the message + debug_team_created message; + + thread_hit_debug_event(B_DEBUGGER_MESSAGE_TEAM_EXEC, &message, + sizeof(message), true); +} + + void user_debug_update_new_thread_flags(thread_id threadID) { diff --git a/src/system/kernel/team.cpp b/src/system/kernel/team.cpp index f30b079ba0..68e56b0748 100644 --- a/src/system/kernel/team.cpp +++ b/src/system/kernel/team.cpp @@ -1363,6 +1363,8 @@ exec_team(const char *path, char**& _flatArgs, size_t flatArgsSize, // permission. update_set_id_user_and_group(team, path); + user_debug_team_exec(); + status = team_create_thread_start(teamArgs); // this one usually doesn't return...