boottrace(8): small wrapper utility

This is a small program that when invoked will create start and stop
boottrace entries via sysctl, and execute the desired command. Having
this as an executable -- as opposed to some shell script invoking
sysctl(8) -- allows the total resource usage recorded by the trace
entries to include the child process.

Reviewed by:	0mp, trasz (older version)
Sponsored by:	NetApp, Inc.
Sponsored by:	Klara, Inc.
Differential Revision:	https://reviews.freebsd.org/D31929
This commit is contained in:
Mitchell Horne 2021-02-05 16:07:39 -04:00
parent 7b0a665d72
commit 13ec1e3155
4 changed files with 161 additions and 0 deletions

View file

@ -6,6 +6,7 @@
SUBDIR= adduser \
arp \
binmiscctl \
boottrace \
camdd \
cdcontrol \
chkgrp \

View file

@ -0,0 +1,4 @@
PROG= boottrace
MAN= boottrace.8
.include <bsd.prog.mk>

View file

@ -0,0 +1,85 @@
.\" SPDX-License-Identifier: BSD-2-Clause-FreeBSD
.\"
.\" Copyright (c) 2022 NetApp, Inc.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.Dd February 18, 2022
.Dt BOOTTRACE 8
.Os
.Sh NAME
.Nm boottrace
.Nd trace command execution with
.Xr boottrace 4
.Sh SYNOPSIS
.Nm
.Ar utility Op Ar argument ...
.Sh DESCRIPTION
The
.Nm
utility
executes the specified
.Ar utility ,
creating two
.Xr boottrace 4
trace entries before and after its execution.
.Sh ENVIRONMENT
The
.Ev PATH
environment variable is used to locate the requested
.Ar utility
if the name contains no
.Ql /
characters.
.Sh EXIT STATUS
If
.Ar utility
was executed successfully, its exit status is returned.
.Pp
If
.Ar utility
was found but could not be executed, an exit status of 126 is returned.
If
.Ar utility
could not be found, an exit status of 127 is returned.
.Sh EXAMPLES
Execute the
.Xr dumpon 8
utility, logging the trace entries:
.Bd -literal -offset indent
$ boottrace dumpon -z /dev/gpt/swap0
.Ed
.Pp
This will appear in the output of the
.Va kern.boottrace.log
.Xr sysctl 8
node:
.Bd -literal
CPU msecs delta process event PID CPUtime IBlks OBlks
0 63918567 0 kernel sysinit 0x2100001 0 0.00 0 0
[...]
0 64076940 120605 boottrace dumpon start 1602 0.00 0 0
0 64076942 2 boottrace dumpon done 1602 0.00 0 0
.Ed
.Sh SEE ALSO
.Xr boottrace 4 ,
.Xr rc.subr 8

View file

@ -0,0 +1,71 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* Copyright (c) 2022 NetApp, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <sys/types.h>
#include <sys/boottrace.h>
#include <sys/sysctl.h>
#include <sys/wait.h>
#include <err.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
static void
usage(void)
{
fprintf(stderr, "usage: boottrace utility [argument ...]\n");
exit(1);
}
int
main(int argc, char **argv)
{
pid_t pid;
int status;
if (argc < 2)
usage();
argv++;
BOOTTRACE("%s start", *argv);
pid = fork();
if (pid == -1) {
exit(1);
} else if (pid == 0) {
execvp(*argv, argv);
err(errno == ENOENT ? 127 : 126, "execvp %s", *argv);
}
waitpid(pid, &status, 0);
if (!WIFEXITED(status))
warnx("command terminated abnormally");
BOOTTRACE("%s done", *argv);
return (WIFEXITED(status) ? WEXITSTATUS(status) : EXIT_FAILURE);
}