Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

strace: A couple of fixes and improvements #23421

Merged
merged 5 commits into from
Mar 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions Kernel/Tasks/Thread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -964,14 +964,14 @@ DispatchSignalResult Thread::dispatch_signal(u8 signal)
}

if (signal == SIGCONT) {
dbgln("signal: SIGCONT resuming {}", *this);
dbgln_if(SIGNAL_DEBUG, "signal: SIGCONT resuming {}", *this);
} else {
if (tracer) {
// when a thread is traced, it should be stopped whenever it receives a signal
// the tracer is notified of this by using waitpid()
// only "pending signals" from the tracer are sent to the tracee
if (!tracer->has_pending_signal(signal)) {
dbgln("signal: {} stopping {} for tracer", signal, *this);
dbgln_if(SIGNAL_DEBUG, "signal: {} stopping {} for tracer", signal, *this);
set_state(Thread::State::Stopped, signal);
return DispatchSignalResult::Yield;
}
Expand Down
57 changes: 53 additions & 4 deletions Userland/Utilities/strace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <AK/StdLibExtras.h>
#include <AK/Types.h>
#include <Kernel/API/SyscallString.h>
#include <Kernel/API/prctl_numbers.h>
#include <LibCore/ArgsParser.h>
#include <LibCore/File.h>
#include <LibCore/System.h>
Expand Down Expand Up @@ -210,6 +211,18 @@ HANDLE(CLOCK_REALTIME_COARSE)
HANDLE(CLOCK_MONOTONIC_COARSE)
END_VALUES_TO_NAMES()

VALUES_TO_NAMES(prctl_option_name)
HANDLE(PR_SET_DUMPABLE)
HANDLE(PR_GET_DUMPABLE)
HANDLE(PR_SET_NO_NEW_SYSCALL_REGION_ANNOTATIONS)
HANDLE(PR_GET_NO_NEW_SYSCALL_REGION_ANNOTATIONS)
HANDLE(PR_SET_COREDUMP_METADATA_VALUE)
HANDLE(PR_SET_PROCESS_NAME)
HANDLE(PR_GET_PROCESS_NAME)
HANDLE(PR_SET_THREAD_NAME)
HANDLE(PR_GET_THREAD_NAME)
END_VALUES_TO_NAMES()

static int g_pid = -1;

using syscall_arg_t = u64;
Expand Down Expand Up @@ -701,7 +714,34 @@ static void format_dbgputstr(FormattedSyscallBuilder& builder, char* characters,
builder.add_argument(StringArgument { { characters, size }, "\0\n"sv });
}

static ErrorOr<void> format_syscall(FormattedSyscallBuilder& builder, Syscall::Function syscall_function, syscall_arg_t arg1, syscall_arg_t arg2, syscall_arg_t arg3, syscall_arg_t res)
static void format_kill(FormattedSyscallBuilder& builder, pid_t pid_or_pgid, int signal)
{
builder.add_argument(pid_or_pgid);
auto* signal_name = getsignalname(signal);
if (signal_name)
builder.add_argument(signal_name);
else
builder.add_argument(signal);
}

static void format_prctl(FormattedSyscallBuilder& builder, int option, size_t arg1, size_t arg2, size_t arg3)
{
builder.add_argument(prctl_option_name(option));
switch (option) {
case PR_SET_DUMPABLE:
case PR_SET_NO_NEW_SYSCALL_REGION_ANNOTATIONS:
builder.add_argument((bool)arg1);
break;
case PR_GET_DUMPABLE:
case PR_GET_NO_NEW_SYSCALL_REGION_ANNOTATIONS:
break;
default:
builder.add_arguments(arg1, arg2, arg3);
break;
}
}

static ErrorOr<void> format_syscall(FormattedSyscallBuilder& builder, Syscall::Function syscall_function, syscall_arg_t arg1, syscall_arg_t arg2, syscall_arg_t arg3, syscall_arg_t arg4, syscall_arg_t res)
{
enum ResultType {
Int,
Expand Down Expand Up @@ -788,6 +828,12 @@ static ErrorOr<void> format_syscall(FormattedSyscallBuilder& builder, Syscall::F
format_write(builder, (int)arg1, (void*)arg2, (size_t)arg3);
result_type = Ssize;
break;
case SC_kill:
format_kill(builder, (pid_t)arg1, (int)arg2);
break;
case SC_prctl:
format_prctl(builder, (int)arg1, (size_t)arg2, (size_t)arg3, (size_t)arg4);
break;
case SC_getuid:
case SC_geteuid:
case SC_getgid:
Expand All @@ -797,7 +843,7 @@ static ErrorOr<void> format_syscall(FormattedSyscallBuilder& builder, Syscall::F
case SC_gettid:
break;
default:
builder.add_arguments((void*)arg1, (void*)arg2, (void*)arg3);
builder.add_arguments((void*)arg1, (void*)arg2, (void*)arg3, (void*)arg4);
result_type = VoidP;
}

Expand Down Expand Up @@ -899,19 +945,22 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
#if ARCH(X86_64)
syscall_arg_t syscall_index = regs.rax;
syscall_arg_t arg1 = regs.rdx;
syscall_arg_t arg2 = regs.rcx;
syscall_arg_t arg2 = regs.rdi;
syscall_arg_t arg3 = regs.rbx;
syscall_arg_t arg4 = regs.rsi;
#elif ARCH(AARCH64)
syscall_arg_t syscall_index = 0; // FIXME
syscall_arg_t arg1 = 0; // FIXME
syscall_arg_t arg2 = 0; // FIXME
syscall_arg_t arg3 = 0; // FIXME
syscall_arg_t arg4 = 0; // FIXME
TODO_AARCH64();
#elif ARCH(RISCV64)
syscall_arg_t syscall_index = 0; // FIXME
syscall_arg_t arg1 = 0; // FIXME
syscall_arg_t arg2 = 0; // FIXME
syscall_arg_t arg3 = 0; // FIXME
syscall_arg_t arg4 = 0; // FIXME
TODO_RISCV64();
#else
# error Unknown architecture
Expand Down Expand Up @@ -945,7 +994,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
continue;

FormattedSyscallBuilder builder(syscall_name);
TRY(format_syscall(builder, syscall_function, arg1, arg2, arg3, res));
TRY(format_syscall(builder, syscall_function, arg1, arg2, arg3, arg4, res));

TRY(trace_file->write_until_depleted(builder.string_view().bytes()));
}
Expand Down