Целью приведенного ниже сценария SystemTap является запуск strace
при каждом запуске процесса с данным именем файла.
Он вызывается с помощью следующей команды:
stap -g -v './sstrace.stp' "$PATTERN"
ГдеНапример, PATTERN может быть mount
.
#!/usr/bin/env stap
# Assign command line parameter to the variable.
@define target_filename %( @1 %) # The regex the script will trigger on given as CLI parameter
probe begin {
printf( "Probe starting ...\n" )
printf( "Try to attach strace upon executing binary (regex) /%s/\n\n" , @target_filename )
}
probe end {
printf( "Wrapping up ...\n" )
}
probe syscall.execve {
if ( filename =~ @target_filename ) {
start_trace( pid() )
}
}
###
### FUNCTIONS
###
function start_trace( pid ) {
raise( 19 )
# Sleeping is bad practice in SystemTap probe, but don't know how to otherwise
# wait for strace to initialize in time. This will not work as expected when
# workting interactively. Compare these two results while increasing below sleep
# to 1 second.
# $ sudo ./go date
# $ date; echo hi
# $ bash -c 'date; echo hi'
system( sprintf( "strace -f -p %i & sleep 0.01; kill -CONT %i" , pid , pid ) )
}
. Идея состоит в том, что я прекращаю выполнение (raise( -19 )
) целевого процесса достаточно долго, чтобы strace
подключился к процессу, а затем перезапускаюцелевой процесс (kill -CONT $TARGET_PID
).Это часто работает, но, к сожалению, с перебоями.
Когда это работает, strace
запускается сразу после execve()
, примерно так:
$ strace date 2>&1 | head
execve("/bin/date", ["date"], 0x7ffeb7ce6430 /* 64 vars */) = 0
brk(NULL) = 0x5578de8fa000 <== strace kicks in here.
access("/etc/ld.so.nohwcap", F_O............
Теперь проблема, которую я действительно, по крайней мере, хочучтобы понять и, надеюсь, решить, это тот факт, что в некоторых системах я не могу kill -STOP
целевой процесс, он просто выдает ошибку в виде: kill: process xyz does not. exist
.
Я знаю к тому времени, как execve
syscall вызывается, PID уже существует.Чего я не понимаю, так это того, почему он не подчиняется SIGSTOP
.
Кто-нибудь знает, почему это происходит, как исправить сценарий SystemTap или есть еще более разумный способ достичь цели, начиная отслеживать процесс на лету?