Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > pl.comp.os.linux.programowanie > #2230 > unrolled thread

EINTR - sztuczne generowanie

Started byheby <heby@poczta.onet.pl>
First post2020-09-09 09:16 +0200
Last post2020-09-10 10:00 +0000
Articles 9 — 4 participants

Back to article view | Back to pl.comp.os.linux.programowanie


Contents

  EINTR - sztuczne generowanie heby <heby@poczta.onet.pl> - 2020-09-09 09:16 +0200
    Re: EINTR - sztuczne generowanie Mateusz Viste <mateusz@xyz.invalid> - 2020-09-09 10:18 +0200
      Re: EINTR - sztuczne generowanie heby <heby@poczta.onet.pl> - 2020-09-09 10:53 +0200
        Re: EINTR - sztuczne generowanie Mateusz Viste <mateusz@xyz.invalid> - 2020-09-09 11:02 +0200
          Re: EINTR - sztuczne generowanie heby <heby@poczta.onet.pl> - 2020-09-09 12:04 +0200
            Re: EINTR - sztuczne generowanie michal.lyszczek@bofc.pl - 2020-10-20 02:54 +0200
      Re: EINTR - sztuczne generowanie queequeg@trust.no1 (Queequeg) - 2020-09-09 10:03 +0000
        Re: EINTR - sztuczne generowanie Mateusz Viste <mateusz@xyz.invalid> - 2020-09-09 13:27 +0200
          Re: EINTR - sztuczne generowanie queequeg@trust.no1 (Queequeg) - 2020-09-10 10:00 +0000

#2230 — EINTR - sztuczne generowanie

Fromheby <heby@poczta.onet.pl>
Date2020-09-09 09:16 +0200
SubjectEINTR - sztuczne generowanie
Message-ID<rj9vh2$6it$1@dont-email.me>
Cześć.

Potrzebuję w celach testowych zasypać aplikację errorami EINTR. 
Aplikacja robi bardzo duzo operacji read/write i w ten sposób chciałbym 
zwiększyśc prawdopodobieństwo znalezienia miejsca bez obsługi EINTR.

Mam pid mojego procesu. W jaki sposób mogę spowodować że w procesie tym 
znacząco zwiększy się ilośc EINTR w przypadkowych miejscach?

Rozumiem że mam wysyłać sygnały do mojego procesu. Można to zrobic za 
pomocą kill? I jaki sygnał mam wysyłać? Dowolny? np SIGCONT albo SIGALRM 
będzie ok?

[toc] | [next] | [standalone]


#2231

FromMateusz Viste <mateusz@xyz.invalid>
Date2020-09-09 10:18 +0200
Message-ID<20200909101830.2170cf7b@mateusz>
In reply to#2230
2020-09-09 o 09:16 +0200, heby napisał:
> Potrzebuję w celach testowych zasypać aplikację errorami EINTR. 
> Aplikacja robi bardzo duzo operacji read/write i w ten sposób
> chciałbym zwiększyśc prawdopodobieństwo znalezienia miejsca bez
> obsługi EINTR.
> 
> Mam pid mojego procesu. W jaki sposób mogę spowodować że w procesie
> tym znacząco zwiększy się ilośc EINTR w przypadkowych miejscach?
> 
> Rozumiem że mam wysyłać sygnały do mojego procesu. Można to zrobic za 
> pomocą kill? I jaki sygnał mam wysyłać? Dowolny? np SIGCONT albo
> SIGALRM będzie ok?

To byłoby pewnie dobre, gdybyś chciał testować funkcje read(), write(),
send(), itp na okoliczność poprawnej obsługi sygnałów. Tobie jednak
zależy raczej na sprawdzeniu swojego własnego kodu, który jest klientem
tych funkcji. Ja zrobiłbym to tak:


ssize_t monkey_write(int fd, const void *buf, size_t cnt) {
  static int crazy_monkey;
  crazy_monkey ^= 1;
  if (crazy_monkey == 0) {
    errno = EINTR;
    return(-1);
  }
  return(write(fd, buf, cnt));
}

#define write monkey_write

(tutaj dalszy kod programu)


Mateusz

[toc] | [prev] | [next] | [standalone]


#2232

Fromheby <heby@poczta.onet.pl>
Date2020-09-09 10:53 +0200
Message-ID<rja571$iqs$1@dont-email.me>
In reply to#2231
On 09/09/2020 10:18, Mateusz Viste wrote:
> To byłoby pewnie dobre, gdybyś chciał testować funkcje read(), write(),
> send(), itp na okoliczność poprawnej obsługi sygnałów. Tobie jednak
> zależy raczej na sprawdzeniu swojego własnego kodu, który jest klientem
> tych funkcji. Ja zrobiłbym to tak:
> ssize_t monkey_write(int fd, const void *buf, size_t cnt) {

Wchodzi to w grę, ale wymaga ingerencji w kod. Ja zaś myślę nad 
*automatyzacją* zagadnienia na testach tak, aby sprawdzić nie tylko mój 
kod, ale i kod biblitek 3rd party na które nie mam do końca wpływu.

[toc] | [prev] | [next] | [standalone]


#2233

FromMateusz Viste <mateusz@xyz.invalid>
Date2020-09-09 11:02 +0200
Message-ID<20200909110259.71e9e233@mateusz>
In reply to#2232
2020-09-09 o 10:53 +0200, heby napisał:
> On 09/09/2020 10:18, Mateusz Viste wrote:
> > To byłoby pewnie dobre, gdybyś chciał testować funkcje read(),
> > write(), send(), itp na okoliczność poprawnej obsługi sygnałów.
> > Tobie jednak zależy raczej na sprawdzeniu swojego własnego kodu,
> > który jest klientem tych funkcji. Ja zrobiłbym to tak:
> > ssize_t monkey_write(int fd, const void *buf, size_t cnt) {  
> 
> Wchodzi to w grę, ale wymaga ingerencji w kod.

Niekoniecznie. Tzn. tak - wersja z monkey_write na pewno, ale można
wystrugać alternatywę w postaci własnej wersji write(), do wpięcia
podczas link time, zastępując tym samym read/write z libc. Ew.
podstawić swoje własne, zhackowane libc.

Opcja z kill oczywiście też wydaje się koszerna, ale trzeba będzie tym
killem ostro naparzać, żeby mieć szansę trafić w okienko kiedy
aplikacja akurat próbuje coś czytać/pisać... Niektóre krótkie operacje
mogą nigdy nie trafić w sygnał.

Mateusz

[toc] | [prev] | [next] | [standalone]


#2235

Fromheby <heby@poczta.onet.pl>
Date2020-09-09 12:04 +0200
Message-ID<rja9ak$li8$1@dont-email.me>
In reply to#2233
On 09/09/2020 11:02, Mateusz Viste wrote:
> killem ostro naparzać, żeby mieć szansę trafić w okienko kiedy
> aplikacja akurat próbuje coś czytać/pisać... Niektóre krótkie operacje
> mogą nigdy nie trafić w sygnał.

Przy dziesiątkach tysięcy testów/h non-stop takie "przypadki" pojawiają 
się nadspodziewanie często i mają jednocześnie brzydką cechę 
niewystepowania in vitro, kiedy podpinasz debugger.

Chcę takie narzędzie do naparzania EINTR po to, aby:
a) złapać je na testach
b) przyspieszyć łapanie lokalne, z debugiem.

[toc] | [prev] | [next] | [standalone]


#2246

Frommichal.lyszczek@bofc.pl
Date2020-10-20 02:54 +0200
Message-ID<20201020005422.zpndxr3qnfj4spgf@marchewa.redembedded.pl>
In reply to#2235

[Multipart message — attachments visible in raw view] — view raw

On 2020-09-09 12:04:00, heby wrote:
> On 09/09/2020 11:02, Mateusz Viste wrote:
> > killem ostro naparzać, żeby mieć szansę trafić w okienko kiedy
> > aplikacja akurat próbuje coś czytać/pisać... Niektóre krótkie operacje
> > mogą nigdy nie trafić w sygnał.
>
> Przy dziesiątkach tysięcy testów/h non-stop takie "przypadki" pojawiają się
> nadspodziewanie często i mają jednocześnie brzydką cechę niewystepowania in
> vitro, kiedy podpinasz debugger.
>
> Chcę takie narzędzie do naparzania EINTR po to, aby:
> a) złapać je na testach
> b) przyspieszyć łapanie lokalne, z debugiem.

Do takich rzeczy najlepiej zrobić sobie MOCKi. W C najprościej zrobić to
pisząc sobie osobną libkę np libmockread.so, i w kodzie libki zdefiniować
sobie symbol read() (z takimi samymi argumentami jak read(2)) i potem
wziąć wskaźnik na swojego stuba read() oraz wrapera z glibc read(2).
Np. coś takiego

    void *g_real_function = dlsym(RTLD_NEXT, read);
    /* mock funkcji read - przykryje ona read(2) z glibc */
    ssize_t read(int a0, void *a1, size_t a2) {
    	if (g_no_error) {
    		ssize_t (*real)(int, void *, size_t);
    		real = g_real_function;
    		return real(a0, a1, a2);
    	}
    	errno = EINTR;
    	return (ssize_t)-1;
    }

Potem skompilować libkę

    gcc -shared -fPIC -Wl,-soname,readmock.1 -o libreadmock.so readmock.c -lc -ldl

i zrobić preload na końcu

    LD_PRELOAD=./libreadmock.so ./unit-tests

W unit testach można sobie potem ustawiać g_no_error na 1 albo 0 w zależności
czy chcemy aby następny read(2) wywalił błąd.

<shameless-plug>
Też kiedyś stałem przed takim problemem aż w końcu napisałem sobie generator
co mi tworzy odpowiedni plik C z potrzebnymi mockami oraz prostym API
do konfigurowania kiedy i jaki błąd ma wystąpić (np EINTR dokładnie po 4
wywołaniu read(2)). A co najważniejsze, przy takim podejściu mozna testować
nie robiąć jakichkolwiek zmian w kodzie produkcyjnym

Program/libkę znajdziesz tutaj:
  https://libfo.bofc.pl/index.html
  https://git.bofc.pl/libfo/
</shameless-plug>

-- 
.-----------------.-------------------.---------------------.------------------.
| Michal Lyszczek | Embedded C, Linux |   Company Address   |  .-. open source |
| +48 727 564 419 | Software Engineer | Leszczynskiego 4/29 |  oo|  supporter  |
| https://bofc.pl `----.--------------: 50-078 Wroclaw, Pol | /`'\      &      |
| GPG FF1EBFE7E3A974B1 | Bits of Code | NIP:  813 349 58 78 |(\_;/) programer  |
`----------------------^--------------^---------------------^------------------'

[toc] | [prev] | [next] | [standalone]


#2234

Fromqueequeg@trust.no1 (Queequeg)
Date2020-09-09 10:03 +0000
Message-ID<1eed8657-10ca-4684-a383-fc7ff6908ec8@trust.no1>
In reply to#2231
Mateusz Viste <mateusz@xyz.invalid> wrote:

> ssize_t monkey_write(int fd, const void *buf, size_t cnt) {
>   static int crazy_monkey;

Hmm, jesteś pewien, że statyczne, ale lokalne zmienne, są inicjalizowane 
na 0?

Zawsze myślałem, że dotyczy to tylko globalnych zmiennych statycznych, ale 
teraz czytam i w sumie już nie wiem.

-- 
Jeśli będziesz tak lotny jak pszczółka
Tak silny jak niedźwiedź
Jeśli będziesz pracował jak koń
I do domu wracał tak zmęczony jak pies
Wtedy musisz pójść do weterynarza
Bo być może stałeś się już OSLEM.

[toc] | [prev] | [next] | [standalone]


#2236

FromMateusz Viste <mateusz@xyz.invalid>
Date2020-09-09 13:27 +0200
Message-ID<20200909132723.63eb392f@mateusz>
In reply to#2234
2020-09-09 o 10:03 +0000, Queequeg napisał:
> Mateusz Viste <mateusz@xyz.invalid> wrote:
> 
> > ssize_t monkey_write(int fd, const void *buf, size_t cnt) {
> >   static int crazy_monkey;  
> 
> Hmm, jesteś pewien, że statyczne, ale lokalne zmienne, są
> inicjalizowane na 0?

Tak.

> Zawsze myślałem, że dotyczy to tylko globalnych zmiennych
> statycznych, ale teraz czytam i w sumie już nie wiem.

Może w tych nowoczesnych wynalazkach z plusami coś się zmieniło, nie
wiem. Ja żyję w 1990 i dobrze mi tu.

ISO/IEC 9899:1990(E), rozdział 6.5.7:

"If an object that has static storage duration is not initialized
explicitly, it is initialized implicitly as if every member that has
arithmetic type were assigned 0 and every member that has pointer type
were assigned a null pointer constant."

Żadnych udziwnień typu "tak, ale tylko jeśli..." nie widzę.


Mateusz

[toc] | [prev] | [next] | [standalone]


#2242

Fromqueequeg@trust.no1 (Queequeg)
Date2020-09-10 10:00 +0000
Message-ID<db86c43f-6727-4f01-94d9-4cad2ef22da4@trust.no1>
In reply to#2236
Mateusz Viste <mateusz@xyz.invalid> wrote:

> Może w tych nowoczesnych wynalazkach z plusami coś się zmieniło,

Raczej nie, moje niedopatrzenie. W sumie bardzo rzadko używam static 
storage.

-- 
Zając dowiedział się że jego synowi ktoś w knajpie wybił wszystkie
zęby. Wchodzi do knajpy i mówi:
- Kto mojemu synowi wybił wszystkie żeby?
Wstaje niedźwiedź:
- Ja! Bo co?
- Ano, chciałem się spytać gdzie można znaleźć dobrego dentystę...

[toc] | [prev] | [standalone]


Back to top | Article view | pl.comp.os.linux.programowanie


csiph-web