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, newve 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

  1. pgh projesini oluşturun ve pgh.exe çalıştırın.

    Not

    PageHeap'in veya mallocile new ç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.

  2. İ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 testleri HeapAlloc. COM yenisi'ni kullanmaz CoTaskMemAlloc , yalnızca çağıran bir COM Dinamik bağlantı kitaplığına (DLL) çağrır new. 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).

  3. 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

  1. Sınırlamalar: PageHeap yalnızca aileden gelen bellek hatalarını malloc bulabilir (bu nedenle C++ işleci new) ve heapAlloc. Birçok uygulama özel ayırıcılar kullanır ve PageHeap bu ayırmaları kesemez.
  2. 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> .
  3. 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.