Bellek Denetleyicisi ile tanışın

Kim-Anh Tran
Kim-Anh Tran

Bu makalede, Chrome 91'de kullanıma sunulan Bellek Denetleyici açıklanmaktadır. ArrayBuffer, TypedArray, DataView ve Wasm belleğinizi incelemenize olanak tanır.

Giriş

ArrayBuffer'ınızdaki verileri anlamlandırmak istediniz mi? Bellek Denetleyici'den önce DevTools, ArrayBuffer'lar hakkında yalnızca sınırlı analizlere izin veriyordu. Hata ayıklama oturumu sırasında Kapsam görünümünden yapılan inceleme, dizi arabelleğindeki tek değerlerin listesini görüntülemekle sınırlıydı. Bu da verilerin bir bütün olarak anlaşılmasını zorlaştırıyordu. Örneğin, Kapsam görünümü, aşağıdaki örnekte arabelleği genişletilebilir dizi aralıkları olarak gösterir:

Geliştirici Araçları'ndaki kapsam görünümü

Tampon içinde belirli bir aralığa gitmek, kullanıcının bu dizinlere ulaşmak için aşağı kaydırması gerektiğinden sorunlu bir noktaydı. Ancak bir konuma gitmek kolay olsa bile değerleri inceleme bu şekilde zordur: Bu sayıların ne anlama geldiğini anlamak zordur. Özellikle, tek bayt olarak değil de örneğin 32 bit tam sayı olarak yorumlanmaları gerekiyorsa ne olur?

Bellek Denetleyicisi'ni kullanarak değerleri inceleme

Bellek Denetleyicisi

Chrome 91 ile birlikte, dizi arabelleklerini denetlemek için kullanılan Bellek Denetleyici'yi kullanıma sunuyoruz. Daha önce, ikili verileri görüntülemek için bellek inceleme araçlarını görmüş olabilirsiniz. Bu araçlar, ikili içeriği adresleriyle birlikte bir ızgara şeklinde gösterir ve temel değerleri yorumlamanın farklı yollarını sunar. Bellek Denetleyicisi'nin size sunduğu avantajlar bunlardır. Artık Bellek Denetleyici ile içeriği görüntüleyebilir, içeriğe gidebilir ve mevcut değerleri yorumlamak için kullanılacak türleri seçebilirsiniz. ASCII değerlerini doğrudan baytların yanında gösterir ve kullanıcının farklı bir büyüklük seçmesine olanak tanır. Bellek Denetleyici'nin nasıl kullanıldığını aşağıda görebilirsiniz:

Denemek ister misiniz? Bellek Denetleyici'yi nasıl açacağınızı ve dizi arabelleğinizi (veya TypedArray, DataView veya Wasm Bellek) nasıl görüntüleyeceğinizi öğrenmek ve nasıl kullanılacağı hakkında daha fazla bilgi edinmek için Bellek Denetleyici ile ilgili dokümanlarımıza göz atın. Bu örnek uygulamaları (JS, Wasm ve C++) deneyin.

Bellek Denetleyici'yi tasarlama

Bu bölümde, Web Bileşenleri kullanılarak bellek denetleyicinin nasıl tasarlandığına göz atacağız ve tasarım hedeflerimizden birini ve bunu nasıl uyguladığımızı göstereceğiz. Daha fazla bilgi edinmek istiyorsanız Bellek Denetleyici ile ilgili tasarım dokümanımıza göz atın.

Jack'in, Web Bileşenleri'ni kullanarak kullanıcı arayüzü bileşenleri oluşturmayla ilgili şirket içi kılavuzumuzu yayınladığı Web Bileşenleri'ne Geçiş konulu blog yayınımızı görmüş olabilirsiniz. Web bileşenlerine geçiş, Bellek Denetleyici üzerinde yaptığımız çalışmayla aynı zamana denk geldi. Bu nedenle, yeni sistemi denemeye karar verdik. Aşağıda, bellek denetleyiciyi oluşturmak için geliştirdiğimiz bileşenleri gösteren bir diyagram verilmiştir (bu bileşene şirket içinde doğrusal bellek denetleyici adını verdiğimizden bahsetmek isteriz):

Web Bileşenleri

LinearMemoryInspector bileşeni, Bellek Denetleyici'deki tüm öğeleri oluşturan alt bileşenleri birleştiren ana bileşendir. Temel olarak bir Uint8Array ve bir address alır ve bu iki öğenin her birinde verileri alt öğelerine iletir. Bu da yeniden oluşturmayı tetikler. LinearMemoryInspector'nin kendisi üç alt bileşen oluşturur:

  1. LinearMemoryViewer (değerlerin gösterilmesi),
  2. LinearMemoryNavigator (gezinmeye izin verir) ve
  3. LinearMemoryValueInterpreter (temel verilerin farklı tür yorumlarını gösterir).

Sonraki bileşen de bir üst bileşendir. Bu bileşen, ValueInterpreterDisplay (değerleri gösterir) ve ValueInterpreterSettings'yi (göstergede hangi türlerin gösterileceğini seçer) oluşturur.

Bileşenlerin her biri, kullanıcı arayüzünün yalnızca küçük bir bileşenini temsil edecek şekilde tasarlanmıştır. Böylece, bileşenler gerektiğinde yeniden kullanılabilir. Bir bileşende yeni veriler ayarlandığında, bileşende ayarlanan verilerde yansıtılan değişikliği gösteren bir yeniden oluşturma işlemi tetiklenir. Aşağıda, bileşenlerimizi içeren bir iş akışı örneği gösterilmektedir. Bu örnekte, kullanıcı adres çubuğundaki adresi değiştirmektedir. Bu işlem, yeni verileri (bu durumda görüntülenecek adres) ayarlayarak bir güncellemeyi tetikler:

Bileşenler şeması

LinearMemoryInspector, LinearMemoryNavigator'a dinleyici olarak kendini ekler. addressChanged işlevi, bir address-changed etkinliğinde tetiklenir. Kullanıcı adres girişini düzenlediği anda, yukarıda belirtilen etkinlik gönderilir ve addressChanged işlevi çağrılır. Bu işlev artık adresi dahili olarak kaydediyor ve data(address, ..) ayarlayıcısını kullanarak alt bileşenlerini güncelliyor. Alt bileşenler adresi dahili olarak kaydeder ve görünümlerini yeniden oluşturarak söz konusu adresteki içeriği gösterir.

Tasarım hedefi: Performansı ve bellek tüketimini arabellek boyutundan bağımsız hale getirmek

Bellek Denetleyici'yi tasarlarken göz önünde bulundurduğumuz bir nokta, Bellek Denetleyici'nin performansının arabellek boyutundan bağımsız olması gerektiğiydi.

Önceki bölümde gördüğünüz gibi, LinearMemoryInspector bileşeni değerleri oluşturmak için bir UInt8Array alır. Aynı zamanda, Bellek Denetleyici'nin yalnızca bir kısmını gösterdiği için Bellek Denetleyici'nin verilerin tamamını tutması gerekmediğinden emin olmak istedik (ör. Wasm belleği 4 GB kadar büyük olabilir ve 4 GB'ı Bellek Denetleyici'de depolamak istemeyiz).

Bu nedenle, Bellek Denetleyici'nin hızının ve bellek tüketiminin, gösterdiğimiz gerçek arabellekten bağımsız olmasını sağlamak için LinearMemoryInspector bileşeninin yalnızca orijinal arabelleğin bir alt aralığını tutmasına izin veririz.

Bunun işe yaraması için LinearMemoryInspector'ün önce iki tane daha bağımsız değişken alması gerekir: bir memoryOffset ve bir outerMemoryLength. memoryOffset, iletilen Uint8Array'ın başladığı ofseti belirtir ve doğru veri adreslerinin oluşturulması için gereklidir. outerMemoryLength, orijinal arabelleğin uzunluğudur ve hangi aralığı gösterebileceğimizi anlamak için gereklidir:

tampon

Bu bilgiler sayesinde, tüm verilere sahip olmadan da öncekiyle aynı görünümü (address etrafındaki içerik) oluşturabiliriz. Peki farklı bir aralıktaki farklı bir adres istenirse ne yapmalısınız? Bu durumda LinearMemoryInspector, tutulan mevcut aralığı güncelleyen bir RequestMemoryEvent tetikler. Aşağıda bir örnek gösterilmektedir:

Etkinlik tetikleyici akış diyagramı

Bu örnekte, kullanıcı bellek sayfasına gider (Bellek Denetleyici, veri parçalarını göstermek için sayfalama kullanıyordur). Bu işlem bir PageNavigationEvent tetikler ve bu da bir RequestMemoryEvent tetikler. Bu etkinlik, yeni aralığın getirilmesini başlatır. Ardından veriler ayarlanarak LinearMemoryInspector bileşenine dağıtılır. Sonuç olarak, yeni getirilen verileri gösteririz.

Ayrıca, Hatta Wasm ve C/C++ kodlarındaki belleği bile inceleyebilirsiniz.

Bellek Denetleyici, yalnızca JavaScript'te ArrayBuffers için değil, Wasm belleğini ve C/C++ referansları/işaretçileri tarafından işaretlenen belleği de (DWARF uzantımızı kullanarak) incelemek için kullanılabilir. Henüz denemediyseniz mutlaka deneyin. Modern araçlarla WebAssembly'de hata ayıklama başlıklı makaleyi inceleyin. Web'de C++'nun yerel hata ayıklama işlemi için Bellek Denetleyici'nin işleyişine dair kısa bir görünüm:

C++'ta belleği inceleme

Sonuç

Bu makalede, Bellek Denetleyici tanıtılmış ve tasarımına dair bir bakış sunulmuştur. Bellek Denetleyici'nin, ArrayBuffer'nızda neler olduğunu anlamanıza yardımcı olacağını umuyoruz :-). Geliştirme önerileriniz varsa lütfen bize bildirin ve hata kaydı oluşturun.

Önizleme kanallarını indirme

Varsayılan geliştirme tarayıcınız olarak Chrome Canary, Yeni Geliştirilenler veya Beta sürümünü kullanabilirsiniz. Bu önizleme kanalları, en son DevTools özelliklerine erişmenizi sağlar, en yeni web platformu API'lerini test etmenize olanak tanır ve sitenizdeki sorunları kullanıcılarınızdan önce bulmanıza yardımcı olur.

Chrome Geliştirici Araçları Ekibi ile iletişime geçme

Yeni özellikler, güncellemeler veya Geliştirici Araçları ile ilgili başka herhangi bir konu hakkında konuşmak için aşağıdaki seçenekleri kullanın.