Автоматически запускать процесс связывания при вызове - PullRequest
1 голос
/ 20 марта 2019

Целью приведенного ниже сценария 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 или есть еще более разумный способ достичь цели, начиная отслеживать процесс на лету?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...