← man/system_diagnostics
leaks — man leaks — 80×24
ugur@toprak:~/man/system_diagnostics$man leaks
Bölüm 1 Sistem Tanılama

leaks

Bir sürecin belleğinde referans verilmemiş malloc arabelleklerini arar

Sinopsis

      leaks [seçenekler] pid | kısmi-yürütülebilir-dosya-adı | bellek-grafiği-dosyası
      leaks [seçenekler] -atExit -- komut

    Seçenekler:
      [-list] [-groupByType] [-nostacks] [-nosources] [-quiet] [-exclude sembol] [-outputGraph yol]
      [-fullContent] [-readonlyContent] [-noContent] [-fullStackHistory] [-diffFrom=<memgraph>]
      [-traceTree adres] [-referenceTree] [-autoreleasePools] [-debug=<mod>] [-conservative]

Açıklama

leaks, sızdırılmış belleği —uygulama tarafından ayrılmış olan ancak kaybedilen ve serbest bırakılamayan belleği— tespit eder. Özellikle leaks, belirtilen bir sürecin belleğini, malloc ile ayrılmış arabelleklere işaretçi (pointer) olabilecek değerler açısından inceler. Yazılabilir global bellekteki (örneğin __DATA segmentleri) bir işaretçiden, bir yazmaçtan (register) veya yığından (stack) erişilebilen her arabelleğin kullanımda olan bellek olduğu varsayılır. Erişilebilir durumdaki malloc ile ayrılmış bir arabellekte bulunan bir işaretçiden erişilebilen her arabelleğin de kullanımda olduğu varsayılır. Erişilemeyen arabellekler sızıntıdır; bellekte arabelleğe yönelik hiçbir işaretçi bulunmadığı için bu arabellekler asla serbest bırakılamaz ve bu nedenle bu arabellekler için asla free() çağrılamaz. Bu tür arabellekler belleği boşa harcar; bunları temizlemek sayfalama (swapping) ve bellek kullanımını azaltabilir. Sızıntılar özellikle uzun süre çalışan programlar için tehlikelidir, çünkü sızıntılar nihayetinde belleği doldurabilir ve uygulamanın çökmesine neden olabilir.

leaks tek bir argüman gerektirir —incelenecek sürecin süreç kimliği (process ID - pid) veya tam ya da kısmi yürütülebilir dosya adı ya da leaks veya Xcode Memory Graph Debugger tarafından oluşturulmuş bir bellek grafiği (memory graph) dosyasının yolu. (-atExit -- komut argümanı verilmediği sürece, daha fazla ayrıntı için aşağıya bakın.)

Sızdırılan arabellekler tespit edildikten sonra leaks, bunları analiz ederek "kök sızıntıları" (başka hiçbir arabellek tarafından referans verilmeyenler) ve "kök döngüleri" (birbirini referans alan veya tutan, ancak döngü dışındaki başka hiçbir arabellek tarafından referans verilmeyen nesne döngüleri) bulur. Ardından, varsa bu kök sızıntılar ve kök döngüler tarafından referans verilen arabellek ağacını tanımlar. leaks daha sonra her bir "sızıntı ağacını" yazdırır.

Uygulama başlatıldığında MallocStackLogging ortam değişkeni (environment variable) ayarlanmışsa leaks, arabelleğin nerede ayrıldığını açıklayan bir yığın izini (stack trace) de yazdırır.

Bellek Grafiği Dosyaları

Bir bellek grafiği dosyası, daha sonraki bir zamanda, farklı bir makinede veya diğer insanlar tarafından daha ayrıntılı analiz edilmesi amacıyla bir sürecin bellek durumunu arşivler. Süreçteki tüm VM ve malloc düğümleri ile aralarındaki referanslar hakkında bilgi içerir. Bellek grafiği dosyaları, leaks kullanılarak -outputGraph seçeneğiyle (ve istenirse -fullContent seçeneğiyle) veya çalışan canlı bir sürecin Xcode Memory Graph Debugger ile incelenmesi ve ardından File menüsünden Export Memory Graph menü öğesinin kullanılmasıyla oluşturulabilir. Bellek grafiği dosyaları için standart dosya adı uzantısı ".memgraph" şeklindedir. Bu dosyalar leaks, heap, stringdups, vmmap, malloc_history, footprint ve Xcode Memory Graph Debugger dahil olmak üzere çeşitli komutlara girdi olarak kullanılabilir.

Seçenekler

  • -list: Sızıntıları bir ağaç yerine liste ("klasik" tarzda) olarak yazdırır. Uyarı: Bu seçenek gelecekte kaldırılabilir.

  • -groupByType: Sızdırılan nesnelerin bir ağacını yazdırırken, tek tek örnekleri göstermek yerine ağaçtaki bir düğümün alt öğelerini türe göre gruplandırır.

  • -nostacks: Hedef süreçte MallocStackLogging ortam değişkeni ayarlanmış olsa bile sızdırılan blokların geri izleme (backtrace) bilgilerini yazdırmaz.

  • -nosources: Geri izlemelerde sourceFile:lineNumber bilgilerini yazdırmaz. Bu, çok sayıda hata ayıklama sembolüne (debug symbols) sahip bir süreci incelerken performansı artırabilir.

  • -quiet: Süreç açıklaması başlığını veya ikili imaj listesini yazdırmaz.

  • -exclude sembol: Geri izleme bilgileri belirtilen sembolü içeren sızdırılmış blokları hariç tutar. Bu seçenek birden fazla sembol için tekrarlanabilir. Bu, örneğin kaynak koduna sahip olmadığınız kütüphanelerde ayrılan sızıntıları yoksaymanızı sağlar.

  • -outputGraph yol: Tüm VM ve malloc düğümleri ile aralarındaki referanslar hakkında bilgi içeren bir bellek grafiği dosyası oluşturur. yol, bir dosya yolu veya yalnızca bir dizin adı olabilir; ikinci durumda ".memgraph" uzantılı bir dosya adı oluşturulacaktır.

    Varsayılan olarak (güvenlik nedeniyle) bir bellek grafiği dosyası oluşturulurken, bazı nesnelerin içeriğinin açıklamaları dahil edilir, ancak YALNIZCA Mach-O ikili imajlarındaki veya dyld paylaşılan önbelleğindeki salt okunur bellek tarafından destekleniyorlarsa. Tam içeriği depolamak için -fullContent bayrağını geçirin.

  • -fullContent: Bellek grafiği dosyası oluştururken, heap -addresses all tarafından gösterileceği gibi ve stringdups tarafından ihtiyaç duyulacağı gibi çeşitli nesnelerin içeriğinin açıklamalarını dahil eder. (Canlı bir süreç hedeflendiğinde, bir bellek grafiği dosyası oluşturulmadan tam içerik varsayılan değerdir.)

  • -readonlyContent: leaks komutunu canlı bir hedef sürece karşı çalıştırırken, bellek içeriğinin açıklamalarını yalnızca salt okunur bellek tarafından destekleniyorlarsa yazdırır. (Bellek grafiği dosyaları oluşturulurken salt okunur içerik varsayılan değerdir.)

  • -noContent: Sızdırılan belleğin içeriğinin açıklamalarını yazdırmaz veya bellek grafiği dosyalarına bellek ayırma açıklamalarını kaydetmez. Bu bilgiler arabelleğin içeriğini tanımak ve neden sızdırılmış olabileceğini anlamak için yararlı olsa da, örneğin bu çıktıyı içeren hata raporları gönderdiğinizde süreçteki gizli bilgileri ifşa edebilir.

  • -fullStackHistory: Bellek grafiği dosyası oluştururken, serbest bırakılmış geçmiş ayırmalar dahil olmak üzere mevcut tüm MallocStackLogging geri izleme bilgilerini dahil eder.

  • -diffFrom=<memgraph>: Sadece belirtilen memgraph dosyasından bu yana oluşan yeni sızıntıları gösterir.

  • -traceTree adres: Belirtilen bloktan sürecin 'köklerine' (örneğin global veriler, yazmaçlar veya yığınlardaki konumlar) kadar ters bir referans ağacı yazdırır. Bu, bir arabelleğin serbest bırakılmasını engelleyen referansın ne olduğunu belirlemek için yararlıdır ve Xcode Memory Graph Debugger'da gösterilen bilgilere benzer.

  • -referenceTree: Süreçteki tüm malloc ayırmalarının ve dinamik olarak ayrılmış VM bölgelerinin yukarıdan aşağıya bir ağacını yazdırır. Bu, belleğin süreç tarafından nasıl tutulduğuna dair genel bir fikir edinmek için yararlı olabilir. Verileri özetlemek için -groupByType argümanı da geçilebilir.

    Bu referans ağacı modunda, her ayırma çıktıda yalnızca bir kez görünür. Ağaçta ayırmanın nerede gösterileceğine karar vermek için hangi referansın "sahip" ayırma olarak kabul edilmesi gerektiğine öncelik verme girişiminde bulunulur; ancak ayırmaların genellikle kendilerine yönelik birkaç veya çok sayıda referansı olduğundan (bunların bazıları yanlış veya eski referanslar olabilir) ve bu referans ağacı çıktısında yalnızca bir tanesi "ebeveyn" olabileceğinden, bazen ayırmalar ağaçta yanlış yerde gösterilir.

  • -autoreleasePools: Sürecin tüm iş parçacıklarının (thread) tüm autorelease havuzlarının içeriklerini ve yalnızca bu ayırmalar tarafından tutulan bellek ağaçlarını yazdırır. Autorelease havuzu boşaltılırsa (popped), yalnızca autorelease havuzu girdileri tarafından tutulan bu ek bellek serbest bırakılır.

  • -debug=[mod]: Bu bayrak, hata ayıklama ve daha derin incelemeler için tasarlanmış birkaç ek detaylı çıktı modu sunar. Çeşitli hata ayıklama modları hakkında daha fazla bilgi edinmek için -debug=help seçeneğini kullanın.

  • -conservative: Tür bilgisini yok sayar ve işaretçileri bayt bayt tarar; muhafazakar bir yaklaşımla tüm referansların sahip olunan (owning) referanslar olduğunu varsayar.

  • -atExit -- komut: Belirtilen komutu başlatır ve süreç çıktığında leaks komutunu çalıştırır. -atExit argümanı son argüman olmalı, ardından -- ve başlatılacak komut gelmelidir. Örneğin:

    $ leaks -quiet -atExit -- /bin/ls -lt /tmp/

    -atExit kullanılması, sızdırılan ayırmalar için yığın geri izlemelerinin gösterilebilmesi amacıyla belirtilen komut için MallocStackLogging=lite ortam değişkenini otomatik olarak ayarlayacaktır. YES veya NO gibi farklı bir ortam değişkeni ayarı kullanmak için leaks komutunu çalıştırmadan önce ortam değişkenini ayarlayabilirsiniz. Örneğin:

    $ MallocStackLogging=YES leaks -quiet -atExit -- /bin/ls -lt /tmp/

Ortam

Hedef süreç MallocScribble ortam değişkeni ile çalıştırılırsa leaks komutu daha fazla sızıntı tespit edebilir. Bu değişken ayarlandığında, malloc blokları serbest bırakıldığında 0x55 baytları ile doldurulur, böylece bu bloklarda kalan işaretçiler gibi "eski" verilerin üzerine yazılır. Bu, süreç belleğinde kalan yanlış işaretçilerin sayısını azaltır.

Çıkış Durumu

leaks komutu aşağıdaki değerlerden biriyle sonlanır:

0 Hiçbir sızıntı tespit edilmedi. 1 Bir veya daha fazla sızıntı tespit edildi.

1 Bir hata oluştu.

Ayrıca Bakınız

malloc(3), heap(1), malloc_history(1), stringdups(1), vmmap(1), footprint(1), DevToolsSecurity(1)

Xcode Memory Graph Debugger, malloc bloklarını ve VM bölgelerini (hem sızdırılan hem de sızdırılmayan) ve aralarındaki referansları grafiksel olarak gösterir.

Xcode geliştirici araçları, leaks tarafından sağlanan bilgilere benzer bilgiler sunabilen grafiksel bir uygulama olan Instruments programını da içerir. Allocations aracı, bir uygulamadaki nesne ve bellek kullanımı hakkında dinamik, gerçek zamanlı bilgileri ve ayırmaların nerede gerçekleştiğine dair geri izleme bilgilerini grafiksel olarak görüntüler. Leaks aracı ise bellek sızıntısı analizi gerçekleştirir.

Uyarım

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

macOS 26.4 15 Mart 2022 macOS 26.4