Visual C++ projesindeki bellek hatalarını algılamak için PageHeap yardımcı programını kullanma
Bu makalede, Microsoft Visual C++ projelerindeki bellek hatalarını algılamak için PageHeap yardımcı programının nasıl kullanılacağı açıklanır. Bu makaledeki bilgiler yalnızca yönetilmeyen Visual C++ kodu için geçerlidir.
Orijinal ürün sürümü: Visual C++
Özgün KB numarası: 264471
Özet
PageHeap yardımcı programı, tüm malloc
, new
ve heapAlloc
ayırmalarının bellek hataları için otomatik olarak izlenmesi için uygulamalar için etkinleştirilebilir.
PageHeap1 , çeşitli bellek hataları içeren bir Visual C++ projesidir. Bu örnek uygulamada PageHeap'ı etkinleştirmek için komut satırından aşağıdaki içeriği yazın:
pageheap /enable pgh.exe 0x01
Ardından, aşağıdaki içeriği yazın:
pageheap
Not
PageHeap tarafından izlenen uygulama adı.
Birçok uygulama için 0x01
ihtiyacınız olan tek bayraktır. Komut satırından soru işareti bayrağıyla (/?
) PageHeap komutunu çalıştırarak kullanımı hakkında daha fazla bilgi edinebilirsiniz.
PageHeap nasıl çalışır?
PageHeap, 8 baytlık sınırlarda ayrılan belleğin işaretçisini döndürür. Döndürülen işaretçinin sonuna 0 ile 7 koruma baytı eklenir (istenen boyuta bağlı olarak, istek boyutunu 8 baytlık bir sınıra yuvarlamak için 0 bayt ile 7 bayt eklenir) ve ardından işaretlenmiş PAGE_NOACCESS
bir bellek sayfası (daha fazla bilgi için bkz. VirtualAlloc). Örneğin:
char * p;
p = new char[5];
PageHeap, toplam 8 bayt oluşturmak için 5 bayt artı üç koruma baytlık bir işaretçi döndürür..... XXX. Bellek ayırma boyutu sekizin katıysa, döndürülen işaretçiye koruma baytları eklenmez.
Ayırmanın sonunun üzerine yazılırsa, koruma baytları değişir ve bellek serbestken PageHeap Erişim İhlali hatasına neden olur. Uygulama ayırmayı (koruma baytları dahil) okur veya yazarsa, anında Erişim İhlali hatasına neden olur.
PageHeap1 örneğini kullanma
pgh projesini oluşturun ve pgh.exe çalıştırın.
Not
PageHeap'in veya
malloc
ilenew
çalışması için bir yayın derlemesi yapmanız gerekir.PageHeap1.exe başlatın. Bir iletişim kutusu açılır penceresi vardır.
İletişim kutusunda bir TextBox, Hatalı Ayırma/Ücretsiz onay kutusu ve üç düğme çifti, yeni & silme, PageAlloc & YığınSız ve COM Silme & com yenilerini görebilirsiniz. TextBox, ayırmak istediğiniz bellek boyutunu alır. Hatalı Ayırma/Serbest onay kutusu seçiliyse, her ayırma türü (yeni, PageAlloc ve COM yeni) bellek ayırır ve ayırmayı geçmişe yazar. Hatalı Ayırıcı işaretlenmezse, hiçbir bellek üzerine yazma işlemi gerçekleşmez.
Düğme yeni işlecini test ediyor
new
, Button PageAlloc testleriHeapAlloc
. COM yenisi'ni kullanmazCoTaskMemAlloc
, yalnızca çağıran bir COM Dinamik bağlantı kitaplığına (DLL) çağrırnew
. COM'u yeni test etmek için r1LeakMemMod.dll kaydetmeniz veya r1LeakMemMod projesini oluşturmanız gerekir.PageHeap'in çalışması için bir çalışma zamanı DLL kitaplığı kullanabilirsiniz. (Visual C++ Tümleşik Geliştirme Ortamından (IDE), Projeler>Ayarlar>C++>Kategori: Kod Oluşturma>Çalışma zamanı kitaplığını kullanın).
Hatalı Alloc/Free kutusunu işaretledikten sonra, bellek ayırma boyutu 5 bayt ise yeni düğmeyi seçin, 5 bayt bellek ayrılır ve 0 altıncı bayta yazılır. Altıncı bayta yazmak geçersiz bir bellek üzerine yazma işlemidir, ancak bir koruma baytında oluşur, bu nedenle PageHeap bellek silinene kadar bu hatayı algılamaz. Sil düğmesini seçtiğinizde PageHeap üzerine yazmayı algılar ve aşağıdaki örneğe benzer bir hata iletisi kutusu görürsünüz:
Özel durum Kesme noktası A kesme noktasına ulaşıldı. (0x80000003) uygulamada 0x77f9f9df konumunda oluştu.
Visual C++ tam zamanında (JIT) hata ayıklayıcısı olarak belirtilmişse İptal düğmesini seçebilir ve kodda hata ayıklayabilirsiniz.
Ayırma boyutunu 8 (veya 8'in herhangi bir katı) olarak değiştirirseniz, yeni, pageAlloc veya COM Yeni düğmeleri seçildiğinde erişim izni olmayan bir adrese yazdığınız için anında Erişim İhlali hatası oluşur. (yani hatayı algılamak için belleği silmeniz gerekmez).
Not
- Sınırlamalar: PageHeap yalnızca aileden gelen bellek hatalarını
malloc
bulabilir (bu nedenle C++ işlecinew
) veheapAlloc
. Birçok uygulama özel ayırıcılar kullanır ve PageHeap bu ayırmaları kesemez. - Bir uygulamayı test etme işlemini tamamladığınızda, bu uygulama için PageHeap'ı kapatmak için komut satırından komutunu çalıştırın
pageheap /disable <appName>
. - PageHeap etkin uygulamalar, PageHeap etkinleştirilmeden aynı uygulamadan çok daha fazla bellek tüketebilir. Artan bellek talebini karşılamak için değiştirme dosyanızı artırmanız gerekebilir.
Pageheap1vcnet.exe buradan indirebilirsiniz. Microsoft destek dosyalarını indirme hakkında daha fazla bilgi için bkz. çevrimiçi hizmetler Microsoft destek dosyalarını edinme.
Microsoft bu dosyayı virüsler için taradı. Microsoft, dosyanın yayımlandığı tarihte kullanılabilen en güncel virüs algılama yazılımını kullandı. Dosya, dosyada yetkisiz değişikliklerin önlenmesine yardımcı olan, güvenliği iyileştirilmiş sunucularda depolanır.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin