← man/system_admin
malloc_history — man malloc_history — 80×24
ugur@toprak:~/man/system_admin$man malloc_history
Bölüm 1 Sistem Yönetimi

malloc_history

Sürecin gerçekleştirdiği malloc ve anonim VM (Sanal Bellek) tahsislerini gösterir

Kullanım

     malloc_history process [-highWaterMark] address [address ...]

     malloc_history process -allBySize [-highWaterMark] [address ...]

     malloc_history process -allByCount [-highWaterMark] [address ...]

     malloc_history process -allEvents [-highWaterMark] [-showContent]

     malloc_history process -callTree [-highWaterMark] [-showContent] [-invert] [-ignoreThreads]
		    [-collapseRecursion] [-chargeSystemLibraries] [-virtual]
		    [address ... | <classes-pattern>]

		    process; bir pid, yürütülebilir dosya adı (executable-name) veya bellek grafiği dosyasıdır (memory-graph-file)

Açıklama

malloc_history, belirtilen süreci inceler ve onun tarafından gerçekleştirilen malloc ve anonim VM (Sanal Bellek) tahsislerini listeler. Anonim VM tahsisleri, bir dosya tarafından desteklenmeyen ham Sanal Bellek tahsis eden mach_vm_allocate gibi çağrılardan kaynaklanır. Malloc yığınlarının (heaps) altında yatan VM bölgelerinin tahsisleri yoksayılır. malloc_history, hedef süreç için malloc yığın günlüğü (malloc stack logging) etkinleştirildiğinde standart malloc kütüphanesi tarafından sağlanan bilgilere dayanır. Daha fazla bilgi için aşağıya bakın.

Hedef süreç; pid veya tam/kısmi adla belirtilebilir ya da leaks veya Xcode Memory Graph Debugger tarafından oluşturulan bir bellek grafiği (memory graph) dosyasının yolu olabilir.

-highWaterMark seçeneği geçirilirse, malloc_history ilk olarak hedef süreç tarafından herhangi bir zamanda kullanılan en yüksek tahsis edilmiş bellek miktarını —yani "high water mark" (en yüksek doluluk seviyesi) değerini— hesaplamak için tüm malloc yığın günlüğü kayıtlarını tarar. Ardından, hedef programda şu anda canlı olanlar yerine, o anda canlı olan malloc tahsisleri ve anonim VM bölgeleri hakkındaki bilgileri gösterir.

-highWaterMark seçeneği, canlı bir süreçte veya -fullStackHistory ile kaydedilmiş bir bellek grafiği dosyasında MallocStackLogging'in tam (full) modunu gerektirir.

Bir veya daha fazla adres belirterek, malloc_history, bu adreslerde başlayan veya bu adresleri içeren herhangi bir malloc bloğunun veya VM bölgesinin tüm tahsis ve serbest bırakma (deallocation) işlemlerini listeler. Her tahsis için, malloc veya free ya da mach_vm_allocate, mmap veya mach_vm_deallocate çağrılarını kimin yaptığını açıklayan bir yığın izi (stack trace) listelenir. Yalnızca belirtilen adreste başlayan malloc blokları ve VM bölgeleri için olayları görmek istiyorsanız, çıktıyı bu adres için grep ile filtreleyebilirsiniz. -highWaterMark geçirilirse, yalnızca en yüksek doluluk seviyesine kadar olan tahsisleri ve serbest bırakmaları gösterir.

Alternatif olarak, -allBySize ve -allByCount seçenekleri, hedef süreçte şu anda canlı olan veya en yüksek doluluk seviyesinde canlı olan tüm tahsisleri listeler. Programın aynı noktasından (yani aynı çağrı yığınından [call stack]) yapılan sık tahsisler bir araya gruplandırılır ve çıktı en büyük tahsislerden en küçüğe veya en çok tahsisten en aza doğru sunulur. Ayrıca bir veya daha fazla adres belirtirseniz, bu çıktı yalnızca bu adresleri içeren malloc bloklarına ait bilgileri gösterecek şekilde filtrelenir.

-allEvents seçeneği, geçerli zamana veya en yüksek doluluk seviyesine kadar tüm adresler için tüm tahsis ve serbest bırakma (free) olaylarını listeler. Bu çıktı çok hacimli olabilir. -showContent seçeneği geçirilirse, canlı tahsisler aşağıda bu seçenek için açıklandığı gibi ek ayrıntılara sahip olacaktır.

-callTree seçeneği, hedef süreçteki canlı tahsisler veya en yüksek doluluk seviyesinde canlı olan tahsisler için malloc çağrılarının ve anonim VM bölgelerinin geri izlemelerinden (backtraces) bir çağrı ağacı (call tree) oluşturur. Çağrı ağacı, bir veya daha fazla adres veya bir geçirilerek belirli tahsislerin veya sınıfların geri izlemelerine göre filtrelenebilir.

düzenli ifadesi (regular expression), re_format(7) kılavuz sayfasında açıklandığı gibi genişletilmiş (modern) bir düzenli ifade olarak yorumlanır. "malloc" veya "non-object", belirli bir türe ait olmayan blokları belirtmek için kullanılabilir. Geçerli classes-pattern örnekleri şunları içerir: CFString 'NS.' '__NSCFString|__NSCFArray' '.(String|Array)' 'VM:.*' malloc non-object malloc|.*String

desenini, aşağıdaki biçimlerden biri olabilen isteğe bağlı bir tahsis boyutu belirtici takip edebilir. Köşeli ayraçlar zorunludur. Boyut, kilobayt için 'k' soneki veya megabayt için 'm' soneki içerebilir: [size] [lowerBound-upperBound] [lowerBound+] [-upperBound]

Boyut belirtimlerine sahip örnekleri şunları içerir: malloc[2048] 2048 boyutundaki tüm malloc blokları malloc[1k-8k] 1k ile 8k arasındaki tüm malloc blokları '(NS|CF).[10k+]' 10k veya daha büyük tüm NS veya CF nesneleri [-1024] 1024 bayt veya daha küçük tüm tahsisler VM.[1m+] 1m veya daha büyük tüm Sanal Bellek bölgeleri; -virtual bayrağı geçirilmedikçe bu varsayılan olarak dirty+swapped-volatile boyutudur

Çağrı ağacı biçimi sample(1) çıktısına benzer. Elde edilen çağrı ağacı, daha fazla analiz için filtercalltree(1) aracıyla filtrelenebilir veya budanabilir. -callTree modu için ek seçenekler şunlardır:

  • -showContent: C dizeleri, Pascal dizeleri (başında uzunluk baytı olan) ve NSString, NSDate ve NSNumber dahil olmak üzere çeşitli nesneler dahil olmak üzere çeşitli türlerdeki malloc bloklarının içeriğini gösterir.

  • -invert: Çağrı ağacını tersine çevirir, böylece malloc (ve -showContent seçeneği verilmişse tahsis edilen içerik) çağrı ağaçlarının en üstünde görünür.

  • -ignoreThreads: Tüm iş parçacıkları (threads) için çağrı ağaçlarını tek bir çağrı ağacında birleştirir.

  • -collapseRecursion: Çağrı ağaçları içindeki özyinelemeyi (recursion) daraltır.

  • -chargeSystemLibraries: /System ve /usr içindeki tüm kütüphanelerden yığın çerçevelerini kaldırırken, maliyetlerini (çağrı sayısı, tahsis boyutu ve içerik) çağıranlara yüklemeye devam eder.

  • -virtual: VM bölgelerinin boyutunu varsayılan dirty + swapped/compressed - purgableVolatile yerine sanal boyut (virtual size) olarak görüntüler.

Tüm modlar standart malloc kütüphanesinin hata ayıklama özelliğinin açık olmasını gerektirir. Bunu yapmak için, programı çalıştıracak kabukta MallocStackLogging veya MallocStackLoggingNoCompact çevre değişkenini 1 olarak ayarlayın. MallocStackLogging kullanılırsa, olaylar kaydedilirken bir adres için bir tahsis olayını hemen aynı adres için bir serbest bırakma (free) olayı takip ederse, her iki olay da olay günlüğünden kaldırılır. MallocStackLoggingNoCompact kullanılırsa, bu tür tüm anlık tahsis/serbest bırakma çiftleri olay günlüğünde tutulur; bu, belirli bir adres için tüm olayları incelerken veya -allEvents seçeneğini kullanırken yararlı olabilir.

Hem MallocStackLogging hem de MallocStackLoggingNoCompact ayarlanmışsa, MallocStackLogging öncelik kazanır ve MallocStackLoggingNoCompact yoksayılır.

malloc_history, özellikle bellek bozucularını (memory smashers) izlemek için yararlıdır. İncelenecek programı MallocStackLogging veya MallocStackLoggingNoCompact tanımlı olarak çalıştırın. Ayrıca MallocScribble çevre değişkenini ayarlayın; bu, malloc kütüphanesinin serbest bırakılan belleğin üzerine iyi bilinen bir değer (0x55) yazmasına neden olur ve serbest bırakılan malloc bloklarını temizlendikten sonra belleğin üzerine yazılmadığından emin olmak için ara sıra kontrol eder. Malloc, belleğin üzerine yazıldığını algıladığında, tamponun serbest bırakıldıktan sonra değiştirildiğine dair bir uyarı yazdıracaktır. Daha sonra o adreste belleği kimin tahsis ettiğini ve serbest bıraktığını bulmak için malloc_history'yi kullanabilir ve böylece kodun hangi kısımlarının serbest bırakılan yapıya hala bir işaretçiye sahip olabileceğini çıkarabilirsiniz.

Örnek

Sınıf türüne veya malloc boyutuna göre tahsislerin geri izlemelerini görmek için şu komutu çalıştırın:

% malloc_history -callTree -invert -showContent

Ayrıca Bakınız

malloc(3), heap(1), leaks(1), stringdups(1), vmmap(1), filtercalltree(1), DevToolsSecurity(1)

Xcode geliştirici araçları ayrıca, malloc_history tarafından sağlanana benzer bilgiler verebilen grafiksel bir uygulama olan Instruments'ı da içerir. Allocations enstrümanı, bir uygulamadaki nesne ve bellek kullanımı hakkında dinamik, gerçek zamanlı bilgileri, tahsislerin nerede gerçekleştiğinin geri izlemeleri dahil olmak üzere grafiksel olarak görüntüler.

Uyarılar

Tüm bellek boyutları ikili ön ekli birimlerde verilir. Örneğin, "1K" 1024 baytı ifade eder.

macOS 26.4 Oct. 7, 2019 macOS 26.4