Este es el comando stap que se puede ejecutar en el proveedor de alojamiento gratuito de OnWorks utilizando una de nuestras múltiples estaciones de trabajo en línea gratuitas, como Ubuntu Online, Fedora Online, emulador en línea de Windows o emulador en línea de MAC OS.
PROGRAMA:
NOMBRE
stap - traductor / controlador de scripts de systemtap
SINOPSIS
golpe [ OPCIONES ] NOMBRE DEL ARCHIVO [ ARGUMENTOS ]
golpe [ OPCIONES ] - [ ARGUMENTOS ]
golpe [ OPCIONES ] -e GUIÓN [ ARGUMENTOS ]
golpe [ OPCIONES ] -l SONDA [ ARGUMENTOS ]
golpe [ OPCIONES ] -L SONDA [ ARGUMENTOS ]
golpe [ OPCIONES ] --dump-tipos-de-sonda
golpe [ OPCIONES ] --dump-probe-alias
golpe [ OPCIONES ] --funciones de volcado
DESCRIPCIÓN
La golpe El programa es la interfaz de la herramienta Systemtap. Acepta instrucciones de sondeo.
escrito en un lenguaje simple específico de dominio, traduce esas instrucciones en código C,
compila este código C y carga el módulo resultante en un kernel de Linux en ejecución o un
Mutador de espacio de usuario DynInst, para realizar las funciones de rastreo / sonda del sistema solicitadas. Ustedes
puede proporcionar el script en un archivo con nombre (NOMBRE DE ARCHIVO), desde la entrada estándar (use - en lugar de
FILENAME), o desde la línea de comando (usando -e SCRIPT). El programa se ejecuta hasta que se
interrumpido por el usuario, o si el script invoca voluntariamente el salida() función, o por
número suficiente de errores leves.
El idioma, que se describe el GUIÓN IDIOMA sección siguiente, está estrictamente escrita,
expresivo, libre de declaraciones, procedimental, compatible con la creación de prototipos e inspirado en awk y C.
Permite que los puntos de código fuente o eventos en el sistema se asocien con controladores, que
son subrutinas que se ejecutan sincrónicamente. Es algo similar conceptualmente a
"listas de comandos de puntos de interrupción" en el gdb depurador
OPCIONES
El traductor systemtap admite las siguientes opciones. Cualquier otra opción imprime una lista
de opciones admitidas. Las opciones se pueden dar en la línea de comando, como de costumbre. Si el archivo
$ SYSTEMTAP_DIR / rc existen, las opciones también se cargan desde allí y se interpretan primero.
($ SYSTEMTAP_DIR por defecto es $ HOME / .systemtap si no está configurado).
- Utilice la entrada estándar en lugar de un NOMBRE DE ARCHIVO dado como entrada de lenguaje de prueba, a menos que -e
Se proporciona SCRIPT.
-h --ayuda
Mostrar mensaje de ayuda.
-V --versión
Mostrar mensaje de versión.
-p NUM Deténgase después del pase NUM. Los pases están numerados del 1 al 5: analizar, elaborar, traducir,
compilar, ejecutar. Ver el PROCESSING para más detalles.
-v Aumenta la verbosidad en todos los pases. Producir un mayor volumen de información (?)
salida cada vez que se repite la opción.
--vicepresidente A B C D E
Aumente la verbosidad paso a paso. Por ejemplo, "--vp 002" agrega 2 unidades de
verbosidad para pasar 3 solamente. La combinación "-v --vp 00004" agrega 1 unidad de verbosidad
para todos los pases y 4 más para el pase 5.
-k Conserve el directorio temporal después de todo el procesamiento. Esto puede resultar útil para
examinar el código C generado o reutilizar el objeto del kernel compilado.
-g Modo gurú. Habilite el análisis de construcciones de nivel experto inseguras como C.
-P Modo de búsqueda de prólogo. Esto es equivalente a --prologue-looking = always.
Activar la heurística para evitar información de depuración incorrecta para la función
parámetro $ variables de contexto.
-u Modo no optimizado. Desactive la elisión de código no utilizado y muchas otras optimizaciones durante
elaboración / traducción.
-w Modo de advertencias suprimidas. Desactiva todos los mensajes de advertencia.
-W Trate todas las advertencias como errores.
-b Utilice el modo masivo (archivos percpu) para la transferencia de datos de kernel a usuario. Utilizar el stap-fusionar
programa para multiplexarlos de nuevo juntos más tarde.
-t Recopile información de tiempo sobre la cantidad de veces que se ejecuta la sonda y la cantidad promedio
de tiempo empleado en cada punto de prueba. También muestra la derivación para cada punto de sonda.
-sNUM Utilice NUM búferes de megabytes para la transferencia de datos de kernel a usuario. En un multiprocesador en
modo masivo, esta es una cantidad por procesador.
-I DIR Agregue el directorio dado al directorio de búsqueda de tapset. Ver la descripción de
pase 2 para más detalles.
-D NOMBRE = VALOR
Agregue la directiva de preprocesador de C dada al módulo Makefile. Estos se pueden utilizar
para anular los parámetros de límite descritos a continuación.
-B NOMBRE = VALOR
Agregue la directiva make dada a la invocación make de la compilación del módulo del kernel. Estos
se puede usar para agregar o anular opciones de kconfig.
-a ARCH
Utilice un modo de compilación cruzada para la arquitectura de destino determinada. Esto requiere
acceso al compilador cruzado y al árbol de compilación del kernel, y va junto con el -B
CROSS_COMPILE = prefijo-herramienta-arco- y -r / construir / árbol .
--modinfo NOMBRE = VALOR
Agregue el par nombre / valor como una llamada de macro MODULE_INFO al módulo generado. Esta
puede ser útil para informar o anular varias comprobaciones relacionadas con módulos en el kernel.
-G NOMBRE = VALOR
Establece el valor de la variable global NAME en VALUE cuando se invoca staprun. Esta
se aplica a las variables escalares declaradas globales en el script / tapset.
-R DIR Busque las fuentes de tiempo de ejecución de systemtap en el directorio indicado.
-r / DIR
Compilación para el kernel en un árbol de compilación dado. También se puede configurar con el SISTEMATAP_RELEASE
Variable ambiental.
-r LIBERAR
Compilar para el kernel en el árbol de compilación / lib / modules / RELEASE / build. También se puede configurar con
de la forma más SISTEMATAP_RELEASE Variable ambiental.
-m MÓDULO
Utilice el nombre dado para el módulo de objeto del kernel generado, en lugar de un único
nombre aleatorio. El módulo de objeto del kernel generado se copia a la actual
directorio.
-d MÓDULO
Agregue información de símbolo / desenrollado para el módulo dado en el módulo de objeto del kernel.
Esto puede permitir rastreos simbólicos de esos módulos / programas, incluso si lo hacen
no tener una sonda explícita colocada en ellos.
--ldd Agregue información de símbolo / desenrollado para todas las bibliotecas compartidas que ldd sospecha que son
necesario para que los binarios de espacio de usuario sean sondeados o listados con la opción -d.
Precaución: esto puede hacer que los módulos de la sonda sean considerablemente más grandes.
--todos-los-módulos
Equivalente a especificar "-dkernel" y una "-d" para cada módulo del kernel que se
cargado actualmente. Precaución: esto puede hacer que los módulos de la sonda sean considerablemente más grandes.
-o ARCHIVO
Envíe la salida estándar a un archivo con nombre. En modo masivo, los archivos percpu comenzarán con
FILE_ (FILE_cpu con -F) seguido del número de cpu. Esto apoya Strftime(3)
formatos para ARCHIVO.
-c CMD Inicie las sondas, ejecute CMD y salga cuando termine CMD. Esto también tiene el efecto de
estableciendo target () en el pid del comando run.
-x PID Establece target () en PID. Esto permite que se escriban scripts que filtren en un
proceso. Los scripts se ejecutan independientemente de la vida útil del PID.
-e GUIÓN
Ejecute el SCRIPT especificado en la línea de comando.
-E GUIÓN
Ejecute el SCRIPT especificado. Este SCRIPT se ejecuta además del script principal
especificado, a través de -e, o como un archivo de script. Esta opción se puede repetir para ejecutar
varios scripts y se pueden utilizar en modo de listado (-l / -L).
-l SONDA
En lugar de ejecutar un script de sonda, simplemente enumere todos los puntos de sonda disponibles que coincidan
el único punto de sonda dado. El patrón puede incluir comodines y alias, pero
no varios puntos de sondeo separados por comas. El código de resultado del proceso indicará
falla si no hay coincidencias.
-L SONDA
Similar a "-l", pero enumera los puntos de prueba y las variables locales a nivel de script.
-F Sin la opción -o, cargue el módulo e inicie las sondas, luego sepárelo del módulo
dejando las sondas en funcionamiento. Con la opción -o, ejecute staprun en segundo plano como un demonio
y mostrar su pid.
-S tamaño [, N]
Establece el tamaño máximo del archivo de salida y el número máximo de archivos de salida. Si
el tamaño del archivo de salida excederá tamaño , systemtap cambia el archivo de salida al
siguiente archivo. Y si el número de archivos de salida excede N , systemtap elimina el
archivo de salida más antiguo. Puede omitir el segundo argumento.
--skip-badvars
Ignore las variables de contexto irresolubles o inaccesibles en tiempo de ejecución y sustitúyalas por
0, sin errores.
--búsqueda de prólogo[=CUÁNDO]
Modo de búsqueda de prólogo. Activar la heurística para evitar la depuración incorrecta
información para el parámetro de función $ variables de contexto. CUANDO puede ser
"nunca", "siempre" o "auto" (es decir, habilitado por heurística). Si falta CUANDO, entonces
Se asume "siempre". Si falta la opción, se asume "auto".
--suppress-handler-errors
Envuelva a todos los controladores de la sonda en algo como esto
intente {...} atrapar {siguiente}
block, que hace que los errores de tiempo de ejecución se supriman silenciosamente. Errores suprimidos
no cuentes en contra MAXERRORES límites. En este modo, el MAXSKIPPED los límites son
también suprimido, de modo que muchos errores y sondas omitidas pueden acumularse durante un
tiempo de ejecución del script. Los recuentos generales se seguirán informando al apagar.
--compatible VERSION
Suprima los cambios recientes en el lenguaje de script o tapset que son incompatibles con los
versión anterior de systemtap. Esto puede ser útil si un script systemtap mucho más antiguo
no funciona. Vea la sección DEPRECATION para más detalles.
--verificar versión
Esta opción se usa para verificar si el script activo tiene alguna construcción que pueda ser
específico de la versión de systemtap. Consulte la sección DEPRECACIÓN para obtener más detalles.
--limpiar-caché
Esta opción elimina las entradas obsoletas del directorio de caché. Esto se hace normalmente
automáticamente después de ejecuciones exitosas, pero esta opción activará la limpieza
manualmente y luego salir. Consulte la sección CACHING para obtener más detalles sobre el caché.
limites
--color[=CUÁNDO], --color[=CUÁNDO]
Esta opción controla el color de los mensajes de error. CUANDO puede ser "nunca",
"siempre" o "automático" (es decir, habilitar solo si está en un terminal). Si falta CUANDO, entonces
Se asume "siempre". Si falta la opción, se asume "auto".
Los colores se pueden modificar utilizando la variable de entorno SYSTEMTAP_COLORS. El formato
debe ser de la forma key1=val1:key2=val2:key3=val3 ... etc. Las claves válidas son "error",
"advertencia", "fuente", "signo de intercalación" y "símbolo". Los valores constituyen Seleccionar gráfico
Parámetro (s) de reproducción (SGR). Consulte la documentación de su terminal para
SGR que admite. Como ejemplo, los colores predeterminados se expresarían como
error=01;31:warning=00;33:source=00;34:caret=01:token=01. Si SYSTEMTAP_COLORS es
ausente, se utilizarán los colores predeterminados. Si está vacío o no es válido, el color es
apagado.
--desactivar el caché
Esta opción deshabilita todo uso del directorio de caché. Tampoco se leerán archivos
desde o escrito en el caché.
--cache-veneno
Esta opción trata los archivos del directorio de caché como no válidos. No se leerán archivos
del caché, pero los archivos resultantes de esta ejecución aún se escribirán en el
cache. Esto es una ayuda para la resolución de problemas cuando el comportamiento en caché de stap parece fallar.
portarse mal.
--privilegio[=estapusr El | =estapsis El | =estapdev]
Esta opción instruye golpe para examinar el script en busca de construcciones que sean
no permitido para el nivel de privilegio especificado (consulte Sin privilegios USUARIOS).
La compilación falla si se utilizan tales construcciones. Si estapusr or estapsis están
especificado cuando se utiliza un servidor de compilación (consulte --usar-servidor), el servidor examinará
el script y, si la compilación tiene éxito, el servidor firmará criptográficamente el
módulo de kernel resultante, certificando que es seguro para su uso por los usuarios en el
nivel de privilegio especificado.
If --privilegio no ha sido especificado, -pN no se ha especificado con N <5, y
el usuario que invoca no es raíz, y no es miembro del grupo estapdev, entonces golpe
agregará automáticamente el apropiado --privilegio opción a las opciones ya
especificado.
- desfavorecidos
Esta opción es equivalente a --privilegio = stapusr.
--usar-servidor[=HOSTNAME[:PUERTO] | =DIRECCIÓN IP[:PUERTO] | =CERT_SERIAL]
Especifique los servidores de compilación que se utilizarán para la compilación y / o junto con
--lista-servidores y --servidores de confianza (vea abajo). Si no se proporciona ningún argumento, entonces
el predeterminado en modo sin privilegios (ver --privilegio) es seleccionar servidores compatibles
que son confiables como pares SSL y como firmantes de módulos y actualmente están en línea.
De lo contrario, el valor predeterminado es seleccionar servidores compatibles que sean confiables como SSL
compañeros y actualmente en línea. --usar-servidor puede especificarse más de una vez, en la que
caso de que se acumule una lista de servidores en el orden especificado. Los servidores pueden ser
especificado por nombre de host, dirección IP o número de serie del certificado (obtenido mediante
--lista-servidores). Este último se usa más comúnmente al agregar o revocar la confianza en
un servidor (ver --servidores de confianza debajo). Si un servidor se especifica por nombre de host o ip
dirección, entonces se puede especificar un número de puerto opcional. Esto es útil para
acceder a servidores que no están en la red local o para especificar un
servidor.
Las direcciones IP pueden ser direcciones IPv4 o IPv6.
Si una dirección IPv6 en particular es un enlace local y existe en más de una interfaz,
la interfaz deseada se puede especificar agregando la dirección con un porcentaje
signo (%) seguido del nombre de la interfaz deseada. Por ejemplo,
"fe80::5eff:35ff:fe07:55ca%eth0".
Para especificar un número de puerto con una dirección IPv6, es necesario incluir
la dirección IPv6 entre corchetes ([]) para separar el número de puerto de
el resto de la dirección. Por ejemplo, "[fe80 :: 5eff: 35ff: fe07: 55ca]: 5000" o
"[fe80::5eff:35ff:fe07:55ca%eth0]:5000".
If --usar-servidor no ha sido especificado, -pN no se ha especificado con N <5, y
el usuario que invoca no raíz, no es miembro del grupo estapdev, pero es miembro
del grupo estapusr, entonces golpe agregará automáticamente --usar-servidor a las opciones
ya especificado.
--use-servidor-en-error[=si|=no]
Indica a stap que vuelva a intentar la compilación de un script utilizando un servidor de compilación si
La compilación en el host local falla de una manera que sugiere que podría
tener éxito usando un servidor. Si no se especifica esta opción, el valor predeterminado es no. Si no
se proporciona el argumento, entonces el valor predeterminado es si. Se reintentará la compilación para
ciertos tipos de errores (por ejemplo, datos o recursos insuficientes) que pueden no ocurrir
durante la recompilación por un servidor de compilación. Se seleccionarán los servidores de compilación
automáticamente para el intento de recompilación como si --usar-servidor fue especificado con
sin argumentos.
--lista-servidores[= SERVIDORES]
Mostrar el estado del solicitado SERVIDORES, donde el SERVIDORES es una coma separada
lista de atributos del servidor. La lista de atributos se combina para filtrar la lista de
servidores mostrados. Los atributos admitidos son:
all especifica todos los servidores conocidos (pares SSL confiables, firmantes de módulos confiables,
servidores en línea).
especificado
especifica los servidores especificados mediante --usar-servidor.
en línea filtra la salida reteniendo información sobre los servidores que son
Actualmente en linea.
de confianza
filtra la salida reteniendo información sobre los servidores que son confiables
como pares SSL.
firmante filtra la salida reteniendo información sobre los servidores que son confiables
como firmantes del módulo (ver --privilegio).
compatible
filtra la salida reteniendo información sobre los servidores que son
compatible con la versión y arquitectura actual del kernel.
Si no se proporciona ningún argumento, el valor predeterminado es especificado. Si no hubiera servidores
especificado usando --usar-servidor, luego los servidores predeterminados para --usar-servidor están listados.
Tenga en cuenta que --lista-servidores utiliza el avahi-demonio servicio para detectar servidores en línea. Si
este servicio no está disponible, entonces --lista-servidores no detectará ningún en línea
servidores. Para poder --lista-servidores para detectar servidores que escuchan en direcciones IPv6,
de la forma más avahi-demonio archivo de configuración /etc/avahi/avahi-daemon.conf debe contener un
línea activa "use-ipv6 = yes". El servicio debe reiniciarse después de agregar esta línea en
para que se habilite IPv6.
--servidores de confianza[= TRUST_SPEC]
Otorgue o revoque la confianza en los servidores de compilación, especificado mediante --usar-servidor Como se especificó
por TRUST_SPEC, donde TRUST_SPEC es una lista separada por comas que especifica la confianza
que se concederá o revocará. Los elementos admitidos son:
ssl confíe en los servidores especificados como pares SSL.
firmante confiar en los servidores especificados como firmantes del módulo (ver --privilegio). Solo root
puede especificar firmante.
todos los usuarios
otorgue confianza como un par ssl para todos los usuarios en el host local. El valor predeterminado es
para otorgar confianza como un par ssl solo para el usuario actual. Confianza como módulo
siempre se otorga firmante para todos los usuarios. Solo root puede especificar todos los usuarios.
revocar revocar la confianza especificada. El valor predeterminado es otorgarlo.
sin aviso
No solicite confirmación al usuario antes de realizar lo solicitado.
acción. El valor predeterminado es pedir confirmación al usuario.
Si no se proporciona ningún argumento, el valor predeterminado es ssl. Si no se especificaron servidores
usando --usar-servidor, entonces no se otorgará ni se revocará ningún fideicomiso.
A no ser que sin aviso se ha especificado, se le pedirá al usuario que confirme la confianza
para ser otorgado o revocado antes de que se realice la operación.
--dump-tipos-de-sonda
Vuelca una lista de tipos de sonda admitidos y salidas. Si --privilegio = stapusr También es
especificado, la lista se limitará a los tipos de sonda disponibles para usuarios sin privilegios.
--dump-probe-alias
Vuelca una lista de todos los alias de sondeo encontrados en archivos de biblioteca y salidas.
--funciones de volcado
Vuelca una lista de todas las funciones que se encuentran en los archivos de la biblioteca y sale. También incluye su
parámetros y tipos. Una función de tipo 'desconocido' indica una función que no
no devolver un valor. Tenga en cuenta que no todos los tipos de funciones / parámetros pueden resolverse
(estos también se muestran como "desconocido"). Esta función consume mucha memoria y
por lo tanto, puede no funcionar correctamente con --usar-servidor si el servidor de destino impone un límite
en la memoria del proceso (es decir, a través del ~ servidor-stap / .systemtap / rc archivo de configuración,
ver servidor de stap(8)).
--remoto Enlance
Establezca el objetivo de ejecución en el host dado. Esta opción puede repetirse para apuntar
múltiples objetivos de ejecución. Los pases 1-4 se completan localmente de forma normal para la construcción
el script, y luego el paso 5 copiará el módulo al destino y lo ejecutará.
Los formularios de URL aceptables incluyen:
[USER @] HOSTNAME, ssh: // [USER @] HOSTNAME
Este modo usa ssh, opcionalmente usando un nombre de usuario que no coincide con el suyo. Si un
el archivo ssh_config personalizado está en uso, agregue EnviarEnv IDIOMA para retener
funcionalidad de internacionalización.
libvirt: // DOMINIO, libvirt: // DOMINIO / LIBVIRT_URI
Este modo utiliza stapvirt para ejecutar el script en un dominio gestionado por
libvirt. Opcionalmente, LIBVIRT_URI se puede especificar para conectarse a una
controlador y / o un host remoto. Por ejemplo, para conectarse al local privilegiado
Controlador QEMU, utilice:
--remote libvirt: // MyDomain / qemu: /// sistema
Vea la página enhttp://libvirt.org/uri.html> para URI compatibles. Ver también
stapvirt(1) para obtener más información sobre cómo preparar el dominio para stap
sondeo.
unix: RUTA
Este modo se conecta a un socket UNIX. Esto se puede utilizar con una virtud QEMU.
puerto serie para ejecutar scripts dentro de una máquina virtual en ejecución.
directo://
Modo de bucle invertido especial para ejecutarse en el host local.
--prefijo-remoto
Prefije cada línea de salida remota con "N:", donde N es el índice del control remoto
destino de ejecución desde el que se originó la línea dada.
--descargar-información de depuración[= OPCIÓN]
Habilitar, deshabilitar o establecer un tiempo de espera para la función de descarga de información de depuración automática
ofrecido por abrt según lo especificado por OPCIÓN, donde OPCIÓN es uno de los siguientes:
si habilite la descarga automática de debuginfo sin tiempo de espera. Esto es lo mismo
como no proporcionar un valor de OPCIÓN a --descargar-información de depuración
no deshabilite explícitamente la descarga automática de debuginfo. Esto es lo mismo que
no usar la opción en absoluto.
contacta muestre la salida abrt y pregunte antes de continuar con la descarga. No habrá tiempo de espera
conjunto.
especificar un tiempo de espera como un número positivo para detener la descarga si está tardando
demasiado largo.
--rlimit-as= NUM
Especifique el tamaño máximo de la memoria virtual del proceso (espacio de direcciones), en bytes.
Si no se especifica nada, no se imponen límites.
--rlimit-cpu= NUM
Especifique el límite de tiempo de la CPU, en segundos. Si no se especifica nada, no hay límites
impuso.
--rlimit-nproc= NUM
Especifique el número máximo de procesos que se pueden crear. Si nada es
especificado, no se imponen límites.
--rlimit-pila= NUM
Especifique el tamaño máximo de la pila de procesos, en bytes. Si no se especifica nada,
no se imponen límites.
--rlimit-ftamaño= NUM
Especifique el tamaño máximo de archivos que puede crear el proceso, en bytes. Si nada
se especifica, no se imponen límites.
--sysroot= DIR
Especifique el directorio sysroot donde se encuentran los archivos de destino (ejecutables, bibliotecas, etc.)
situado. Con -r LIBERAR, se buscará en el sysroot el kernel apropiado
directorio de construcción. Con -r / DIR, sin embargo, sysroot no se utilizará para encontrar el
compilación del kernel.
--sysenv= VAR = VALOR
Proporcione un valor alternativo para una variable de entorno donde el valor en un control remoto
el sistema es diferente. Se supone que las variables de ruta (por ejemplo, PATH, LD_LIBRARY_PATH) son
relativo al directorio proporcionado por --sysroot, si se proporciona.
--suprimir-los-límites-de-tiempo
Desactive las opciones relacionadas con -DSTP_OVERLOAD, así como -DMAXACTION y -DMAXTRYLOCK.
Esta opción requiere el modo gurú.
--tiempo de ejecución= MODO
Configure el modo de tiempo de ejecución de paso 5. Las opciones válidas son núcleo (predeterminado) y dininst. Vea
ALTERNOS TIEMPOS a continuación para más información.
--dininst
Taquigrafía para --runtime = dyninst.
- guardar-albornoces
En máquinas que requieren SystemTap para construir su propio módulo uprobes (kernels anteriores
a la versión 3.5), esta opción indica a SystemTap que también guarde una copia del módulo
en el directorio actual (creando primero un nuevo directorio "uprobes").
--espacios de nombres de destino= PID
Permitir que se establezca un conjunto de espacios de nombres de destino en función de los espacios de nombres dados
El PID está activado. Esto es para funciones de tapset con reconocimiento de espacio de nombres. Si los espacios de nombres de destino
no se estableció, el destino predeterminado es el espacio de nombres del proceso de stap.
ARGUMENTOS
Cualquier argumento adicional en la línea de comando se pasa al analizador de scripts para
sustitución. Vea abajo.
GUIÓN IDIOMA
El lenguaje de secuencia de comandos systemtap se asemeja a awk y C. Hay dos principales exteriores
constructos: sondas y funciones. Dentro de estos, las declaraciones y expresiones usan C-like
sintaxis y precedencia del operador.
GENERAL SINTAXIS
Se ignora el espacio en blanco. Se admiten tres formas de comentarios:
# ... estilo shell, hasta el final de la línea, excepto $ # y @ #
// ... estilo C ++, hasta el final de la línea
/* ... Estilo C ... */
Los literales son cadenas encerradas entre comillas dobles (que pasan por el escape C habitual
códigos con barras invertidas y con cadenas literales adyacentes pegadas, también como en C),
o enteros (en decimal, hexadecimal u octal, usando la misma notación que en C). Todo
las cadenas tienen una longitud limitada a un valor razonable (unos pocos cientos de bytes). Enteros
son cantidades firmadas de 64 bits, aunque el analizador también acepta (y envuelve) valores
por encima de positivo 2 ** 63.
Además, se pueden insertar los argumentos del script que se dan al final de la línea de comandos. Usar
$1 ... PS para inserción sin comillas, @1 ... @ para la inserción como una cadena literal. El
se puede acceder a un número de argumentos a través de $# (como un número sin comillas) o mediante @# (como un
número citado). Estos pueden usarse en cualquier lugar donde pueda comenzar un token, incluso dentro del
etapa de preprocesamiento. La referencia a un número de argumento más allá de lo que realmente se dio es un
error.
PREPROCESADO
Se ejecuta una etapa de preprocesamiento condicional simple como parte del análisis. La forma general es
similar al cond ? exp1 : operador ternario exp2:
%( CONDICIÓN %? FICHAS VERDADERAS %)
%( CONDICIÓN %? FICHAS VERDADERAS %: FALSAS FICHAS %)
La CONDICIÓN es una expresión cuyo formato está determinado por su primera palabra clave, o
una comparación de literales de cadena o una comparación de literales numéricos. También puede estar compuesto por
muchas alternativas y conjunciones de CONDICIONES (como en la oración anterior) usando ||
y && respectivamente. Sin embargo, los paréntesis aún no son compatibles, por lo que recuerda que
la conjunción tiene prioridad sobre la alternativa es importante.
Si la primera parte es el identificador núcleo_vr or núcleo_v para referirse a la versión del kernel
número, con ("2.6.13-1.322FC3smp") o sin ("2.6.13") el sufijo del código de liberación, entonces
la segunda parte es uno de los seis operadores de comparación numéricos estándar <, <=, ==, !=, >,
y >=, y la tercera parte es un literal de cadena que contiene una versión-release de estilo RPM
valor. La condición se considera satisfecha si la versión del kernel de destino (como
opcionalmente anulado por el -r opción) se compara con la cadena de versión dada. El
la comparación se realiza mediante la función glibc strverscmp. Como caso especial, si el
el operador es para igualdad simple (==), o desigualdad (!=), y la tercera parte contiene cualquier
caracteres comodín* or ? or [), entonces la expresión se trata como una coincidencia de comodines (mis)
evaluado por partido fn.
Si, por el contrario, la primera parte es el identificador arco para referirse al procesador
arquitectura (como el nombre del sistema de compilación del kernel ARCH / SUBARCH), entonces la segunda parte es
uno de los dos operadores de comparación de cadenas == or !=, y la tercera parte es una cadena
literal para que coincida. Esta comparación es una coincidencia comodín (incorrecta).
Del mismo modo, si la primera parte es un identificador como CONFIG_algo para referirse a un kernel
opción de configuración, entonces la segunda parte es == or !=, y la tercera parte es una cadena
literal para hacer coincidir el valor (comúnmente "y" o "m"). Núcleo inexistente o desarmado
Las opciones de configuración están representadas por la cadena vacía. Esta comparación también es una
Coincidencia de comodines (incorrectos).
Si la primera parte es el identificador sistematap_v, la prueba se refiere al systemtap
versión de compatibilidad, que puede ser anulada para scripts antiguos con la --compatible bandera.
El operador de comparación es como está para núcleo_v y el operando derecho es una cadena de versión.
Consulte también la sección DEPRECACIÓN a continuación.
Si la primera parte es el identificador sistematap_privilege, la prueba se refiere al privilegio
nivel con el que se compila el script systemtap. Aquí la segunda parte es == or !=y
la tercera parte es una cadena literal, ya sea "stapusr" o "stapsys" o "stapdev".
Si la primera parte es el identificador modo_gurú, la prueba se refiere a si el script systemtap
se compila con guru_mode. Aquí la segunda parte es == or !=, y la tercera parte es un
número, ya sea 1 o 0.
Si la primera parte es el identificador tiempo de ejecución, la prueba se refiere al tiempo de ejecución de systemtap
modo. Ver ALTERNOS TIEMPOS a continuación para obtener más información sobre los tiempos de ejecución. La segunda parte es
uno de los dos operadores de comparación de cadenas == or !=, y la tercera parte es una cadena
literal para que coincida. Esta comparación es una coincidencia comodín (incorrecta).
De lo contrario, se espera que la CONDICIÓN sea una comparación entre dos literales de cadena o dos
literales numéricos. En este caso, los argumentos son las únicas variables utilizables.
Los TRUE-TOKENS y FALSE-TOKENS son cero o más tokens de analizador general (posiblemente
incluyendo condicionales del preprocesador anidado), y se pasan al flujo de entrada si el
la condición es verdadera o falsa. Por ejemplo, el siguiente código induce un error de análisis a menos que
la versión del kernel de destino es más reciente que 2.6.5:
% (kernel_v <= "2.6.5"%? ** ERROR **%) # secuencia de token no válida
El siguiente código podría adaptarse a una variación hipotética de la versión del kernel:
probe kernel.función (
% (kernel_v <= "2.6.12"%? "__mm_do_fault"%:
% (kernel_vr == "2.6.13 * smp"%? "do_page_fault"%:
NO SOPORTADO%)%)
) {/ * ... * /}
% (arch == "ia64"%?
probe syscall.vliw = kernel.function ("vliw_widget") {}
%)
PREPROCESADOR MACROS
El preprocesador también admite una función de macro simple, que se ejecuta como una pasada separada antes
preprocesamiento condicional.
Las macros se definen mediante la siguiente construcción:
@define NAME% (BODY%)
@define NAME (PARAM_1, PARAM_2, ...)% (BODY%)
Las macros y los parámetros dentro del cuerpo de una macro se invocan anteponiendo el nombre de la macro.
con un símbolo @:
@define foo% (x%)
@define sumar (a, b)% (((@a) + (@ b))%)
@foo = @add (2,2)
La expansión de macros se realiza actualmente en una pasada separada antes de la compilación condicional.
Por lo tanto, tanto los tokens VERDADERO como FALSO en expresiones condicionales serán macroexpandidos
independientemente de cómo se evalúe la condición. A veces, esto puede provocar errores:
// Lo siguiente da como resultado un conflicto:
% (CONFIG_UTRACE == "y"%?
@define foo% (process.syscall%)
%:
@define foo% (** ERROR **%)
%)
// Lo siguiente funciona correctamente como se esperaba:
@define foo% (
% (CONFIG_UTRACE == "y"%? Process.syscall%: ** ERROR **%)
%)
El primer ejemplo es incorrecto porque ambos @defines se evalúan en una pasada antes de la
condicional siendo evaluado.
Normalmente, una definición de macro es local al archivo en el que se encuentra. Por lo tanto, definir una macro en
un juego de derivaciones no lo pone a disposición del usuario del juego de derivaciones. Disponible públicamente
Las macros de biblioteca se pueden definir incluyendo archivos .stpm en la ruta de búsqueda del tapset. Estos
Los archivos solo pueden contener construcciones @define, que se vuelven visibles en todos los conjuntos de tomas y
secuencias de comandos de usuario.
VARIABLES
Los identificadores de variables y funciones son una secuencia alfanumérica y pueden incluir _
y $ caracteres. Es posible que no comiencen con un dígito simple, como en C.Cada variable es por
local predeterminado a la sonda o bloque de declaración de función dentro del cual se menciona, y
por lo tanto, su alcance y duración se limitan a una sonda o invocación de función en particular.
Las variables escalares se escriben implícitamente como una cadena o un entero. Matrices asociativas
también tienen una cadena o valor entero, y una tupla de cadenas y / o enteros que sirven como un
llave. Aquí hay algunas expresiones básicas.
var1 = 5
var2 = "barra"
array1 [pid ()] = "nombre" # clave numérica única
array2 ["foo", 4, i ++] + = 5 # vector de teclas de cadena / num / num
if (["hola", 5,4] en array2) println ("yes") # prueba de membresía
El traductor realiza tipo inferencia en todos los identificadores, incluidos los índices de matriz y
parámetros de función. El uso inconsistente de identificadores relacionado con el tipo indica un error.
Las variables pueden declararse globales, de modo que se compartan entre todas las sondas y vivan como
siempre que toda la sesión systemtap. Hay un espacio de nombres para todas las variables globales,
independientemente del archivo de script en el que se encuentren. Acceso concurrente a global
las variables se protegen automáticamente con bloqueos, consulte la SEGURIDAD Y SEGURIDAD sección para
más detalles. Una declaración global puede escribirse en el nivel más externo en cualquier lugar, no
dentro de un bloque de código. Las variables globales que están escritas pero nunca leídas serán
se muestra automáticamente al cerrar la sesión. El traductor inferirá para cada uno su valor
type, y si se usa como una matriz, sus tipos de clave. Opcionalmente, los globales escalares pueden ser
inicializado con una cadena o un número literal. La siguiente declaración marca las variables como
global.
global var1, var2, var3 = 4
Las variables globales también se pueden configurar como opciones de módulo. Uno puede hacer esto usando el -G
opción, o el módulo debe compilarse primero usando stap -p4. Las variables globales pueden entonces ser
establecido en la línea de comando al llamar a staprun en el módulo generado por stap -p4. Ver
estaprun(8) para obtener más información.
Las matrices están limitadas en tamaño por la variable MAXMAPENTRIES; consulte la SEGURIDAD Y SEGURIDAD
sección para más detalles. Opcionalmente, las matrices globales se pueden declarar con un tamaño máximo en
corchetes, anulando MAXMAPENTRIES solo para esa matriz. Tenga en cuenta que esto no indica
el tipo de claves para la matriz, solo el tamaño.
global tiny_array [10], matriz_normal, big_array [50000]
Las matrices pueden configurarse para encapsularse utilizando el sufijo '%'. Esto hace que los elementos más antiguos
se sobrescribirá si se insertan más elementos de los que puede contener la matriz. Esto funciona para ambos
matrices de tipo asociativo y estadístico.
global wrap_array1% [10], wrap_array2%
Muchos tipos de puntos de sondeo proporcionan variables de contexto, que son valores en tiempo de ejecución, de forma segura
extraído del kernel o del programa de espacio de usuario que se está probando. Estos tienen el prefijo
$ personaje. La sección VARIABLES DE CONTEXTO en aprueba(3stap) enumera lo que está disponible
para cada tipo de punto de sonda. Estas variables de contexto se convierten en cadenas normales o numéricas
escalares una vez que se almacenan en variables de script normales. Ver la sección TIPIFICACIÓN
a continuación sobre cómo convertirlos nuevamente en punteros escritos para su posterior procesamiento como contexto
variables.
DECLARACIONES
Las declaraciones permiten el flujo de control de procedimientos. Pueden ocurrir dentro de funciones y sondear
manipuladores. El número total de declaraciones ejecutadas en respuesta a cualquier evento de sondeo único
está limitado a un número definido por una macro en el código C traducido, y está en el
barrio de 1000.
EXP Ejecute la expresión de valor entero o de cadena y deseche el valor.
{ STMT1 STMT2 ... }
Ejecute cada instrucción en secuencia en este bloque. Tenga en cuenta que los separadores o
los terminadores generalmente no son necesarios entre declaraciones.
; Declaración nula, no hacer nada. Es útil como separador opcional entre
declaraciones para mejorar la detección de errores de sintaxis y para manejar cierta gramática
ambigüedades.
if (EXP.) STMT1 [ más STMT2]
Compare EXP con valores enteros con cero. Ejecute el primer STMT (distinto de cero) o el segundo
(cero).
mientras (EXP) STMT
Mientras que EXP con valores enteros se evalúa como distinto de cero, ejecute STMT.
for (EXP1; EXP2; EXP3) STMT
Ejecute EXP1 como inicialización. Mientras EXP2 no es cero, ejecute STMT, luego el
expresión de iteración EXP3.
foreach (var in ARREGLO [ límitar EXP]) STMT
Haga un bucle sobre cada elemento de la matriz global nombrada, asignando la clave actual a VAR.
La matriz no puede modificarse dentro de la declaración. Añadiendo un solo + or -
operador después del identificador VAR o ARRAY, la iteración procederá en un
orden ordenado, por índice o valor ascendente o descendente. Si la matriz contiene
agregados estadísticos, agregando el deseado @operador entre el identificador ARRAY
y la + or - especificará la función de clasificación agregada. Ver las ESTADISTICAS
sección a continuación para los disponibles. El valor predeterminado es @contar. Usando el opcional límitar
La palabra clave limita el número de iteraciones de bucle a tiempos de EXP. EXP se evalúa una vez
al comienzo del bucle.
foreach ([VAR1, VAR2,...] in ARREGLO [ límitar EXP]) STMT
Igual que el anterior, se usa cuando la matriz está indexada con una tupla de claves. Una clasificación
El sufijo se puede utilizar como máximo en un identificador VAR o ARRAY.
foreach ([VAR1, VAR2,...] in ARRAY [INDICE1, INDEX2, ...] [ límitar EXP]) STMT
Igual que arriba, donde las iteraciones están limitadas a elementos en la matriz donde las claves
coincidir con los valores de índice especificados. El símbolo * se puede utilizar para especificar un índice y
será tratado como un comodín.
foreach (VALOR = VAR in ARREGLO [ límitar EXP]) STMT
Esta variante de foreach guarda el valor actual en VALUE en cada iteración, por lo que es
lo mismo que ARRAY [VAR]. Esto también funciona con una tupla de claves. Ordenar sufijos en
VALUE tiene el mismo efecto que en ARRAY.
foreach (VALOR = VAR in ARRAY [INDICE1, INDEX2, ...] [ límitar EXP]) STMT
Igual que arriba, donde las iteraciones están limitadas a elementos en la matriz donde las claves
coincidir con los valores de índice especificados. El símbolo * se puede utilizar para especificar un índice y
será tratado como un comodín.
break, continue
Salga o repita el ciclo de anidamiento más interno (mientras or for or foreach) declaración.
volvemos EXP
Devuelve el valor EXP de la función adjunta. Si no se toma el valor de la función
en cualquier lugar, entonces no se necesita una declaración de retorno, y la función tendrá una
tipo "desconocido" especial sin valor de retorno.
Next Regrese ahora del controlador de sonda adjunto. Esto es especialmente útil en sonda
alias que aplican predicados de filtrado de eventos.
try {STMT1} catch {STMT2}
Ejecute las declaraciones en el primer bloque. Ante cualquier error de tiempo de ejecución, cancele STMT1 y
comience a ejecutar STMT2. Cualquier error en STMT2 se propagará al try / catch externo
bloques, si los hay.
try {STMT1} catch(VAR) {STMT2}
Igual que el anterior, además de asignar el mensaje de error a la variable escalar de cadena VAR.
borrar ARRAY [INDEX1, INDEX2, ...]
Elimina de ARRAY el elemento especificado por la tupla de índice. Si la tupla de índice
contiene un * en lugar de un índice, el * se trata como un comodín y todos los elementos
con claves que coincidan con la tupla de índice se eliminarán de ARRAY. El valor no
ya estará disponible, y las iteraciones posteriores no informarán del elemento. Está
no es un error eliminar un elemento que no existe.
borrar FORMACIÓN
Elimina todos los elementos de ARRAY.
borrar ESCALAR
Elimina el valor de ESCALAR. Los enteros y las cadenas se borran a 0 y ""
respectivamente, mientras que las estadísticas se restablecen al estado vacío inicial.
EXPRESIONES
Systemtap admite varios operadores que tienen la misma sintaxis general, semántica y
precedencia como en C y awk. La aritmética se realiza según las reglas típicas de C para signos
enteros. Se detecta división por cero o desbordamiento y da como resultado un error.
operadores numéricos binarios
* / % + - >> << & ^ | && ||
operadores de cadena binaria
. (concatenación de cadenas)
operadores de asignación numérica
= *= /= %= += -= >> = << = &= ^= |=
operadores de asignación de cadenas
= .=
operadores numéricos unarios
+ - ! ~ ++ --
Operadores de comparación de cadenas, números binarios o expresiones regulares
< > <= >= == != =~ !~
operador ternario
cond ? exp1 : exp2
operador de agrupación
( exp )
Llamada de función
fn ([arg1, arg2, ...])
verificación de pertenencia a la matriz
exp in matriz
[exp1, exp2, ...] in matriz
[*, *, ... ]in matriz
REGULAR EXPRESIÓN PAREO
El lenguaje de secuencias de comandos admite la coincidencia de expresiones regulares. La sintaxis básica es la
manera:
exp =~ expresiones regulares
exp !~ expresiones regulares
(El primer operando debe ser una expresión que evalúe una cadena; el segundo operando debe
ser una cadena literal que contenga una expresión regular sintácticamente válida).
La sintaxis de expresión regular admite la mayoría de las funciones de POSIX Extended Regular
Expresiones, excepto para la funcionalidad de reutilización de subexpresiones ("\ 1"). La capacidad de capturar
y extraer el contenido de la cadena coincidente y las subexpresiones aún no se
implementado.
SONDAS
La construcción principal en el lenguaje de secuencias de comandos identifica las sondas. Resumen asociado de sondas
eventos con un bloque de instrucciones ("controlador de sonda") que se ejecutará cuando cualquiera de esos
ocurren los eventos. La sintaxis general es la siguiente:
sonda PUNTO DE PRUEBA [, PUNTO DE PRUEBA] { [STMT...] }
sonda PUNTO DE PRUEBA [, PUNTO DE PRUEBA] if (CONDICIÓN) { [STMT...] }
Los eventos se especifican en una sintaxis especial denominada "puntos de prueba". Hay varios
variedades de puntos de prueba definidos por el traductor, y los scripts de tapset pueden definir más
los que usan alias. Los puntos de la sonda pueden tener comodines, agruparse o enumerarse de preferencia
secuencias, o declaradas opcionales. Más detalles sobre la sintaxis y la semántica de los puntos de prueba son
listado en el aprueba(3stap) página de manual.
El controlador de la sonda se interpreta en relación con el contexto de cada evento. Para eventos
asociado con el código del kernel, este contexto puede incluir las variables definido en el fuente código
en ese lugar. Estas "variables de contexto" se presentan al script como variables cuyo
los nombres tienen el prefijo "$". Solo se puede acceder a ellos si el compilador del kernel se conserva
ellos a pesar de la optimización. Esta es la misma restricción a la que se enfrenta un usuario depurador cuando
trabajando con código optimizado. Además, los objetos deben existir en la memoria paginada en
el momento de la ejecución del manejador de la sonda systemtap, porque systemtap no debe causar
(suprime) cualquier paginación adicional. Algunos tipos de sondas tienen muy poco contexto. Ver el
aprueba(3stap) páginas de manual para ver los tipos de variables de contexto disponibles en cada tipo
del punto de la sonda.
Las sondas pueden estar decoradas con un armamento condición, que consta de un booleano simple
expresión en variables de script globales de solo lectura. Mientras está desarmado (la condición se evalúa como
falso), algunos tipos de sondas reducen o eliminan sus gastos generales de tiempo de ejecución. Cuando un armado
condición se evalúa como verdadera, las sondas serán pronto volver a armar, y sus encargados de la investigación
comienzan a ser llamados cuando los eventos se disparan. (Algunos eventos pueden perderse durante el armado
intervalo. Si esto es inaceptable, no use condiciones de armado para esas sondas).
Se pueden definir nuevos puntos de sonda utilizando "alias". Los alias de los puntos de la sonda son similares a
definiciones de sonda, pero en lugar de activar una sonda en el punto dado, simplemente define una
nuevo nombre de punto de sonda como un alias de uno existente. Hay dos tipos de alias, es decir
el estilo del prólogo y el estilo del epílogo que se identifican con "=" y "+ ="
respectivamente.
Para el alias de estilo de prólogo, el bloque de instrucciones que sigue a una definición de alias es
agregado implícitamente como prólogo a cualquier sonda que se refiera al alias. Mientras que para el
alias de estilo de epílogo, el bloque de declaración que sigue a una definición de alias es implícitamente
agregado como un epílogo a cualquier sonda que se refiera al alias. Por ejemplo:
probe syscall.read = kernel.function ("sys_read") {
fildes = $ fd
if (execname () == "init") siguiente # omitir el resto de la sonda
}
define un nuevo punto de sonda syscall.leer, que se expande a kernel.function ("sys_read"), con las
la declaración dada como prólogo, que es útil para predefinir algunas variables para el
alias de usuario y / o para omitir el procesamiento de la sonda por completo en función de algunas condiciones. Y
probe syscall.read + = kernel.function ("sys_read") {
si (tracethis) println ($ fd)
}
define un nuevo punto de prueba con la declaración dada como un epílogo, que es útil para tomar
acciones basadas en variables establecidas o dejadas por el usuario de alias. Tenga en cuenta que en
En cada caso, las declaraciones en el bloque del controlador de alias se tratan normalmente, de modo que
las variables asignadas allí constituyen una mera inicialización, no una macro sustitución.
Un alias se usa como un tipo de sonda integrado.
sonda syscall.read {
printf ("leyendo fd =% d \ n", fildes)
si (fildes> 10) tracethis = 1
}
Las funciones
Los scripts de Systemtap pueden definir subrutinas para factorizar el trabajo común. Las funciones toman cualquier
número de argumentos escalares (enteros o de cadena), y debe devolver un solo escalar (entero
o cuerda). Una declaración de función de ejemplo se ve así:
función thisfn (arg1, arg2) {
devolver arg1 + arg2
}
Tenga en cuenta la ausencia general de declaraciones de tipo, que en cambio se infieren por el
traductor. Sin embargo, si lo desea, una definición de función puede incluir un tipo explícito
declaraciones por su valor de retorno y / o sus argumentos. Esto es especialmente útil para
Funciones C embebidas. En el siguiente ejemplo, el motor de inferencia de tipos solo necesita inferir
type tipo de arg2 (una cadena).
función thatfn: string (arg1: long, arg2) {
retorno de sprint (arg1). arg2
}
Las funciones pueden llamar a otros oa sí mismas de forma recursiva, hasta un límite de anidamiento fijo. Esta
El límite está definido por una macro en el código C traducido y está en la vecindad de 10.
IMPRESIÓN
Hay un conjunto de nombres de funciones que son tratados especialmente por el traductor. Ellos
valores de formato para imprimir en el flujo de salida estándar systemtap de una manera más conveniente
camino. La pique* Las variantes devuelven la cadena formateada en lugar de imprimirla.
Imprimir, sprint
Imprima uno o más valores de cualquier tipo, concatenados directamente juntos.
imprimir, correr
Imprimir valores como Imprimir y sprint, sino que también agrega una nueva línea.
imprimir, Sprintd
Tome un delimitador de cadena y dos o más valores de cualquier tipo e imprima los valores
con el delimitador interpuesto. El delimitador debe ser una constante de cadena literal.
imprimir, sprintdln
Imprimir valores con un delimitador como imprimir y Sprintd, sino que también agrega una nueva línea.
Printf, correr
Tome una cadena de formato y varios valores de los tipos correspondientes e imprima
el centro comercial. El formato debe ser una constante de cadena literal.
La Printf directivas de formato similares a las de C, excepto que son completamente
revisado por el traductor:
% b Escribe un blob binario del valor dado, en lugar de texto ASCII. La anchura
el especificador determina el número de bytes a escribir; los especificadores válidos son% b
% 1b% 2b% 4b% 8b. El valor predeterminado (% b) es de 8 bytes.
% c Carácter.
% d,% i decimal con signo.
% m Lee con seguridad la memoria del kernel en la dirección dada, muestra su contenido. El
El especificador de precisión opcional (no el ancho del campo) determina el número de
bytes para leer: el valor predeterminado es 1 byte. % 10.4m imprime 4 bytes de la memoria en una
Campo de 10 caracteres.
% M Igual que% m, pero la salida es hexadecimal. El tamaño mínimo de salida es
el doble del especificador de precisión opcional: el valor predeterminado es 1 byte (2 caracteres hexadecimales).
% 10.4M imprime 4 bytes de la memoria como 8 caracteres hexadecimales en una
Campo de 10 caracteres.
% o octal sin signo.
% p Dirección de puntero sin signo.
% s Cadena.
% u decimal sin signo.
% x Valor hexadecimal sin signo, todo en minúsculas.
% X Valor hexadecimal sin signo, en mayúsculas.
%% Escribe un%.
La # bandera selecciona las formas alternativas. Para octal, este prefijo un 0. Para hexadecimal, este
prefijos 0x o 0X, según el caso. Para los caracteres, esto escapa a los valores que no se imprimen.
con escapes de tipo C o octal en bruto.
Ejemplos:
a = "alice", b = "bob", p = 0x1234abcd, i = 123, j = -1, id [a] = 1234, id [b] = 4567
imprimir ("hola")
Impresiones: hola
println (b)
Impresiones: bob \ n
println (a. "es". sprint(16))
Impresiones: alice tiene 16
foreach (nombre en id) printdln ("|", strlen (nombre), nombre, id [nombre])
Impresiones: 5 | alice | 1234 \ n3 | bob | 4567
printf ("% c es% s;% x o% X o% p;% d o% u \ n", 97, a, p, p, p, j, j)
Impresiones: a es Alice; 1234abcd o 1234ABCD o 0x1234abcd; -1 o 18446744073709551615 \ n
printf ("2 bytes del búfer del kernel en la dirección% p:% 2m", p, p)
Imprime: 2 bytes del búfer del kernel en la dirección 0x1234abcd:
printf ("% 4b", p)
Imprime (estos valores como datos binarios): 0x1234abcd
printf ("% # o% # x% # X \ n", 1, 2, 3)
Impresiones: 01 0x2 0X3
printf ("% # c% # c% # c \ n", 0, 9, 42)
Impresiones: \ 000 \ t *
ESTADÍSTICA
A menudo es deseable recopilar estadísticas de una manera que evite las sanciones de
Bloqueo repetidamente exclusivo de las variables globales en las que se introducen esos números.
Systemtap proporciona una solución que utiliza un operador especial para acumular valores y varios
pseudo-funciones para extraer los agregados estadísticos.
El operador de agregación es <<, y se asemeja a una asignación, o un flujo de salida de C ++
operación. El operando de la izquierda especifica un lvalor escalar o de índice de matriz, que debe ser
declarado global. El operando de la derecha es una expresión numérica. El significado es intuitivo:
sume el número dado a la pila de números para calcular las estadísticas. (La lista específica
de las estadísticas para recopilar se da por separado, por las funciones de extracción.)
foo <<< 1
stats [pid ()] <<< tamaño de mems
Las funciones de extracción también son especiales. Para cada aparición de una extracción distinta
función que opera en un identificador dado, el traductor se dispone a calcular un conjunto de
estadísticas que lo satisfacen. Por lo tanto, el sistema de estadísticas está "a pedido". Cada ejecución
de una función de extracción hace que la agregación se calcule para ese momento en todos los
procesadores.
Aquí está el conjunto de funciones del extractor. El primer argumento de cada uno es el mismo estilo de
lvalor utilizado en el lado izquierdo de la operación de acumulación. El @count (v), @suma (v),
@min (v), @máx (v), @avg (v) Las funciones de extracción calculan el
número / total / mínimo / máximo / promedio de todos los valores acumulados. Los valores resultantes son
todos enteros simples. Las matrices que contienen agregados se pueden ordenar e iterar. Ver el
foreach construir arriba.
Los histogramas también están disponibles, pero son más complicados porque tienen un vector en lugar de
que el valor escalar. @hist_linear (v, inicio, parada, intervalo) representa un histograma lineal de
"iniciar" a "detener" en incrementos de "intervalo". El intervalo debe ser positivo. Similar,
@hist_log (v) representa un histograma logarítmico de base 2. Imprimir un histograma con el
Imprimir La familia de funciones representa un objeto de histograma como un gráfico de barras tabular "arte ASCII".
temporizador de sonda.perfil {
x [1] <<< pid ()
x [2] <<< uid ()
y <<< tid ()
}
global x // una matriz que contiene agregados
global y // un escalar
sonda end {
foreach ([i] en x @ count +) {
printf ("x [% d]: avg% d = suma% d / recuento% d \ n",
i, @avg (x [i]), @sum (x [i]), @count (x [i]))
println (@hist_log (x [i]))
}
println ("y:")
println (@hist_log (y))
}
TIPIFICACIÓN
Una vez que un puntero (consulte la sección VARIABLES DE CONTEXTO de aprueba(3stap)) se ha guardado
en una variable entera de script, el traductor pierde la información de tipo necesaria para
acceder a los miembros desde ese puntero. Utilizando el @Elenco() El operador le dice al traductor cómo
interprete el número como un puntero escrito.
@cast (p, "type_name" [, "module"]) -> miembro
Esto interpretará p como un puntero a una estructura / unión llamada escribe un nombre y desreferenciar el
miembro valor. Más -> subcampo las expresiones se pueden agregar para desreferenciar más niveles.
NOTA: el mismo operador de desreferenciación -> se utiliza para referirse tanto a contención directa como a
indirección del puntero. Systemtap determina automáticamente cuál. El opcional módulo decirles
el traductor dónde buscar información sobre ese tipo. Múltiples módulos pueden ser
especificado como una lista con : separadores. Si no se especifica el módulo, lo predeterminará
ya sea al módulo de sonda para sondas enanas, o al "núcleo" para funciones y todos los demás
tipos de sondas.
El traductor puede crear su propio módulo con información de tipo de un encabezado rodeado por
corchetes angulares, en caso de que debuginfo normal no esté disponible. Para los encabezados del kernel, prefijo
con "kernel" para usar el sistema de compilación apropiado. Todos los demás encabezados se compilan con
parámetros GCC predeterminados en un módulo de usuario. Se pueden especificar varios encabezados en secuencia
para resolver una codependencia.
@cast (tv, "timeval", " ") -> tv_sec
@cast (tarea, "task_struct", "kernel ") -> tgid
@cast (tarea, "task_struct",
"núcleo ") -> fs-> umask
Valores adquiridos por @Elenco puede ser bastante impresa por el $ y $$ operadores de sufijo, el mismo
manera como se describe en la sección VARIABLES DE CONTEXTO del aprueba(3stap) página de manual.
Cuando esté en modo gurú, el traductor también permitirá que los scripts asignen nuevos valores a los miembros.
de punteros tipocasados.
La tipificación también es útil en el caso de nulo * miembros cuyo tipo puede ser determinable en
tiempo de ejecución.
sonda foo {
if ($ var-> type == 1) {
valor = @cast ($ var-> datos, "tipo1") -> barra
} Else {
valor = @cast ($ var-> datos, "tipo2") -> baz
}
imprimir (valor)
}
EMBEDDED C
Cuando está en modo gurú, el traductor acepta código incrustado en el nivel superior del script.
Dicho código se incluye entre %{ y %} marcadores, y se transcribe palabra por palabra, sin
análisis, en alguna secuencia, en el nivel superior del código C generado. En el más externo
nivel, esto puede ser útil para agregar #incluir instrucciones, y cualquier definición auxiliar para
uso por otro código incrustado.
Otro lugar donde se permite el código incrustado es como cuerpo funcional. En este caso, el
El cuerpo del lenguaje de secuencia de comandos se reemplaza por completo por un fragmento de código C incluido de nuevo entre %{
y %} marcadores. Este código C puede hacer cualquier cosa razonable y segura. Hay una serie de
Restricciones de seguridad indocumentadas pero complejas sobre atomicidad, simultaneidad, recursos
el consumo y los límites de tiempo de ejecución, por lo que esta es una técnica avanzada.
Las ubicaciones de memoria reservadas para valores de entrada y salida se ponen a su disposición mediante
macros STAP_ARG_ * y STAP_RETVALUE. Los errores se pueden señalar con STAP_ERROR. La salida puede
estar escrito con STAP_PRINTF. La función puede regresar antes con STAP_RETURN. Aquí están
algunos ejemplos:
function integer_ops (val)% {
STAP_PRINTF ("% d \ n", STAP_ARG_val);
STAP_RETVALUE = STAP_ARG_val + 1;
si (STAP_RETVALUE == 4)
STAP_ERROR ("suposición incorrecta:% d", (int) STAP_RETVALUE);
si (STAP_RETVALUE == 3)
STAP_RETURN(0);
STAP_RETVALUE ++;
%}
function string_ops (val)% {
strlcpy (STAP_RETVALUE, STAP_ARG_val, MAXSTRINGLEN);
strlcat (STAP_RETVALUE, "uno", MAXSTRINGLEN);
if (strcmp (STAP_RETVALUE, "tres-dos-uno"))
STAP_RETURN ("el parámetro debe ser tres-dos-");
%}
función no_ops ()% {
STAP_RETURN (); / * función inferida sin valor de retorno * /
%}
Los tipos de valor de retorno y argumento de función deben ser inferidos por el traductor de
los sitios de llamada para que esto funcione. El usuario debe examinar el código C generado para
funciones de lenguaje de secuencia de comandos ordinarias para escribir las compatibles con C incorporado.
El último lugar donde se permite el código incrustado es como una expresión rvalue. En este caso,
el código C encerrado entre %{ y %} marcadores se interpreta como una expresión ordinaria
valor. Se supone que es un número con signo normal de 64 bits, a menos que el marcador /* cadena */
se incluye, en cuyo caso se trata como una cadena.
función añadir_uno (val) {
retorno val +% {1%}
}
función añadir_cadena_dos (val) {
retorno val. % {/ * cadena * / "dos"%}
}
El código C incorporado puede contener marcadores para afirmar las propiedades de optimización y seguridad.
/* puro */
significa que el código C no tiene efectos secundarios y puede eliminarse por completo si su valor
no es utilizado por el código de secuencia de comandos.
/* estable */
significa que el código C siempre tiene el mismo valor (en cualquier controlador de sonda dado
invocación), por lo que las llamadas repetidas pueden ser reemplazadas automáticamente por valores memorizados.
Tales funciones no deben tomar parámetros y también deben puro.
/* sin privilegios */
significa que el código C es tan seguro que incluso los usuarios sin privilegios pueden usar
él.
/* myproc-sin privilegios */
significa que el código C es tan seguro que incluso los usuarios sin privilegios pueden usar
, siempre que el objetivo de la sonda actual esté dentro del propio proceso del usuario.
/* gurú */
significa que el código C es tan inseguro que un usuario de systemtap debe especificar -g (gurú
modo) para usar esto.
/* sin destrozar */
en una función C incorporada, significa que la sintaxis de acceso al argumento heredado (anterior a 1.8)
debe estar disponible dentro de la función. Por lo tanto, además de STAP_ARG_foo
y STAP_RETVALUE uno puede usar ESTO-> foo y ESTO->__valor de retorno respectivamente dentro
la función. Esto es útil para migrar rápidamente código escrito para SystemTap
versión 1.7 y anteriores.
/* fnargs sin modificar */
en una función C embebida, significa que los argumentos de la función no se modifican
dentro del cuerpo de la función.
/* cadena */
sólo en expresiones C incrustadas, significa que la expresión tiene const tanque * tipo y
debe tratarse como un valor de cadena, en lugar del valor numérico largo predeterminado.
INCORPORADOS
Los scripts instalados en el
directorio especificado en el Stappaths(7) página de manual. Las funciones se describen en el
aprueba(3stap) página de manual.
PROCESSING
El traductor comienza con el paso 1 analizando el script de entrada dado y todos los scripts (archivos
llamado * .stp) que se encuentra en un directorio de tapset. Los directorios enumerados con -I se procesan en
secuencia, cada uno procesado en "modo gurú". Para cada directorio, varios subdirectorios
también se buscan. Estos subdirectorios se derivan de la versión del kernel seleccionada (el
-R opción), para permitir que más scripts específicos de la versión del kernel anulen menos
específicos. Por ejemplo, para una versión del kernel 2.6.12-23.FC3 los siguientes patrones
se buscaría, en secuencia: 2.6.12-23.FC3 / *. Stp, 2.6.12 / *. Stp, 2.6 / *. Stp, y finalmente
* .stp. Detener el traductor después de la pasada 1 hace que imprima los árboles de análisis.
En el paso 2, el traductor analiza el script de entrada para resolver símbolos y tipos.
Las referencias a variables, funciones y alias de sondeo que no están resueltos internamente son
satisfecho al buscar en los archivos de secuencia de comandos de tapset analizados. Si algún archivo de secuencia de comandos de tapset
se selecciona porque define un símbolo no resuelto, entonces la totalidad de ese archivo es
agregado a la cola de resolución del traductor. Este proceso se repite hasta que todos los símbolos son
resuelto y se selecciona un subconjunto de archivos de secuencia de comandos de tapset.
A continuación, todas las descripciones de los puntos de la sonda se validan con la amplia variedad admitida por el
traductor. Puntos de sonda que se refieren a ubicaciones de código ("puntos de sonda síncronos")
requieren que se instale la información de depuración del kernel adecuada. En el asociado
controladores de sondeo, las variables del lado de destino (cuyos nombres comienzan con "$") se encuentran y tienen
sus ubicaciones de tiempo de ejecución decodificadas.
A continuación, todas las sondas y funciones se analizan en busca de oportunidades de optimización, con el fin de
eliminar variables, expresiones y funciones que no tengan ningún valor útil ni efectos secundarios.
Se supone que las funciones C incrustadas tienen efectos secundarios a menos que incluyan la cadena mágica
/* puro */. Dado que esta optimización puede ocultar errores de código latentes, como desajustes de tipos
o variables de contexto $ inválidas, a veces puede ser útil deshabilitar las optimizaciones
con el -u .
Finalmente, todos los tipos de variables, funciones, parámetros, matrices e índices se infieren de
contexto (literales y operadores). Detener el traductor después de la pasada 2 hace que aparezca en la lista.
todas las sondas, funciones y variables, junto con todos los tipos inferidos. Cualquier inconsistente
o los tipos no resueltos provocan un error.
En el paso 3, el traductor escribe código C que representa las acciones de todos los guiones seleccionados.
archivos y crea un Makefile para construir eso en un objeto del kernel. Estos archivos se colocan
en un directorio temporal. Detener el traductor en este punto hace que imprima el
contenido del archivo C.
En el paso 4, el traductor invoca el sistema de compilación del kernel de Linux para crear el
archivo de objeto del kernel. Esto implica correr make en el directorio temporal y requiere un
El sistema de compilación del módulo del kernel (encabezados, config y Makefiles) se instalará en la forma habitual.
punto / lib / modules / VERSION / build. Detener al traductor después del pase 4 es la última oportunidad
antes de ejecutar el objeto del kernel. Esto puede resultar útil si desea archivar el archivo.
En el paso 5, el traductor invoca el programa auxiliar systemtap estaprun programa para el
dado el objeto del kernel. Este programa se encarga de cargar el módulo y luego se comunica con él,
copiar datos de seguimiento del kernel en archivos temporales, hasta que el usuario envía una interrupción
señal. Cualquier error en tiempo de ejecución encontrado por los manejadores de la sonda, como quedarse sin
memoria, división por cero, exceder los límites de anidamiento o tiempo de ejecución, da como resultado un error leve
indicación. Errores de software superiores al bloque MAXERRORS de todas las sondas posteriores (excepto
sondas de manejo de errores) y finalizar la sesión. Por fin, estaprun descarga el módulo,
y limpia.
ANORMAL TERMINACIÓN
Uno debe evitar matar el proceso de stap a la fuerza, por ejemplo con SIGKILL, porque el
proceso stapio (un proceso hijo del proceso stap) y el módulo cargado se puede dejar
ejecutándose en el sistema. Si esto sucede, envíe SIGTERM o SIGINT a cualquier stapio restante
procesos, luego use rmmod para descargar el módulo systemtap.
EJEMPLOS
Consulte las estribo(3stap) página de manual para una breve colección de muestras, o un gran conjunto de
ejemplos instalados en los directorios systemtap documentation / testsuite. Ver
Stappaths(7stap) para conocer la ubicación probable de estos en el sistema.
ALMACENAMIENTO EN CACHE
El traductor systemtap almacena en caché la salida del paso 3 (el código C generado) y el paso 4
salida (el módulo del kernel compilado) si el paso 4 se completa con éxito. Esta salida en caché
se reutiliza si el mismo script se traduce de nuevo asumiendo que existen las mismas condiciones (las mismas
versión del kernel, misma versión de systemtap, etc.). Los archivos en caché se almacenan en el
$ SYSTEMTAP_DIR / cache directorio. La caché se puede limitar al tener el archivo límite_mb_caché
colocado en el directorio de caché (mostrado arriba) que contiene solo un entero ASCII que representa
cuántos MiB no debe exceder el caché. En ausencia de este archivo, un valor predeterminado será
creado con el límite establecido en 256MiB. Este es un límite 'suave' en el sentido de que la caché será
limpia después de agregar una nueva entrada si se excede el intervalo de limpieza de caché, por lo que el total
el tamaño de la caché puede exceder temporalmente este límite. Este intervalo se puede especificar teniendo el
presentar cache_clean_interval_s colocado en el directorio de caché (que se muestra arriba) que contiene solo un
Entero ASCII que representa el intervalo en segundos. En ausencia de este archivo, un
se creará con el intervalo establecido en 300 s.
SEGURIDAD Y SEGURIDAD
Systemtap se puede utilizar como una poderosa herramienta administrativa. Puede exponer el kernel interno
estructuras de datos e información de usuario potencialmente privada. (En dininst modo de ejecución, este
no es el caso, vea el ALTERNOS TIEMPOS sección a continuación.)
El traductor afirma muchas restricciones de seguridad durante la compilación y más durante la ejecución.
hora. Su objetivo es garantizar que ninguna rutina de controlador pueda ejecutarse durante mucho tiempo, asigne ilimitadas
memoria, realizar operaciones inseguras o interferir involuntariamente con el sistema. Usos
de las variables globales del script se bloquean automáticamente de lectura / escritura según corresponda, para proteger
contra la manipulación por parte de manejadores de sondeo concurrentes. (Los interbloqueos se detectan con tiempos de espera.
Ingrese al -t para recibir informes de excesiva contención de bloqueo).
Por lo tanto, los scripts son generalmente ambiente seguro. El modo gurú -g La opción permite a los administradores
evitar la mayoría de las medidas de seguridad, lo que permite operaciones invasivas o que cambian de estado,
código C incorporado y aumenta el riesgo de alteraciones. De forma predeterminada, la prevención de sobrecarga es
encendido para todos los módulos. Si desea deshabilitar el procesamiento de sobrecarga, use el
--suprimir-los-límites-de-tiempo .
Los errores que se detectan en tiempo de ejecución normalmente dan como resultado un cierre limpio del script y un pase 5
mensaje de error. El --suppress-handler-errors La opción permite que los scripts toleren errores leves.
sin apagar.
Los permisos
Para el tiempo de ejecución normal de linux-kernel-module, para ejecutar las compilaciones systemtap de objetos del kernel, un
el usuario debe ser uno de los siguientes:
· El usuario root;
· Un miembro de la estapdev y estapusr grupos;
· Un miembro de la estapsis y estapusr grupos; o
· Un miembro de la estapusr grupo.
El usuario root o un usuario que sea miembro de ambos estapdev y estapusr los grupos pueden construir
y ejecute cualquier script systemtap.
Un usuario que sea miembro de la estapsis y estapusr los grupos solo pueden utilizar
módulos en las siguientes condiciones:
· El módulo ha sido firmado por un firmante de confianza. Los firmantes de confianza suelen ser systemtap
servidores de compilación que firman módulos cuando el --privilegio La opción está especificada por la
cliente. Ver el servidor de stap(8) página de manual para obtener más información.
· El módulo fue construido usando el --privilegio = stapsys o el --privilegio = stapusr .
Miembros de solo el estapusr El grupo solo puede usar módulos prediseñados bajo los siguientes
condiciones:
· El módulo se encuentra en el directorio / lib / modules / VERSION / systemtap. Este directorio
debe ser propiedad de root y no tener permisos de escritura en todo el mundo.
or
· El módulo ha sido firmado por un firmante de confianza. Los firmantes de confianza suelen ser systemtap
servidores de compilación que firman módulos cuando el --privilegio La opción está especificada por la
cliente. Ver el servidor de stap(8) página de manual para obtener más información.
· El módulo fue construido usando la opción --privilege = stapusr.
Los módulos del kernel generados por golpe el programa son ejecutados por el estaprun programa. Este último
es parte del paquete Systemtap, dedicado a la carga y descarga de módulos (pero solo en
la zona blanca) y la transferencia de datos de kernel a usuario. Ya que estaprun no realiza ninguna
controles de seguridad adicionales en los objetos del kernel que se le da, sería imprudente para un
administrador del sistema para agregar usuarios no confiables al estapdev or estapusr grupos.
ARRANQUE SEGURO
Si el sistema actual tiene SecureBoot activado en el firmware UEFI, todos los módulos del kernel
debe estar firmado. (Algunos kernels pueden permitir deshabilitar SecureBoot mucho después de arrancar con un
secuencia de teclas como SysRq-X, por lo que no es necesario firmar módulos).
El servidor de compilación puede firmar módulos con una MOK (Clave de propietario de máquina) que tiene en común con
un sistema cliente. Consulte la siguiente página wiki para obtener más detalles:
https://sourceware.org/systemtap/wiki/SecureBoot
DIRECTORIO DE LÍMITES
Muchos límites de uso de recursos se establecen mediante macros en el código C generado. Estos pueden ser
anulado con -D banderas. Una selección de estos es la siguiente:
MAXNESTING
Número máximo de llamadas a funciones anidadas. Predeterminado determinado por el análisis de la secuencia de comandos,
con una bonificación de 10 ranuras agregadas para scripts recursivos.
MAXSTRINGLEN
Longitud máxima de cadenas, por defecto 128.
MAXTRYLOCK
Número máximo de iteraciones para esperar bloqueos en variables globales antes de declarar
posible interbloqueo y omisión de la sonda, por defecto 1000.
MAXACCIÓN
Número máximo de declaraciones que se ejecutarán durante un único acierto de sondeo (con
interrupciones inhabilitadas), predeterminado 1000. Tenga en cuenta que para los controladores de sondeo directos
sin bucles o recursividad, debido a la optimización, este parámetro puede ser interpretado
demasiado conservadoramente.
MAXACTION_INTERRUPTIBLE
Número máximo de sentencias que se ejecutarán durante un único acierto de sondeo que sea
ejecutado con interrupciones habilitadas (como sondas de inicio / finalización), predeterminado (MAXACTION *
10).
MAXBACKTRACE
Número máximo de marcos de pila que serán procesados por el tiempo de ejecución de stap
desbobinador producido por las funciones backtrace en el contexto [u] -wind.stp
juegos de derivaciones, por defecto 20.
MAXMAPENTRÍAS
Número máximo predeterminado de filas en cualquier matriz global única, predeterminado 2048.
Las matrices individuales se pueden declarar con un límite mayor o menor en su lugar:
global grande [10000], pequeño [5]
o denotado con % para que se envuelvan automáticamente.
MAXERRORES
Número máximo de errores de software antes de que se active una salida, por defecto 0, lo que significa
que el primer error saldrá del script. Tenga en cuenta que con el
--suppress-handler-errors opción, este límite no se aplica.
MAXSKIPPED
Número máximo de sondeos omitidos antes de que se active una salida, por defecto 100. En ejecución
systemtap con el modo -t (temporización) proporciona más detalles sobre las sondas omitidas. Con el
predeterminado -DINTERRUPTIBLE = 1 configuración, las sondas omitidas debido a la reentrada no se
acumulados contra este límite. Tenga en cuenta que con el --suppress-handler-errors
opción, este límite no se aplica.
ESPACIO MINSTACK
Número mínimo de bytes de pila de kernel libres necesarios para ejecutar un controlador de sondeo,
por defecto 1024. Este número debe ser lo suficientemente grande para el propio administrador de la sonda
necesidades, más un margen de seguridad.
MAXUPRONDAS
Número máximo de sondas de espacio de usuario armadas simultáneamente (uprobes), predeterminado algo
mayor que el número de puntos de sondeo del espacio de usuario mencionados en el script. Esta piscina
necesita ser potencialmente grande porque los objetos individuales arriba del armario (alrededor de 64 bytes
cada uno) se asignan para cada proceso para cada sonda de nivel de script coincidente.
STP_MAXMEMORY
Cantidad máxima de memoria (en kilobytes) que debe usar el módulo systemtap,
predeterminado ilimitado. El tamaño de la memoria incluye el tamaño del módulo en sí, más
cualquier asignación adicional. Esto solo rastrea las asignaciones directas por el systemtap
tiempo de ejecución. Esto no rastrea las asignaciones indirectas (como lo hace kprobes / uprobes / etc.
internos).
STP_OVEROAD_THRESHOLD, STP_OVERLOAD_INTERVAL
Número máximo de ciclos de máquina gastados en sondas en cualquier CPU por intervalo dado,
antes de que se declare una condición de sobrecarga y se apague el script. Los incumplimientos
son 500 millones y mil millones, para limitar el consumo de la CPU del script stap a alrededor de
50%.
STP_PROCFS_BUFSIZE
Tamaño de los búferes de lectura de la sonda procfs (en bytes). Predeterminado a MAXSTRINGLEN. Esto
el valor se puede anular por archivo procfs utilizando la sonda de lectura procfs
.maxsize (MAXSIZE) parámetro.
Con scripts que contienen sondas en cualquier ruta de interrupción, es posible que esos
Las interrupciones pueden ocurrir en medio de otro administrador de sondeos. La sonda en la interrupción
handler se omitiría en este caso para evitar la reentrada. Para solucionar este problema,
ejecutar stap con la opción -DINTERRUPTIBLE = 0 para enmascarar interrupciones a lo largo de la sonda
manipulador. Esto agrega algo de sobrecarga adicional a las sondas, pero puede evitar la reentrada.
para casos de problemas comunes. Sin embargo, las sondas en los controladores de NMI y en la ruta de llamada del stap
El tiempo de ejecución aún se puede omitir debido a la reentrada.
Varias secuencias de comandos pueden escribir datos en un búfer de retransmisión al mismo tiempo. Un script de host proporciona
una interfaz para acceder a su búfer de retransmisión a los scripts invitados. Entonces, la salida del
los invitados se fusionan en la salida del host. Para ejecutar un script como host, ejecute stap
con -DRELAYHOST [= nombre] opción. La nombre identifica su secuencia de comandos de host entre varios hosts.
Mientras ejecuta el host, ejecute stap con -DRELAYGUEST [= nombre] para agregar un script de invitado al
anfitrión. Tenga en cuenta que debe descargar invitados antes de descargar un host. Si hay algunos invitados
conectado al host, la descarga del host fallará.
En caso de que algo salga mal golpe or estaprun después de que una sonda ya haya comenzado
en ejecución, uno puede matar de forma segura ambos procesos de usuario y eliminar el kernel de prueba activo
módulo con modmod. Es posible que se pierdan los mensajes de seguimiento pendientes.
Sin privilegios USUARIOS
Systemtap expone las estructuras de datos internas del kernel y el usuario potencialmente privado
información. Debido a esto, el uso de todas las capacidades de systemtap está restringido a root
ya los usuarios miembros de los grupos stapdev y stapusr.
Sin embargo, se puede poner a disposición de los usuarios de confianza un conjunto restringido de funciones de systemtap.
usuarios sin privilegios. Estos usuarios son miembros del grupo stapusr solamente, o miembros del
grupos stapusr y stapsys. Estos usuarios pueden cargar módulos systemtap que han sido
compilado y certificado por un servidor de compilación systemtap confiable. Ver las descripciones de los
opciones --privilegio y --usar-servidor. Vea README.sin privilegios en el código fuente de systemtap
para obtener información sobre cómo configurar un servidor de compilación confiable.
Las restricciones impuestas cuando --privilegio = stapsys se especifica están diseñados para prevenir
usuarios sin privilegios de:
· Dañar el sistema de forma maliciosa.
Las restricciones impuestas cuando --privilegio = stapusr se especifica están diseñados para prevenir
usuarios sin privilegios de:
· Dañar el sistema de forma maliciosa.
· Obtener acceso a información que normalmente no estaría disponible para un
usuario sin privilegios.
· Interrumpir el desempeño de los procesos que son propiedad de otros usuarios del sistema.
Algunos gastos generales del sistema en general son inevitables ya que los desfavorecidos
Las sondas del usuario se activarán en los momentos adecuados. Lo que nos gustaría
evitar es la interrupción específica de los procesos de otro usuario que no
normalmente puede ser posible por un usuario sin privilegios.
SONDA RESTRICCIONES
Un miembro de los grupos stapusr y stapsys puede utilizar todos los puntos de sonda.
Un miembro solo del grupo stapusr puede usar solo las siguientes sondas:
· Comenzar, comenzar (n)
· Fin, fin (n)
· Error (n)
· nunca
· Proceso. *, Donde el proceso de destino es propiedad del usuario.
· Temporizador. {Jiffies, s, sec, ms, msec, us, usec, ns, nsec} (n) *
· Timer.hz (n)
GUIÓN IDIOMA RESTRICCIONES
Las siguientes funciones del lenguaje de secuencias de comandos no están disponibles para todos los usuarios sin privilegios:
· Cualquier característica habilitada por la opción Guru Mode (-g).
· Código C incrustado.
TIEMPO DE FUNCIONAMIENTO RESTRICCIONES
Las siguientes restricciones de tiempo de ejecución se aplican a todos los usuarios sin privilegios:
· Solo el código de tiempo de ejecución predeterminado (consulte -R) puede ser usado.
Se imponen restricciones adicionales a los miembros de solo el grupo stapusr:
· No se permite el sondeo de procesos propiedad de otros usuarios.
· No se permite el acceso a la memoria del núcleo (lectura y escritura).
COMANDO LÍNEA OPCIÓN RESTRICCIONES
Algunas opciones de la línea de comandos brindan acceso a funciones que no deben estar disponibles para todos
usuarios sin privilegios:
· -G puede no especificarse.
· Es posible que el cliente del servidor de compilación no utilice las siguientes opciones:
-a, -B, -D, -I, -r, -R
MEDIO AMBIENTE RESTRICCIONES
Las siguientes variables de entorno no deben configurarse para todos los usuarios sin privilegios:
SISTEMATAP_RUNTIME
SISTEMATAP_TAPSET
SISTEMATAP_DEBUGINFO_PATH
Grifo RESTRICCIONES
En general, las funciones del juego de tomas solo están disponibles para los miembros del
no recopile información que un programa ordinario que se ejecuta con los privilegios de ese usuario
se le negaría el acceso a.
Hay dos categorías de funciones de tapset sin privilegios. La primera categoría consta de
funciones de utilidad que están incondicionalmente disponibles para todos los usuarios; estos incluyen tales
cosas como:
cpu: largo ()
Salida ()
str_replace: cadena (prnt_str: cadena, srch_str: cadena, rplc_str: cadena)
La segunda categoría consta de los llamados myproc-sin privilegios funciones que solo pueden
recopilar información dentro de sus propios procesos. Scripts que deseen utilizar estas funciones
debe probar el resultado de la función del juego de tomas es_miproc y solo llame a estas funciones si el
el resultado es 1. El script se cerrará inmediatamente si alguna de estas funciones es llamada por un
usuario sin privilegios dentro de una sonda dentro de un proceso que no es propiedad de ese usuario.
Ejemplos de myproc-sin privilegios las funciones incluyen:
print_usyms (stk: cadena)
user_int: long (addr: long)
usymname: string (addr: long)
Se desencadena un error de compilación cuando se activa cualquier función que no esté en ninguna de las categorías anteriores.
utilizado solo por miembros del grupo stapusr.
Los miembros del grupo stapusr no pueden utilizar otras funciones integradas del juego de derivaciones.
ALTERNOS TIEMPOS
Como se describió anteriormente, el modo de tiempo de ejecución predeterminado de systemtap implica compilar y cargar el kernel
módulos, con varias compensaciones de seguridad presentadas. Systemtap ahora incluye un nuevo
backend prototipo, seleccionado con --runtime = dyninst, que utiliza Dyninst para instrumentar un
propios procesos del usuario en tiempo de ejecución. Este backend no usa módulos del kernel y no
requieren privilegios de root, pero está restringido con respecto a los tipos de sondas y otros
construcciones que puede utilizar un script.
La dininst El tiempo de ejecución opera en modo de conexión de destino, por lo que requiere un -c COMANDO or -x
PID proceso. Por ejemplo:
stap --runtime = dyninst -c 'stap -V' \
-e 'función de proceso de sonda ("principal")
{println ("hola de dyninst!")} '
Puede ser necesario deshabilitar una verificación de selinux conflictiva con
#setsebool allow_execstack 1
SALIR ESTADO
El traductor systemtap generalmente regresa con un código de éxito de 0 si el solicitado
La secuencia de comandos se procesó y ejecutó con éxito a través de la pasada solicitada. De lo contrario,
los errores pueden imprimirse en stderr y se devuelve un código de falla. Usar -v or -vicepresidente N a
Aumente la verbosidad (global o por pasada) para identificar la fuente del problema.
En modo de listados (-l y -L), los mensajes de error normalmente se eliminan. Un código de éxito de 0
se devuelve si se encuentra al menos una sonda coincidente.
Un script que se ejecuta en el paso 5 que se interrumpe con ^ C / SIGINT se considera
exitoso.
DEPRECACIÓN
Con el tiempo, algunas funciones del lenguaje de secuencia de comandos y la biblioteca de tapset pueden sufrir
cambios incompatibles, de modo que un script escrito en una versión anterior de systemtap no
ejecución más larga. En estos casos, puede ser útil ejecutar systemtap con el --compatible VERSION
bandera, especificando la última versión de trabajo conocida. Ejecutando systemtap con el
--verificar versión La bandera emitirá una advertencia si se han detectado posibles elementos incompatibles.
analizado. Los detalles históricos de la desaprobación se pueden encontrar en el archivo de NOTICIAS.
Use stap en línea usando los servicios de onworks.net