Segmentasyon Hatası Nedir?
Segmentasyon hatası veya erişim ihlali ( segfay kısacası), hafıza korumalı donanım tarafından ortaya çıkan ve yazılımın sınırlı bir hafıza alanına erişmeye çalıştığı işletim sistemini uyaran bir arıza durumu veya arızadır (bellek erişim ihlali).
Standart x86 sistemlerinde genel bir koruma arıza formudur. Buna yanıt olarak, işletim sisteminin çekirdeği genellikle birkaç düzeltici işlem uygulayacak ve genellikle bu hatayı, işleme bir sinyal aktararak rahatsız edici işleme aktaracaktır.
Bazı durumlarda, işlemler bir sinyal işleyici yükleyerek kendi başlarına kurtarma yapmalarına izin verebilir, ancak aksi takdirde işletim sisteminin varsayılan sinyal işleyicisi kullanılır, bu da genellikle işlemin anormal şekilde sonlandırılmasına ve bazen çekirdek dökümüne yol açar.
- Segmentasyon hataları, birçok dilde belirtilen programlarda temel bir hata sınıfıdır. C düşük seviyeli hafıza erişimi sunan ve bazı güvenlik kontrollerini bilen bir dil.
- Bunlar öncelikle sanal bellek adreslemesi için kullanılan işaretçilerdeki birçok hatadan, özellikle yasa dışı erişimden kaynaklanır.
- Diğer bellek erişim hatası türleri şunlardır: otobüs hatası , aynı zamanda çeşitli nedenleri de içerir.
- Bunlar öncelikle hatalı fiziksel bellek adreslemesi veya yanlış hizalanmış bellek erişimi nedeniyle ortaya çıkar.
- Bunlar, işlemin adreslemesine izin verilmeyen referanslar yerine donanımın adresleyemediği bazı bellek referanslarıdır.
- Çeşitli programlama dilleri, bölümleme hatalarını önlemek ve bellek güvenliğini geliştirmek için oluşturulan mekanizmaları uygulayabilir. Örneğin, the Pas programlama dili hafıza güvenliğini sağlamak için sahiplik bazlı bir model uygulamaktadır. Gibi başka bir dil Java Ve Lisp bölümleme hatalarına neden olabilecek birçok bellek hatası sınıfını yok sayan çöp toplama işlemini uygular.
Segmentasyon Hatasına Genel Bakış
- Herhangi bir program, kendisine izin verilmeyen bir bellek konumuna erişmeye çalıştığında veya izin verilmeyen bir şekilde bir bellek konumuna erişmeye çalıştığında (örneğin, salt okunur bir konuma yazmaya çalışmak veya işletim sistemi bölümü).
- Hesaplamada, kelime 'segmentasyon' çeşitli kullanımları vardır. Segmentasyon hatası şeklinde, 1950'den beri kullanılan bir kelime, programın adres alanını tanımlar, hafıza koruması ile programın sadece adres alanı okunabilir ve bunun sadece yığın ve veri segmenti okuma-yazma kısmı programın yazılabilir özelliği vardır. Bu nedenle, programın adres alanı dışında okumaya çalışmak veya adres alanının salt okunur kısmına yazmak bir segmentasyon hatasıyla sonuçlanır.
- Donanım, var olmayan bir bölüme, bölüm sınırlarının dışındaki bir konuma veya bellek bölümlendirmesini kullanan sistemlerde bölüm için verilen izinlerin izin vermediği tarzda bir konuma gönderme girişiminde bulunursa, bölümleme hatası ortaya çıkar. sanal bellek sağlamak için donanım.
- Genellikle geçersiz sayfa hatası, yalnızca sayfalamayı kullanan sistemlerde bölümleme hatasına neden olur. Sayfa hataları ve bölümlendirme hatalarının her ikisi de sanal bellek yönetim sisteminden kaynaklanan hatalardır. Ayrıca sayfa hatalarından bağımsız olarak segmentasyon hatası da meydana gelebilir; Geçerli herhangi bir sayfaya yasadışı erişim, segmentasyon hatasıdır. Segmentasyon hatası sayfanın ortasında görünebilir. İçinde arabellek taşması bir sayfada bulunan ancak örneğin yasa dışı olarak belleğin üzerine yazan.
- Arızanın ilk etapta kaynaklandığı MMU ( bellek yönetim birimi ) bellek koruma özelliğinin bir parçası olarak yasa dışı erişim veya donanım düzeyinde geçersiz sayfa hatası nedeniyle. Sorun geçersiz bir mantıksal adres değil de geçersiz bir fiziksel adresse, veri yolu hatası ortaya çıkar. Yani bunlar her zaman ayırt edilemiyor.
- Bu hata bulunur ve sorun yaratan işleme bir sinyal gönderilerek, bu sinyal için işlemin işleyicisi işletim sistemi düzeyinde etkinleştirilir. Farklı işletim sistemi türleri, bir segmentasyon hatasının ortaya çıktığını belirten farklı sinyal adlarına sahiptir.
- Olarak bilinen bir sinyal SIGSEGV (kısa segmentasyon ihlali ) Unix benzeri işletim sistemlerinde sorun yaratan işlemlere aktarılır. Sorunlu süreç bir istisnaya sahiptir, yani: STATUS_ACCESS_VIOLATION Microsoft Windows'ta.
Segmentasyon Hatasının Nedenleri
Bir segmentasyon hatasının ortaya çıktığı koşullar ve kendini nasıl gösterdiği, işletim sistemi ve donanıma özeldir. Farklı donanımlar çeşitli durumlarda farklı hatalar ortaya çıkar ve farklı işletim sistemleri bunları süreçlere gönderilen farklı sinyallere dönüştürür.
Altta yatan neden birkaç çeşit yazılım hatası olmasına rağmen, ortaya çıkacak neden bir bellek erişim ihlali olabilir. Bir hatanın hatasını ayıklamak veya temel nedene karar vermek, programın sürekli olarak segmentasyon hatasına yol açacağı birkaç durumda kolay olabilir. Bununla birlikte, diğer durumlarda çantanın çoğaltılması zor olabilir ve her çalıştırmada hafıza tahsisine güvenilebilir.
Segmentasyon hatasının birkaç tipik nedeni aşağıdadır:
- Var olmayan bir bellek adresine erişmeye çalışmak (işlemin adres alanının dışında)
- Bir programın haklarına sahip olmadığı belleğe erişmeye çalışmak (örneğin çekirdek yapıları süreç bağlamında)
- Salt okunur bellek yazmaya çalışılıyor (örneğin kod bölümü )
- Buna karşılık bunlar genellikle geçersiz bellek erişimiyle sonuçlanan birçok programlama hatasından kaynaklanır:
- Doğru şekilde derlenmeyen bir programı çalıştırmaya çalışmak. (Birkaç derleyici, derleme zamanı hatalarının varlığına bakılmaksızın yürütülebilir bir dosyayla sonuçlanacaktır.)
- Yığın taşması
- Arabellek taşması
- Serbest bırakılmış bir işaretçiye atama veya referansı kaldırma (bir sarkan işaretçi , silinen/tahsisi kaldırılan/serbest bırakılan belleği belirtir)
- Bir şeye atama veya referansı kaldırma başlatılmamış işaretçi (A vahşi işaretçi rasgele bellek adresini belirtir)
- Bir referanstan vazgeçme boş işaretçisi genellikle sürecin adres alanının parçası olmayan bir adresi belirtir
Segmentasyon hataları genellikle işaretçinin kullanımındaki hatalardan dolayı ortaya çıkar. C dinamik bellek ayırma C kodunda. Bir referanstan vazgeçme boş işaretçisi Tanımsız davranışla sonuçlanan bir bölümleme hatasına yol açacaktır. Bunun nedeni, geçerli bir bellek adresi olamayacak bir boş işaretçidir. sarkan işaretçiler Ve vahşi işaretçiler var olan veya olmayan, yazılabilir veya okunamayan ve dolayısıyla geçici hatalara neden olabilecek bir belleği belirtir.
Ubuntu'daki segmentasyon hatasını çözün
Bu hata herhangi bir noktada Ubuntu sistemimizi etkileyebilir. Segmentasyon hatası, sistemimizin mevcut olmayan herhangi bir bellek sayfasına erişmeye çalışmasıdır. Çekirdek boşaltıldı bir kod bölümünün ücretsiz veya salt okunur bir konumda yazma ve okuma işlemi gerçekleştirmeye çalıştığını tanımlar. Genel olarak, segfay'lar core adlı bir dosyayla ilişkilendirilir ve yükseltme sırasında gerçekleşir.
Çekirdek dökümü durumu sırasında birkaç komutu çalıştırırken aşağıdaki durumla karşılaşabiliriz: 'Kilit dosyası açılamıyor' hata. Bunun nedeni sistemin mevcut olmayan bir blok parçasını almaya çalışmasıdır. Bunun nedeni birkaç özel programın ikili dosyalarının çökmesidir.
Bunu çözmek için hata ayıklama veya geri izleme yapıyor olabiliriz ancak çözüm, aşağıda belirtilen bazı adımları uygulayarak bozuk paketleri düzeltmektir:
npm önbelleği temizle
1. Farklı konumlarda bulunan kilit dosyalarını kaldırın.
$ sudo rm -rvf /var/lib/apt/lists/lock /var/cache/apt/archives/lock /var/lib/dpkg/lock and restart our system
2. Depo önbelleğini kaldırma.
$ sudo apt-get clean all
3. Depo önbelleğimizi yükseltin ve güncelleyin.
$ sudo apt-get update
$ sudo apt-get upgrade
4. Şimdi dağıtımımızı yükseltin, paketlerimiz güncellenecektir.
$ sudo apt-get dist-upgrade
5. Kırılan paketleri arayın ve kuvvetlice çıkarın.
$ sudo dpkg -1 | grep ^..r | apt-get purge
Her zaman işe yarayacak harika bir yol, komut satırı dışında aşağıdaki gibidir:
- Başlangıç modunda, Ubuntu'yu tıklatarak çalıştırın. Esc Yeniden başlatmanın ardından tuşuna basın.
- Seçmek ' Ubuntu için gelişmiş seçenekler
- Kurtarma modunda Ubuntu'yu çalıştırın; birkaç seçenekten bahsedeceğiz.
- İlk önce şunu seçin: 'Bozuk paketleri onarın'
- Daha sonra şunu seçin: 'Normal önyüklemeye devam et'
Artık segmentasyon hatasını (GUI ve CLI) çözmenin iki yolu var. Bazen komutun, yani apt'nin çalışmaması nedeniyle de gerçekleşebilir. segfay , bu nedenle CLI yöntemi uygulanmayacaktır. Bu durumda endişelenmeyin çünkü GUI yöntemi her zaman işimize yarayacaktır.
Segmentasyon Hatasını İşleme
Bir veri yolu hatası veya bölümleme hatası için varsayılan görev, onunla karşılaşan bir işlemin anormal şekilde sonlandırılmasıdır. Hata ayıklamaya yardımcı olmak için bir çekirdek dosya oluşturulabilir ve platforma bağlı diğer görevler de uygulanabilir. Örneğin, birçok Linux sistemi bunu uyguluyor grgüvenlik yaması günlüğe kaydedebilir SIGSEGV sinyalleri arabellek taşmalarıyla olası izinsiz giriş girişimlerini izlemek için.
Windows ve Linux gibi birkaç sistemde, bir programın segmentasyon hatasını kendisinin yönetmesi mümkündür. Çalışan program yalnızca olayı yönetmekle kalmaz, aynı zamanda işlemci kaydının değerleri, yığın izlemesi alma, karşılaşıldığı andaki kaynak kodu satırı, geçersiz olarak erişilen bellek adresi gibi durumuyla ilgili birkaç ayrıntıyı çıkarabilir ve işletim sistemine ve mimariye bağlı olarak görevin yazma mı yoksa okuma mı olduğu.
Bununla birlikte, segmentasyon hatası, bir programın düzeltilmesi gereken bir hataya sahip olduğunu tanımlar; ayrıca test amacıyla, hata ayıklama amacıyla bu tür bir hataya kasıtlı olarak neden olmak ve ayrıca belleğe doğrudan erişimin gerekli olduğu platformları taklit etmek de mümkündür. İkinci durumda hata oluştuktan sonra bile sistem programın çalışmasına izin verebilmelidir.
arama motoru ve örnekler
Bu durumda sistem izin verdiğinde olayı yönetmek ve işlemci program sayacını geliştirmek mümkündür. 'zıplamak' yürütmeye devam etmek için başarısız talimat üzerine.
Segmentasyon hatası örnekleri
Salt okunur belleğe yazma
Bir segmentasyon hatası ortaya çıkar. Program kendi kod bölümünün bir kısmına veya veri bölümünün salt okunur kısmına kod hata seviyelerinde yazdığında ortaya çıkar çünkü bunlar işletim sistemi aracılığıyla salt okunur belleğe yüklenir.
Boş işaretçi referansı
C ve diğer C benzeri dillerde, boş işaretçiler anlam için kullanılır 'hiçbir nesneye işaret etme' ve hata göstergesi olarak ve boş işaretçideki referansın kaldırılması (boş işaretçiden yazma veya okuma) çok temel bir program hatasıdır.
Standart, boş işaretçinin 0 bellek adresi işaretçisine benzer olduğunu söylemez, ancak durum böyle olabilir. Hemen hemen tüm işletim sistemleri, boş işaretçinin adresini, bunun kullanılması segmentasyon hatasına yol açacak şekilde eşler.
Bu davranış herhangi bir C standardı tarafından garanti edilmez. C'de boş işaretçinin referansının kaldırılması, tanımlanmamış davranış ve uyumlu bir uygulamanın, referansı kaldırılan bir işaretçinin boş olmadığını varsaymasına izin verilir.