🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.os.linux.programowanie
Article #72977

Re: EINTR - sztuczne generowanie

#72977
From: michal.lyszczek
Date: Tue, 20 Oct 2020 00:54
62 lines
3517 bytes
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  |
`----------------------^--------------^---------------------^------------------'
Technical Details
Message-ID: <20201020005422.zpndxr3qnfj4spgf@marchewa.redembedded.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.samoylyk.net!aioe.org!.POSTED.4PHeMypZJvouH5WiyukIuw.user.gioia.aioe.org!not-for-mail
References: <rj9vh2$6it$1@dont-email.me> <20200909101830.2170cf7b@mateusz> <rja571$iqs$1@dont-email.me> <20200909110259.71e9e233@mateusz> <rja9ak$li8$1@dont-email.me>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.samoylyk.net!aioe.org!.POSTED.4PHeMypZJvouH5WiyukIuw.user.gioia.aioe.org!not-for-mail
From: michal.lyszczek@bofc.pl
Newsgroups: pl.comp.os.linux.programowanie
Subject: Re: EINTR - sztuczne generowanie
Date: Tue, 20 Oct 2020 02:54:22 +0200
Organization: Aioe.org NNTP Server
Lines: 103
Message-ID: <20201020005422.zpndxr3qnfj4spgf@marchewa.redembedded.pl>
References: <rj9vh2$6it$1@dont-email.me> <20200909101830.2170cf7b@mateusz> <rja571$iqs$1@dont-email.me> <20200909110259.71e9e233@mateusz> <rja9ak$li8$1@dont-email.me>
NNTP-Posting-Host: 4PHeMypZJvouH5WiyukIuw.user.gioia.aioe.org
Mime-Version: 1.0
X-Complaints-To: abuse@aioe.org
User-Agent: NeoMutt/20180716
X-Notice: Filtered by postfilter v. 0.9.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit