Монитор и внимательный пользователь, когда stty настройки изменяются?

Странно, что Ваш корневой каталог смонтирован только для чтения. Ваша система обычно запускалась или была там какими-либо "незначительными сбоями" во время начальной загрузки? В чем runlevel - Вы? (who -r если Вы не уверены),

В любом случае можно повторно смонтировать использование чтения-записи корневого каталога

mount -o remount,rw /
3
17.01.2015, 01:16
1 ответ

Если вы считаете, что можете вызвать событие определенным действием или взаимодействием, то самый простой способ выглядит примерно так:

 watch -d -n1 "stty -F /dev/pts/106 -a | grep -Eo '.(icanon|ixon)'"

Запустите это на новый терминал, опция -F - это терминал, на котором вы будете запускать программу (запустите tty , чтобы увидеть, что это такое, перед запуском). Пропустить | grep .. , если вы хотите увидеть полное состояние терминала.

Следующий вариант, если вы используете Linux, - использовать ltrace для отслеживания вызовов библиотеки, это похоже на strace (и включает некоторые возможности strace ), но он работает с библиотеками пользовательского пространства, а не только с системными вызовами ядра:

ltrace -tt -e tcgetattr+tcsetattr myprogram ...

Это покажет и вызовы с отметкой времени для tcgetattr () и tcsetattr () , функций libc для получения и установки атрибутов терминала.

В конечном итоге эти вызовы libc будут использовать системный вызов ioctl () , это вы можете отследить с помощью strace или truss , вот как использовать ] strace в Linux:

strace -tt -e trace=ioctl myprogram [...]

Большим преимуществом здесь является то, что strace с радостью декодирует различные параметры для системных вызовов за вас.

Ничто из вышеперечисленного не скажет вам много логически о том, где в программе может возникнуть проблема, для этого у вас есть два варианта: отладчик или внедрение DLL.

В gdb вы можете легко установить точку останова на tcsetattr () , а затем проверить стек вызовов, но это может быть утомительно, если вызовов много (и потребуется отладочная сборка или символы для libc для получения наилучших результатов).

Наиболее полный вариант (при условии, что целевая программа динамически связана) - это внедрить вашу собственную DLL, которая перехватывает или обертывает функции, которые вам нужно отслеживать, в данном случае tcsetattr () .

#define _GNU_SOURCE
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <dlfcn.h>
#include <unistd.h>
#include <termios.h>

/* 
 * gcc -nostartfiles -shared -ldl -Wl,-soname,tcsetattr -o tc.so wraptc.c
 * LD_PRELOAD=./tc.so stty -icanon ixon
 *
 */

#define DEBUG 1
#define dfprintf(fmt, ...) \
    do { if (DEBUG) fprintf(stderr, "[%14s#%04d:%8s()] " fmt, \
          __FILE__, __LINE__, __func__, __VA_ARGS__); } while (0)


typedef int tcsetattr_fp(int fd, int optional_actions, 
                     const struct termios *termios_p);
static tcsetattr_fp    *real_tcsetattr;

void _init()
{
    dfprintf("It's alive!\n","");
    real_tcsetattr = dlsym(RTLD_NEXT, "tcsetattr");
    dfprintf("Hooked %p tcsetattr()\n",(void *)real_tcsetattr);
}

int tcsetattr(int fd, int optional_actions, const struct termios *termios_p)
{
     void *bt[20];
     size_t btsz;

     int rc,stacktr=0;
     dfprintf("Caught tcsetattr(%i,%04x,...)\n",fd,optional_actions);

     if ( (fd==0) && !((termios_p->c_lflag) & ICANON)) {
         dfprintf("ICANON off!\n","");
         stacktr=1;
     }
     if ( (fd==0) && !((termios_p->c_iflag) & IXON)) {
         dfprintf("IXON off!\n","");
         stacktr=1;
     }
     if (stacktr) {
         btsz=backtrace(bt,sizeof(bt));
         backtrace_symbols_fd(bt,btsz,STDERR_FILENO);
     }

     rc=real_tcsetattr(fd,optional_actions, termios_p);
     return rc;
}

Скомпилируйте и вызовите, как указано в комментариях. Этот код находит настоящую функцию libc tcsetattr () и содержит альтернативную версию, которая используется вместо нее. Этот код вызывает backtrace () , когда видит, возможно, интересную активность на FD 0, а затем вызывает настоящую версию libc. Может потребоваться небольшая настройка.

4
27.01.2020, 21:19

Теги

Похожие вопросы