AV (Access Violation) nedir, neden bu hatayı alırız ? (+50 Puan)
26-09-2017, Saat: 10:59 (Son Düzenleme: 26-09-2017, Saat: 11:02, Düzenleyen: Tuğrul HELVACI.)
Madem bölüm başlığı Access Violation olmuş, o halde "Access Violation nedir, neden sıklıkla bu hatayı alırız ?" diye de sormak ve mümkün mertebe bilmek gerekir öyle değil mi
Not: Detaylı anlatıma +50 puan vereceğim. Çünkü bu konu çok önemli. (Detaylı anlatımdan kastım, memory'nin durumu, process'lerin bellek kullanımları, sayfalama, sayfa kilitleri, page fault vb.)
Gerçekten ilgili/meraklı arkadaşlar için önerebileceğim bir kitaba Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol erişebilirsiniz.
26-09-2017, Saat: 11:22
Access Violation kavramını Türkçe'ye çevirirsek motomot çeviri ile karşılığı Erişim İhlali olur. Peki ne gibi bir erişim ihlali olabilir? sorusuna cevabımızı yine hatanın oluştuğu anda bize söylenilen cümleden yakalayabiliriz.
"access violation at address in module read of address"
Aynı adresten okuma yapılmaya çalışılan modülün adresine erişim ihlali olduğunu belirten bu mesaj, bizlere şunu anlatıyor. Uygulamanın kullandığı adres ve işaretlemeleri mükerrer kullanıma neden olacak şekilde zorlamak, hack, crack, korsan, malware yada virüs kodlarının erişim sağlamak için mevcut uygulamayı engelleyip aynı adreslere yönelik kullanımı sonucunda erişilmeye çalışılan modülün bize döndürdüğü hatadır.
Bu hatanın oluşmasındaki temel sorun yukarıda bahsettiğim gibi aynı adres/bilgi/içerik için birden fazla talep veya erişim yapılmasıdır. Bunun yanı sıra, işaret edilen bir adres olduğu halde adresin içinde herhangi bir verinin muhafaza edilmemesi de bu hatayı oluşturur. Yani bir nesneyi oluşturduğunuzu varsayarak gidip o nesneyi referans gösterip başka bir işlem yapmak istediğinizde sistem işaret ettiğiniz adreste bir muhatap bulamayacağı için size erişim ihlali diyecektir. Çözümü ise oldukça basit; oluşturmadığınız yada sonradan içinde veri olmayan bir adrese erişimi engellemek için önce varlığını kontrol etmeniz bu sorunla karşılaşmanızı engellemeye yetecektir. Yada usulüne uygun şekilde oluşturduğunuzdan emin olarak ilerleyeceksiniz ve ne zaman adrese erişip bir şeyler yazmak yada okumak isteyecekseniz, o zaman karşınızda bir muhatap olduğunu bilerek hareket edeceksiniz.
Bu hatayı sıklıkla Delphi'de görmemiz yada kullanıcıların bu şekilde izah etmesinin en büyük sebebi, piyasada kullanılan birçok masaüstü uygulamada Delphi'nin imzasının yatıyor olmasından kaynaklıdır. Aynı hataları VB üzerinde de görebilirsiniz. Hatta Microsoft'un bu konu ile ilgili haddinden fazla yardımcı içeriği bulunuyor.
26-09-2017, Saat: 14:05
Var olmayan bir forma erişmeye çalışırken alınan hata diye biliyorum
26-09-2017, Saat: 14:21
(26-09-2017, Saat: 14:05)Derbeder Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol Var olmayan bir forma erişmeye çalışırken alınan hata diye biliyorum
var olmayan nesne diyelim, neticede form da bir nesne.
26-09-2017, Saat: 17:18 (Son Düzenleme: 26-09-2017, Saat: 17:30, Düzenleyen: esistem. Sebep: Örnek )
Nesne demiyelimde, adres diyelim Abdullah bey oldukça güzel açıklamış aslında.
Var olmayan bir adresten veya programınızın kendisine ait olmayan bir adresten veri okumaya çalışmanız halinde zıbıdank diye "bana böyle bi bilgi gelmedi kardeş ne yapmaya çalışıyosun" şeklinde karşımıza çıkan meşhur hata.
En basit şekilde hataya ulaşmak için;
26-09-2017, Saat: 20:38
AV meselesini şöyle açıklayabilirim;
Yazılan kodun bellekte erişilmemesi gereken bir yere eriştiğinden olabilir veya adres referansları(nesneler içinde geçerli) yanlış tanımlanmış olabilir.
Genellikle yanlış bir belleğe işaret eden bir nesne referansından dolayı gerçekleşebilir.
26-09-2017, Saat: 20:52
Öncelikle sayfalamadan başlarsak,Modern işlemcilerin neredeyse artık tamamında sayfalama (paging) mekanizması vardır.Arm işlemcilerde 4-64k arasında intel işlemcilerde 4k ile 2Mb arasında olabilir ki genellikle sayfalar 4k olur.intel işlemcilerde adreslerin bir kısmı sayfa no bir kısmı da ofsetten oluşur ki intel işlemciler genelde adresi 3 parçaya ayırır.Yani bizim programlarda kullandığımız adresler gerçek adresler değildir,Sanal(mantıksal yada doğrusal da denebilir) adreslerdir.İntel işlemcilerde cr3 yazmacında sayfa tablosunun adresi yer alır.işletim sistemi sayfa tablosunu oluşturur ve adresi bu yazmaca yazar.Sayfa tablosunda sanal sayfa no,fiziksel sayfa no ,erişim durumları(okuma,yazma gibi) özellikler yer alır bu tablodaki özellikler işlemcilere göre değişebilir.Bir prosesin sanal adresleri ardışıldır ama fiziksel adresleri ardışıl olmak zorunda değildir ve her prosesin ayrı bir sayfa tablosu vardır.Sayfa tablosundan fiziksel noyu alan işlemci ofset değerini de ekleyerek gerçek adresi bulur. Sayfalama sisteminin bir prosesin bellekte tek başına çalıştığını sanması diğerlerinden ayrıştırılması,fragmentasyonu(hafıza boşluklarını) engellemek gibi faydaları vardır.Prosesler iki modda çalışabilir birincisi standart programlar için user mod,ikincisi aygıt sürücüleri ve kernel modulleri için kernel mod.User modda proses sadece kendi sayfalarına ulaşabilir,Kernel modda ise tüm sayfalara ulaşabilir.Ayrıca user modddaki proses kritik makine kodlarını kullanamazken kernel modda kullanır.User moddaki bir proses kernel mod bir sayfaya ulaşmaya çalışırsa page fault denilen içsel bir kesme oluşur ve acces violation hatası oluşur ve işletim sistemi prosesi hemen cezalandırır ve bir hata bilgisiyle sonlandırır.Ayrıca proses kendisine ait olmayan başka bir prosesin sayfasına user modda erişmeye çalışırsa yine aynı sonuç oluşur ve cezalandırılır.Fakat user moddaki bir proses sistem fonksiyonlarını kullanırken işletim sistemi onu fonksiyon sonlanana kadar kernel moda aldığı için sistem fonksiyonlarının izin verdiği ölçüde diğer proseslerin bilgisine erişebilir bu kez acces violation oluşmaz.Ayrıca son olarak bütün page fault kesmeleri kötü değildir özellikle windows'ta bir programın tamamı yüklenmez belleğe yalnızca kullanılan kısmı yüklenir fakat kullanılmayan kısımla ilgili bir talepte bulunduğumuzda yine bu kesme oluşur ve işletim sistemi eksik olan sayfaları yükler ve biz bir şey fark etmeden kullanmaya devam ederiz.Aklıma şimdilik gelenler bunlar.
27-09-2017, Saat: 00:12
Virtual memory'de çalışan process'in kendi sanal adres alanı dışında, başka bir adrese erişmeye kalktığında işlemcinin koruma mekanizması gereği bu hatayı alıyor olabiliriz.
Şöyle ki; Bir pointer değişken process'in adres alanı dışında bir hafıza bölgesini işaret ediyorsa ve biz bu alana erişmeye kalktığımızda bu hata meydana geliyor olabilir.
P^ := 31; // Project Project1.exe raised exception class $C0000005 with message 'access violation at 0x005c9c7f: write of address 0x0000000a'.
V := P^;   // Project Project1.exe raised exception class $C0000005 with message 'access violation at 0x005c9c7f: read of address 0x00000000'
Eğer PE içersindeki ImageBase($00400000) değeri dosyanın hafızaya yüklendikten sonra, hangi adresten başladığını belirtiyorsa, bu adres dışında başka bir adrese erişmeye kalktığımızdan mı kaynaklanıyor tam anlamadım.
P := Pointer($00400000);
V:= P^; // Hata yok.
P := Pointer($00300000);
V:= P^; //Project Project1.exe raised exception class $C0000005 with message 'access violation at 0x005c9d0e: read of address 0x00300000'
27-09-2017, Saat: 00:51
o değilde müşterinin karşısında bu hata çıktığında bize sorduğunda ne cevap veriyoruz
27-09-2017, Saat: 09:08 (Son Düzenleme: 27-09-2017, Saat: 09:14, Düzenleyen: yhackup.)
Düz mantık, Doğmamış çocuğa don biçmeye çalışırken alınan hata
Access Violation at address in module read of address = Hani çocuk yok ?
Bir diğer yandan bana bu sahneyi hatırlatan hata
(27-09-2017, Saat: 00:51)masteryoda Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol o değilde müşterinin karşısında bu hata çıktığında bize sorduğunda ne cevap veriyoruz
Kargoya yanlış adres vermişiz
Tek dizi içinde öncelik sırası belirleme (+10 puan) Abdullah ILGAZ 4 295 29-11-2017, Saat: 12:07
Bir Record'un içini doldurma (+20 puan) Tuğrul HELVACI 21 1.057 05-10-2017, Saat: 16:33
Windows Mesajlaşma Sistemi Hk. Soru (+10 Puan) Tuğrul HELVACI 21 972 08-09-2017, Saat: 13:55
Tarih: 19-02-2018, Saat: 09:00 Türkçe Çeviri: MCTR, Forum Yazılımı: MyBB.