Opdater
Jeg fandt linjen i debug.c nævnt i OP, og vi kan se fra to linjer over denne kode:
redisLog(REDIS_WARNING,"(forcing SIGSEGV to print the bug report.)");
og den samme kode kan findes i _redisPanic
også, så det ligner deres måde at tvinge en SIGSEGV
på når en påstand mislykkes, eller der er panik.
Original
Dette ligner et fejlfindingsværktøj, vi kan se fra dette dokument Redis fejlretningsvejledning og det relevante afsnit siger:
Redis har en kommando til at simulere en segmenteringsfejl (med andre ord et dårligt nedbrud) ved hjælp af kommandoen DEBUG SEGFAULT (brug den ikke mod en rigtig produktionsinstans selvfølgelig;). Så jeg vil bruge denne kommando til at crashe min instans for at vise, hvad der sker i GDB-siden:
og viser dette gdb-output:
(gdb) continue
Continuing.
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0xffffffffffffffff
debugCommand (c=0x7ffc32005000) at debug.c:220
220 *((char*)-1) = 'x';
^^^^^^^^^^^^^^^^^^^
Det, den gør, er at caste -1
til en *char ** og derefter udføre indirektion på den og tildele 'x'
til denne hukommelsesplads. Som tråden der alk linkede Er ((void *) -1) en gyldig adresse? siger, at det på de fleste systemer ikke vil være gyldigt at få adgang til, endsige tildele en værdi til. Dette vil generere en segmenteringsfejl på de fleste moderne operativsystemer.
Dette er udefineret adfærd, og som det blev beskrevet i tråden. Hvad er den enkleste standardkonforme måde at producere en Segfault i C? det kan ikke stoles på. Compilere bliver klogere, og der er nogle berømte eksempler, hvor compileren er smart med at udnytte udefineret adfærd på uventede og dårlige måder.