Achtergronden
Moderne hardware voor algemeen gebruik bevat een “geheugenbeheerseenheid” (of MMU). Deze hardwarefunctie wordt door besturingssystemen als Linux gebruikt om geheugenbeveiliging toe te passen, d.w.z. om te voorkomen dat verschillende processen elkaars geheugen benaderen of wijzigen (behalve op een strikt gecontroleerde manier via specifieke API’s). Dit vereenvoudigt het oplossen van problemen en verhoogt de veerkracht, omdat processen zorgvuldig worden ingeperkt en van elkaar gescheiden.
Een “segmentation violation” signaal wordt verstuurd naar een proces waarvan de geheugen-beheerunit een poging heeft gedetecteerd om een geheugenadres te gebruiken dat niet van hem is.
Gemeenschappelijke oorzaak: programmeerfout
Als een proces probeert om geheugen te benaderen via een pointer die niet correct is geïnitialiseerd, of die wijst naar geheugen dat al eerder is gedetalloceerd, zal dit waarschijnlijk resulteren in een segfault. In dit geval treedt de segfault op bij een specifiek proces of binary, mogelijk onder specifieke omstandigheden.
Om dit soort segfaults op te lossen, begin met het toepassen van alle relevante service packs en onderhoudsupdates. Vervolgens, als het probleem nog steeds reproduceerbaar is met de huidige code, probeer dan een applicatie core dump te maken voor analyse. Details hierover zijn te vinden in TID 3054866 – Hoe applicatie core dumps te verkrijgen.
Als de problematische binary door Novell wordt geleverd als onderdeel van het product, open dan een serviceverzoek bij Novell Technical Services, en lever
- een beschrijving van de omstandigheden waaronder de core dump is gegenereerd,
- een supportconfig -v rapport voor het getroffen systeem (supportconfig home page), en
- het core dump bestand zelf, als het kleiner is dan 50 MB. Als het groter is, wacht dan tot de service aanvraag is toegewezen aan een engineer en werk dan samen met de engineer om het over te zetten.
Als de problematische binary is geleverd door een derde partij, neem dan contact op met de support afdeling van die partij voor assistentie.
Gemeenschappelijke oorzaak: niet passende binary en bibliotheken
Segfouten kunnen optreden bij processen die binary’s en gedeelde bibliotheken combineren die niet (volledig) compatibel zijn. Dit kan bijvoorbeeld gebeuren wanneer een bibliotheek wordt bijgewerkt op een manier die de ABI (application binary interface) van de bibliotheek wijzigt, maar het interne versienummer van de bibliotheek niet wordt bijgewerkt om dit weer te geven. Een binary die tegen een oudere versie van de bibliotheek is gebouwd, kan gaan segfouten als deze tegen de nieuwere versie wordt geladen.
Dit geval kan moeilijk te herkennen zijn, en er is geen stappenlijst om het op te lossen. Als dit geval wordt vermoed, zijn enkele dingen om te overwegen:
- Het systeem controleren op bestandscorruptie (b.v. met behulp van het rpm-verify.txt bestand in een supportconfig -v rapport)
- Het systeem controleren op instellingen die te maken hebben met gedeelde bibliotheken, zoals de /etc/ld.so.conf en /etc/ld.so.conf.d/* configuratie bestanden en de LD_LIBRARY_PATH en LD_PRELOAD omgevingsvariabelen.
- Het gebruik van het hulpprogramma objdump om de binary te controleren op een ingebouwde library search path override (RPATH).
Veel voorkomende oorzaak: hardware of hardware configuratie probleem
Wanneer segfaults vaak voorkomen, of met verschillende processen of zonder een duidelijk patroon, kan dit erop wijzen dat de hardware (geheugen subsysteem) van een systeem een probleem heeft, of dat de lage systeem configuratie instellingen niet juist zijn. Zie TID 3301593 – Linux systeem hangt of is instabiel voor meer informatie over hoe om te gaan met deze situatie.