Article View: pl.comp.os.linux.programowanie
Article #72977Re: EINTR - sztuczne generowanie
From: michal.lyszczek
Date: Tue, 20 Oct 2020 00:54
Date: Tue, 20 Oct 2020 00:54
62 lines
3517 bytes
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-mailReferences:
<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