Kullanım
heap [-s | -sortBySize] [-z | -zones] [-guessNonObjects] [-sumObjectFields] [-showSizes]
[-addresses all | <sınıf-örüntüsü>] [-noContent]
pid | kısmi-yürütülebilir-adı | bellek-grafiği-dosyası
Açıklama
heap, belirtilen sürecin yığın belleğinde (heap) şu anda tahsis edilmiş nesnelerin yanı sıra özet verileri de listeler. Nesneler; sınıf adı, türü (Objective-C, C++ veya CFType) ve ikili imajına (binary image) göre kategorize edilir. C++ nesneleri, nesnenin başlangıcından itibaren başvurulan vtable ile tanımlanır, bu nedenle çoklu kalıtım (multiple inheritance) kullanıldığında bu durum nesnenin tam sınıfını kesin olarak vermeyebilir.
Hedef süreç MallocStackLogging etkin olarak çalışıyorsa, heap, "<caller> içindeki <allocation-call>" biçimini kullanarak "nesne olmayan" tahsislerin türlerini tanımlamaya çalışır. <caller>, bir "tahsis işlevini" (malloc, calloc, realloc, C++ "operator new", strndup, libc++.1.dylib dosyasının çeşitli dahili işlevleri vb.) çağıran işlevin sembol adını bulmak için tahsis yığını geri izleme (allocation stack backtrace) kaydı (varsa) boyunca yukarı doğru gidilerek belirlenir. Eğer <caller> bir C++ işlevi ise, tür adı; dönüş türü, llvm'in libc++abi.dylib kullanımından kaynaklanan "__1::" alt dizeleri ve "std::__1::allocator<T>" gibi standart argümanlar çözümlenmiş (demangled) sembol adından temizlenip basitleştirilerek oluşturulur.
Örneğin, bu tür bilgisi:
malloc in std::basic_string
şu geri izleme (backtrace) kaydından belirlenir:
_malloc_zone_malloc (in libsystem_malloc.dylib)
operator new(unsigned long) (in libc++abi.dylib)
std::__1::basic_string<char, std::__1::char_traits
::basic_stringstd::nullptr_t(char const*) (in Metal) ...
Bir sınıf için tanımlanan ikili imaj (binary image), sınıfı uygulayan imajdır. Tahsis geri izlemelerinden türetilen türler için ikili imaj, <caller>'ın imajıdır.
Seçenekler
heap tek bir argüman gerektirir; bu incelenecek sürecin kimliği (PID), sürecin tam veya kısmi yürütülebilir dosya adı ya da leaks veya Xcode Bellek Grafiği Hata Ayıklayıcısı (Xcode Memory Graph Debugger) tarafından üretilen bir bellek grafiği dosyasının yolu olabilir.
Aşağıdaki seçenekler mevcuttur:
-s | -sortBySize Çıktıyı, sayı yerine sınıf örneklerinin (class instances) toplam boyutuna göre sıralar. -addresses modunda çıktıyı tahsis boyutuna göre sıralar.
-z | -zones Tüm bölgelerin toplu bir özeti yerine, çıktıyı farklı malloc bölgelerine (zones) ayrılmış olarak gösterir.
-H | -humanReadable İnsan tarafından okunabilir (human-readable) çıktı. Boyutlar için taban olarak 2'yi kullanarak basamak sayısını üçe veya daha aza indirmek için K, M, G ve T birim eklerini kullanır.
-guessNonObjects malloc ile tahsis edilmiş bloklara (nesne olmayanlar) işaret eden göstergeleri (pointers) bulmak için her Objective-C nesnesinin bellek içeriğini tarar (örneğin bir NSArray'den sarkan değişken dizi gibi). Bu başvurulan bellek blokları, nesnenin başlangıcından itibaren olan ofsetleri olarak tanımlanır (örneğin "__NSCFArray[12]"). Çıktıda, her farklı nesne ofset konumundan başvurulan bellek bloklarının sayısı, bayt miktarı ve ortalama boyutu listelenir.
-sumObjectFields -guessNonObjects seçeneğiyle aynı analizi gerçekleştirir, ancak başvurulan bu nesne dışı alanların boyutlarını ilgili nesnelerin girdilerine ekler.
-showSizes Tek bir girdide boyutları toplayıp ortalamasını almak yerine, her nesne için her bir malloc boyutunun dağılımını gösterir.
-diffFrom=<memgraph> Yalnızca belirtilen bellek grafiğinden (memgraph) bu yana yeni oluşan nesneleri gösterir.
-addresses all | <sınıf-örüntüsü> Yığın belleğinde (heap) bulunan tüm malloc bloklarının adreslerini artan adres sırasına göre veya tam sınıf adı <sınıf-örüntüsü> düzenli ifadesiyle (regular expression) eşleşen nesnelerin adreslerini yazdırır. "all" dizesi tüm blokların adreslerinin yazdırılması gerektiğini belirtir.
—-sortBySize seçeneğiyle birleştirildiğinde, malloc bloklarını azalan boyut sırasına göre yazdırır.
<sınıf-örüntüsü> düzenli ifadesi, re_format(7) kılavuz sayfasında açıklandığı gibi genişletilmiş (modern) bir düzenli ifade olarak yorumlanır. Belirli bir türe ait olmayan blokları ifade etmek için "malloc" veya "non-object" kullanılabilir. Geçerli sınıf örüntüsü örnekleri şunları içerir: __NSCFString 'NS.' '__NSCFString|__NSCFArray' '.(String|Array)' malloc non-object malloc|.*String
<sınıf-örüntüsü> deseni, aşağıdaki biçimlerden biri olabilen isteğe bağlı bir tahsis boyutu belirleyici ile takip edilebilir. Köşeli parantezler zorunludur. Boyut, kilobayt için bir 'k' eki veya megabayt için bir 'm' eki içerebilir: [boyut] [altSınır-üstSınır] [altSınır+] [-üstSınır]
Boyut belirtimlerine sahip <sınıf-örüntüsü> örnekleri şunları içerir: malloc[2048] // 2048 boyutundaki tüm malloc blokları malloc[1k-8k] // 1k ile 8k arasındaki tüm malloc blokları CFData[50k+] // 50k veya daha büyük tüm CFData nesneleri [-1024] // 1024 bayt veya daha küçük tüm tahsisler
-noContent -addresses modunda nesne içeriğini göstermez.
Ayrıca Bakınız
malloc(3), leaks(1), malloc_history(1), stringdups(1), vmmap(1), DevToolsSecurity(1)
Xcode geliştirici araçları, heap tarafından sağlanana benzer bilgiler verebilen grafiksel bir uygulama olan Instruments aracını da içerir. Allocations aracı, tahsislerin nerede yapıldığına dair geri izleme kayıtları dahil olmak üzere, bir uygulamadaki nesne ve bellek kullanımı hakkında dinamik ve gerçek zamanlı bilgileri grafiksel olarak görüntüler. Leaks aracı ise bellek sızıntısı analizi gerçekleştirir.
Uyarılar
Tüm bellek boyutları ikili-önekli (binary-prefixed) birimler halinde verilir. Örneğin, "1K" 1024 baytı ifade eder.
macOS 26.4 Feb. 8, 2022 macOS 26.4