Bijwerken
Ik vond de regel in debug.c die in de OP wordt genoemd en we kunnen zien aan de twee regels boven deze code:
redisLog(REDIS_WARNING,"(forcing SIGSEGV to print the bug report.)");
en dezelfde code is te vinden in _redisPanic
ook, dus het lijkt op hun manier om een SIGSEGV
. te forceren wanneer een bewering faalt of er is paniek.
Origineel
Dit ziet eruit als een debugging-tool, we kunnen zien in dit document Redis debugging guide en de relevante sectie zegt:
Redis heeft een commando om een segmentatiefout (met andere woorden een slechte crash) te simuleren met behulp van het DEBUG SEGFAULT commando (gebruik het natuurlijk niet tegen een echte productie-instantie;)). Dus ik gebruik deze opdracht om mijn instantie te laten crashen om te laten zien wat er gebeurt in de GDB-kant:
en toont deze gdb-uitvoer:
(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';
^^^^^^^^^^^^^^^^^^^
Wat het doet is het casten van -1
aan een *char ** en er vervolgens indirectheid op uitvoeren en 'x'
. toewijzen naar die geheugenlocatie. Als de thread die alk heeft gelinkt Is ((void *) -1) een geldig adres? zegt dat het op de meeste systemen niet geldig is om toegang te krijgen, laat staan een waarde toe te kennen. Dit genereert een segmentatiefout op de meeste moderne besturingssystemen.
Dit is ongedefinieerd gedrag en zoals in de thread is besproken. Wat is de eenvoudigste standaard conforme manier om een Segfault in C te produceren? er kan niet op worden vertrouwd. Compilers worden steeds slimmer en er zijn enkele bekende voorbeelden waarbij de compiler slim is in het misbruiken van ongedefinieerd gedrag op onverwachte en slechte manieren.