Program dinamik analizi ( dinamik program analizi veya DPA ), yürütme gerektiren bir program analiz şeklidir. Bir bilgisayar programının davranışını ve yürütülmesinin çevresi üzerindeki etkilerini incelemeye izin verir . Fiziksel veya sanal bir ortamda uygulandığında, genellikle programların profilini çıkarmak için kullanılır . İşlemci kullanım süresi, bellek kullanımı veya program tarafından harcanan enerji hakkında bilgi almak olsun .
Ayrıca programlardaki sorunları bulmaya yardımcı olur. Örneğin, programın yasaklanmış bellek alanlarına erişip erişmediğini tespit edebilir veya hatta fuzzer kullanarak bir programdaki hataları ortaya çıkarabilir . Ayrıca, bir programın gerçek zamanlı olarak hatalarının ayıklanmasına izin vererek, bellekte ve işlemcide ne olup bittiğine , yürütme sırasında herhangi bir zamanda bakma imkanı verir .
Bir programı analiz etmek için üç bilgi kaynağı mevcuttur: kaynak kodu , programın yürütülmesi ve programın özellikleri. Kaynak kod analizi daha çok statik program analizi için ayrılmıştır , program yürütme ise daha çok dinamik program analizi için kullanılır. Genel olarak, statik program analizi bir kaynak kodun tüm dallarını analiz etmelidir , dinamik analiz ise yalnızca programın belirli bir veri kümesiyle yürütülmesine odaklanır .
Örneğin profil oluşturma, yürütülen kodun parçalarını izlediği için dinamik analizin bir parçasıdır. Bu izler, programın üzerinde yürütüldüğü çeşitli donanım bileşenleri ( işlemci , bellek , sabit disk vb.) Üzerindeki etkisini anlamayı mümkün kılar . Tipik olarak bir programın yürütme süresinin% 80'i kaynak kodun% 20'si tarafından alındığından. Bir profilleyicinin kullanılması, bu% 20'nin tam olarak nerede konumlandığını belirlemeyi mümkün kılar. Birkaç işlemcide paralel olarak çalıştırılan programlar durumunda, bir profilleyicinin kullanılması , programın paralellik derecesinin bir göstergesini vermeyi mümkün kılar .
Kodun test edilmesi ve hata ayıklanması herhangi bir dil için çok önemlidir . Test, amacı hataları tespit etmek olan bir programın dinamik analizi olarak düşünülebilir . Hata ayıklayıcı, bir hatayı bulmak ve düzeltmek için kodu analiz ederken .
Bir programın yürütme hızını artırmak için, geliştiricinin kullanabileceği araçlardan biri istatistiksel profillemedir ( Örnekleme profili oluşturucu ). Performansla ilgili sorunlu noktaları ve darboğazları tespit etmeye yardımcı olarak geliştiriciyi bir programın optimize edilecek bölümlerine doğru yönlendirir .
Aşağıda yazılı minimalist profilci örneğidir Ruby sadece nasıl açıklamak için Aaron Patterson tarafından Örnekleme Profiler çalışır :
def fast; end def slow; sleep(0.1); end def benchmark_me 1000.times { fast } 10.times { slow } end def sample_profiler target = Thread.current # récupère l'environnement d'exécution courant samples = Hash.new(0) # initialise un dictionnaire qui va contenir les noms des fonctions appelées t = Thread.new do # initialise un nouveau thread loop do # boucle infinie sleep 0.0001 # vitesse d'échantillonnage function_name = target.backtrace_locations.first.label # récupère le nom de la fonction en cours d'exécution samples[function_name] += 1 # incrémente le nombre de fois que la fonction a été vue end end yield # execute le code passé dans le bloc t.kill # arrête le thread samples.dup end result = sample_profiler { benchmark_me } p result # => {"sleep"=>6497, "slow"=>1}Yukarıda görüldüğü gibi, profil oluşturucu programı hangi fonksiyonun çalıştığına bakmak için durdurduğunda , fonksiyon bir sleep defaya göre 6497 kez görünür slow. Fonksiyonların fastyanı sıra benchmark_meölçülmedi bile. Bu nedenle geliştirici, programında en çok zaman kaplayan işlevin bir göstergesini elde eder.
Örnekleme profilcisi programın yürütme süresini yavaşlatsa da (hangi işlevin çalıştığını görmek için mevcut görevi durdurmak gerektiğinden), kodu doğrudan anında veya yukarı akışta değiştirmeye gerek yoktur.
Etkileşimli bir uygulama durumunda, geleneksel profil oluşturucular, kullanıcı tarafından hissedilen gecikmeler hakkında yalnızca çok az yararlı veri sağlar. Profil oluşturucu, program yürütme süresi için kod hakkında veri döndürür. Bununla birlikte, etkileşimli bir program durumunda (örneğin bir metin editörü), ilgi alanları, kullanıcının programla etkileşime girmeye çalıştığı bölgelerdir (fare hareketi, klavyenin kullanımı, vb.). Bu etkileşimler , editörün toplam çalışma süresine kıyasla çok düşük bir CPU süresini ve maliyetini temsil eder . Bu nedenle , programın profilini çıkarırken optimize edilecek yerler olarak görünmezler . Bu nedenle , bu yavaşlamalara odaklanan Gecikme profili oluşturucuları vardır .
Bir programı çalıştırırken bellek kullanımının profilini çıkarmak önemlidir. Özellikle programın uzun bir süre (bir sunucuda olduğu gibi ) çalışması ve hizmet reddini önlemesi amaçlanıyorsa . Bu tür analizler için "kesin profil oluşturucu" türleri kullanılır. Yani, her işlevin tam olarak kaç kez çağrıldığına bakan bir profil oluşturucu.
Aşağıda, bir Exact Profiler'ın nasıl çalıştığını basitçe açıklamak için Ruby'de Aaron Patterson tarafından yazılmış bir minimalist profil oluşturucu örneği verilmiştir :
def fast; end # return immediatly def slow; sleep(0.1); end # return after 0.1 second def benchmark_me 1000.times { fast } # 1000 appels a la fonction fast 10.times { slow } # 10 appels a la fonction slow end def exact_profiler counter = Hash.new(0) # dictionnaire vide tp = TracePoint.new(:call) do |event| # lorsqu'une fonction est appelée counter[event.method_id] += 1 # on l'ajoute dans le dictionnaire end tp.enable # on active le code ci dessus yield # on appelle le code passé dans le bloc tp.disable # on arrête de compter les appels de fonction return counter end result = exact_profiler { benchmark_me } p result # {:benchmark_me=>1, :fast=>1000, :slow=>10}Kullanılan dil ne olursa olsun, bu tür bir profil oluşturucu, kodun araçsallaştırılmasını gerektirecektir. Programa, bir işlev her çağrıldığında veya sonlandırıldığında, yürütülmesi gereken daha fazla talimat eklemek gerekir. Bu, programın çalışma süresi için dramatik olabilir. 10 ila 4000 kat daha yavaş sonuçlanabilir.
Örneğin java'da , Java Profiler (JP), bir yöntem her çağrıldığında bir sayacı artırmak için ek bayt kodu ekleyecektir . Bu kodun gerçek uygulama süresini değiştirebilir ve çoğunlukla senkronizasyon sorunları neden (yürütülmesi için ipliklerin multi-parçacıklı uygulamalarda başlatıldığında değiştirilebilir).
Bellek profili oluşturucu durumunda, yalnızca bellekle ilişkisi olan işlevler kullanılmalıdır. Örneğin, Valgrind durumunda , malloc ve serbest işlevler , Valgrind'i çalıştırmadan önce çağrıldıklarını bildiren bir işlevle değiştirilecektir . Memcpy veya strcpy gibi sıkça kullanılan veya Valgrind için sorunlara neden olan belleğe yazma işlevlerinden bazıları da enstrümanlıdır.
Akıllı telefonların ortaya çıkması ve Nesnelerin İnternetinin gelişmesiyle birlikte enerji tüketimi son yıllarda çok önemli bir konu haline geldi. Bir hizmetin tüketimini azaltmak için işlemcilerin sıklığını azaltmak veya hatta malzeme kaynaklarını bir araya getirmek mümkün olsa da, programların enerji tüketimini doğrudan azaltmak, paralel olarak kullanılabilecek bir çözüm olmaya devam ediyor.
Profilleme enerji bir programın tüketimini gerçekleştirmek yardımcı olabilir çözümlerden biridir. Bu, bir tüketimi talimatlarla ilişkilendirmek için enerji tüketimini değerlendirirken bir uygulamanın kodunun profilini çıkarmayı içerir . Bir program çalışırken enerji tüketimini ölçmek için kullanılabilecek birkaç çözüm vardır. Örneğin , program tarafından kullanılan bileşenlerin her birinin doğrudan önüne yerleştirilen donanım bileşenleri ile tüketimi doğrudan ölçmek mümkündür . Ancak, bu tür ölçüm bileşenlerine erişim her zaman mümkün değildir. Dolayısıyla başka bir strateji, önceden oluşturulmuş tüketim modellerini kullanmaktır. Bu modeller, program tarafından kullanılan donanım öğelerinin yanı sıra bu bileşenlerin farklı durumlarını da hesaba katmalıdır.
Enerji analizi özeldir, çünkü sadece programı çalıştırmayı değil, aynı zamanda enerji etkisini kesin olarak hesaplamak için üzerinde çalıştığı makinenin tüm bileşenlerinin enerji profilini bilmeyi de gerektirir.
Programların enerji analizi, kesin olarak değerlendirmek için çok karmaşık kalır. Aslında, bazı modeller gerçek tüketime kıyasla% 10'luk bir hata payına yaklaşılmasına izin verse bile, birkaç faktör görevi karmaşık hale getirir. Her şeyden önce, bazı cihazların çok sayıda bileşene sahip olması (örn. Akıllı telefonlar), her şeyi hesaba katmak sorunludur. Daha sonra, bir işlemcinin alabileceği farklı durumlar (enerji tasarrufu durumu gibi) veya frekansı , sonuçları değiştirir. GPS gibi belirli bileşenlerin aktif olup olmaması veya WIFI antenlerinin iletimde veya alımda olması da denklemde dikkate alınması gereken unsurlardır. Ayrıca, çalışan programdan bağımsız olarak değişiklik gösterebilirler ve bu da görevi daha da karmaşık hale getirir.
Kullanılan tekniklere bağlı olarak, enerji profili, az ya da çok taneciklik ile görülebilir . Hatta bazı teknolojiler, belirli bir kod satırı için bir enerji tüketimi tahmini sağlamaya bile çalışır.
Renk analizi (veya İngilizce leke analizi ), bir bilgisayar sistemindeki ilerlemelerini izlemek için verileri renklendirmektir. Bu veriler, bir sabit diskte, RAM'de depolanan değişkenlerde veya herhangi bir donanım kaydında dolaşan diğer bilgilerde saklanan dosyalar olabilir . Renklendirilmiş verilere bağlı olan tüm programlar daha sonra renklendirilir.
Doğrudan bir makineye uygulanan donanım bileşenleri (fiziksel veya daha sonra öykünme ) aracılığıyla veya başka bir şekilde yazılım sayesinde kurulabilir . Doğrudan malzeme üzerine bir renklendirme sistemi kurarak, her bileşenden geçen verileri kontrol etmek çok daha kolaydır. Örneğin, klavye düzeyinde bir girişi renklendirmek, web formundaki bir girişi renklendirmekten daha iyidir. Eğer kötü niyetli yazılım (örneğin) oluşturarak algılamayı önlemek için deneyebilirsiniz kanca s klavye giriş web tarayıcısını ulaşmadan önce denir ki (bir programın normal işleyişini değiştiren). " Bununla birlikte, fiziksel bileşenler eklemek yorucu olabilir. Ve bu bileşenler benzetilirse, gözlemlenen programın çalışması yavaşlayabilir. Gölge analizi için birkaç olası kullanım durumu olabilir:
Renk tonu analizleri, kullanıcı ihtiyaçlarına göre davranışlarını belirleyen politikalarla yönetilir. Her politikanın 3 özelliği vardır: renk tonunun bir programa dahil edilme şekli; yürütme sırasında başka bir programa nasıl yayıldığı; çalışma sırasında nasıl kontrol edilir. Aynı anda birkaç boya politikası bir arada bulunabilir.
Gölge analizinin bazen yanlış pozitiflere tabi olabileceğini unutmayın.
Bir programda hataların ortaya çıkmasına neden olmanın bir yolu, bir fuzzer (örneğin, AFL) kullanmaktır. Bu tür bir program genellikle kaynak kodda herhangi bir değişiklik gerektirmez ve kodu çökertmek için rastgele girdi verileri üretir . Bir fuzzerin etkinliği genellikle sağladığı kod kapsamı ile ölçülür (kod ne kadar çok çalıştırılırsa fuzzer o kadar iyi olur ). Karşı programın yanıt süreleri dışında herhangi bir bilgi sahibi olmadan rastgele girdiler üreten ve çökmüşse kara kutu fuzzer adı verilen bu programa denir .
Genellikle beyaz kutu fuzzers olarak adlandırılan birçok fuzzer , sembolik yürütme ( statik analiz ) ve dinamik analizin bir karışımını kullanır . Kodun farklı dallarını keşfetmek için hangi parametrelerin kullanıldığını belirlemek için sembolik yürütmeyi kullanırlar. Daha sonra daha geleneksel bir fuzzer kullanarak böcek araması normal olarak gerçekleştirilir.
Örneğin, aşağıdaki kodun bir hatayı tetikleme olasılığı 2'de 32'dir :
void foo(int c) // la variable que le fuzzer va pouvoir faire varier { if ((c + 2) == 12) abort(); // une erreur }Girerek ifdurumu c + 2 == 12sadece sembolik yürütme yoluyla, valide edilmez, eğer belirlemek mümkündür c10'a eşit olmuştu ardından program kodunun diğer dalı ödünç olurdu. Bu nasıl fuzzer programın tüm dallarını girmek için uygun değerler seçecektir. Bu, hataların daha hızlı ve daha karmaşık görünmesini sağlar.
Kodda hata ayıklamanın yaygın bir yolu, kodu elle kullanmaktır. Yani, yürütme sırasındaki davranışını gözlemleyin ve neyin yürütülüp yürütülmediğini ve hatanın ne zaman bulunduğunu bilmek için baskılar ekleyin . Bir programı bir hata ayıklayıcıda çalıştırmak , kodunu değiştirmek zorunda kalmadan hatanın kaynağını hızlı bir şekilde bulmanızı sağlar .
Genellikle hata ayıklayıcılar, program çalışırken birkaç işleme izin verir:
Ancak bu işlemler, kod derleyici tarafından optimize edilebileceğinden açık değildir . Ve optimizasyonlar arasında derleyici değişkenleri kaldırabilir veya satırları yeniden düzenleyebilir ve satır numaralarını kaybedebilir.
Microsoft'un , kodlarını test etmek için bir yöntem olarak çokça fuzzer kullandığını unutmayın . Öyle ki, herhangi bir kodu üretime sokmadan önce bu bir prosedür haline geldi.