Belirli bir özelliği uygulayan kaynak kodu nasıl bulunur? [kapalı]


14

Bir masaüstü uygulamasında hangi kodun belirli bir özelliği uyguladığını bulmak için bazı tekniklerin ne olduğunu merak ediyordum.

Ben sadece web programlama etrafında yatan profesyonel programlama deneyimi ile, küçük bir geliştirici. Web'de bunu yapmak daha kolaydır. Örneğin, tarayıcı araçlarıyla bir düğmeyi "inceler" ve tıkladığınızda ne yapıldığını görebilirsiniz. Ve sonra, tam kaynak koduna sahip olduğunuzu varsayarsak, çağrıların hiyerarşisini ayrıntılı olarak inceleyebilirsiniz.

Ancak bunu masaüstü uygulamalarında nasıl yapıyorsunuz? En azından, tam kod tabanına dalmak zorunda kalmadan?


6
Kodu okumak yerine, bazen bir hata ayıklayıcı kullanabilirsiniz. Bunun nasıl çalıştığı (ve sizin için ne kadar kullanıcı dostu olduğu) kullanılan dile, hata ayıklayıcı ve hata ayıklayıcı arayüzüne bağlıdır. Her durumda, bir hata ayıklayıcı kullanmak öğrenilecek bir sanattır - ancak öğrenildikten sonra çok güçlü bir araçtır. Kendimi bir süre kullanmayı öğrenmeliyim.
amon

Kesme noktalarını nerede ayarlamalıyım?
py_script

Kesme noktasının kurulumu tamamen uygulamanıza ve nasıl düzenlendiğine bağlıdır.

2
Backbone.js ve şablonlar gibi daha popüler hale gelen yeni nesne yönelimli sistemlerle web arayüzlerinin nerede ve nasıl yapıldığını "incelemek" ve görmek aslında biraz zor olabilir.
NoBugs

1
@jeffo Örneğin, bir uygulamada Dosya-> Aç (LibreOffice'in Yazarı diyelim) yaptığınızda, bunun arkasındaki çağrı sırasını nasıl bulabilirsiniz?
py_script

Yanıtlar:


21

Geri İzleme

Geri izleme, özellikle ilişkili bir olayın bitiş noktasını bulmaktır (aşağıya bakın). Bir kez orada, hata ayıklayıcı bir kesme noktası yerleştirilir. Özellik tetiklenir ve hata ayıklayıcı durduğunda. Çağrı yığını, çağrı yolunu izlemek için gözden geçirilir. Çağrı yığınını yürürken değişken durumlar hakkında notlar alabilir veya olayı tekrar incelemek için yeni kesme noktaları yerleştirebilirsiniz.

Özellik tekrar tetiklenir ve hata ayıklayıcı yeni kesme noktalarında durur. Daha sonra hedef bulunana kadar izlemeyi tekrarlayabilir veya ileri izlemeyi gerçekleştirebilirsiniz .

Artılar ve eksiler

  • Çağrı yığınına çıkmak ve bir yere nasıl geldiğinizi görmek her zaman daha kolaydır.
  • Bir uç noktaya ulaşmadan önce doğru olması gereken milyonlarca koşul olabilir. Son noktayı zaten biliyorsanız, kendinize çok iş kazandınız.
  • Özellik bozulursa. Asla son noktaya ulaşamazsınız ve nedenini anlamaya çalışırken zaman kaybedilebilir.

Uç Nokta Keşfi

Bir özelliği hata ayıklamak için kaynak kodda nihai hedefe ulaşıldığını bilmelisiniz. Kodun oraya nasıl geldiğini görmek için yalnızca bu noktadan itibaren geri adım atabilirsiniz . Bir örnek; Geri almanın nasıl yapıldığını anlamak. Koddaki şeylerin geri alındığını biliyorsunuz, ancak işlerin oraya nasıl ulaştığını bilmiyorsunuz . Bu , özelliğin nasıl çalıştığını anlamak için geri çekilmeye aday olacaktır .

İleri İzleme

İleri izleme, bir özellikle ilişkili bir olayın başlangıç ​​noktasını bulmaktır (aşağıya bakın). Bir kez orada, günlük iletileri kaynak koduna eklenir veya kesme noktaları ayarlanır. Bu işlem, özelliğin hedefini bulana kadar başlangıç ​​noktasından uzaklaştıkça tekrarlanır .

Artılar ve eksiler

  • Bir özellik bulmak için en kolay başlangıç ​​noktasıdır.
  • Kod karmaşıklığı, ileri izlemenin etkinliğini azaltır. Kodda ne kadar çok koşul varsa, yanlış yöne gitme şansınız o kadar artar.
  • İleriye doğru izleme, genellikle ilgisiz olaylar tarafından tetiklenecek kesme noktalarının ayarlanmasıyla sonuçlanır. Hata ayıklama işlemini yarıda kesme ve aramanıza müdahale etme.

Başlangıç ​​Noktası Keşfi

Anahtar kelimeler, kullanıcı arabirimi tanımlayıcıları (düğme kimlikleri, pencere adları) veya özelliğiyle ilişkilendirilmiş bulunması kolay olay dinleyicileri kullanabilirsiniz. Örneğin, geri alma özelliğini tetiklemek için kullanılan düğmeyle başlayabilirsiniz .

Eleme süreci

Bunu başlangıç ​​noktası ve bitiş noktası konumlarına kıyasla orta nokta olarak düşünebilirsiniz . Bir özellikte bir kod parçasının kullanıldığını zaten bildiğinizde, eleme işlemini gerçekleştirirsiniz , ancak bu, özelliğin başlangıcı veya sonu değildir.

Orta noktadan aldığınız yön , giriş ve çıkışların sayısına bağlıdır. Kod yığını birçok yerde kullanılıyorsa , bu konumdan geriye doğru izleme , hepsinin incelenmesi gerektiğinden çok zaman alabilir. Daha sonra bu listeyi azaltmak için bir eleme işlemi uygularsınız. Alternatif olarak, bu noktadan itibaren ileri bir izleme gerçekleştirebilirsiniz , ancak yine de kod yığını birçok yere dallanırsa bu da bir sorun olabilir.

Özellik için açıkça yürütülmeyecek yolları izlemeyerek konum yönlerini azaltmanız gerekir. Bu kodu geçerek ve yalnızca özellikle ilgili olabilecek kesme noktalarını yerleştirerek.

Orta nokta hata ayıklama genellikle daha gelişmiş IDE özellikleri gerektirir. Kod hiyerarşisini ve bağımlılıklarını görebilme. Bu araçlar olmadan yapmak zor.

Artılar ve eksiler

  • Orta noktalar , özelliği düşündüğünüzde genellikle kafanıza giren ilk kod parçasıdır. Kendinize "Ah, bunun çalışmak için XXXX kullanması gerekiyor" diyorsunuz.
  • Orta noktalar başlangıç ​​noktalarını en kolay şekilde ortaya çıkarabilir .
  • Orta noktalar , senkronizasyon veya diş açma değişiklikleri nedeniyle kaybolduğunda izi bir özelliğe götürmenin kolay bir yolu olabilir.
  • Orta noktalar sizi aşina olmadığınız kodlara götürebilir. Neler olup bittiğini öğrenmek için size zaman kazandırıyor.

Teşekkürler Matthew, harika bir yaklaşım. Peki bir başlangıç ​​noktasını nasıl bulursunuz (benden başka herkes için açıksa özür dilerim)?
py_script

@py_script Hangi programlama dilinde sorun yaşıyorsunuz?
Reactgular

Bu benim sahip olduğum belirli bir sorunla ilgili değil, ama ana Masaüstü programlama dilim Java, bu yüzden devam
edelim

11

Özelliğin bir Düğme veya Menü gibi bazı UI şeylerine bağlı olduğunu varsayarsak, yapmaya eğilimli olduğum şey (çok sıkıcı ama işe yarıyor). Bu bir hata ayıklayıcı kullanarak değil Kaynak Kodu üzerinden bakmaktadır .

  1. Düğmedeki (umarım farklı) metni arayın, örneğin "Süper Özellik X3".
  2. Muhtemelen sabit bir dosyada, örneğin SUPER_BUTTON_3 = "Super Feature X3". İleride başvurmak için bu dosya adını unutmayın.
  3. Başka bir soyutlama katmanı (hatta iki tane) olabilir, Düğme tarafından kullanılan "gerçek" Dizeyi almak için aramaya devam edin. Bunun gelecek için nasıl yapıldığına dikkat edin.
  4. Şimdi bu sabit üzerinde arama yapın. Umarım şimdi Düğmeyi bulmuşsundur. Belki de bu noktada ActionListener'ı bağlarlar. (Burada Java-ese kullanıyorum, YMMV, ancak konsept hala geçerli)
  5. Gerekirse, bu Düğmeyi arayın ve sonunda bir Dinleyiciye nerede bağlandığını bulacaksınız.
  6. Belki de bu dinleyici, diğer sabitleyicilere ("gerçek" işlevsellik) gerçekten değişmeze dayalı olarak yeniden yönlendirir, eğer öyleyse, if / else veya case deyimini izleyin. NOT : Merkezi bir sevk işi varsa, bu kesme noktalarını ayarlamak için harika bir yerdir .
  7. Son olarak, gerçek kodda olmalısınız.

@ Amon'un belirttiği gibi, bazen bir Hata Ayıklayıcı daha basittir ...


İlginç olan ... neyse ki bu tür isimler genellikle kodda sabit kodlanmıştır :)
py_script

3
  • İlgili herhangi bir kod bulabilirseniz, kaynak kontrol yazılımınızı kullanarak bunu ekleyen tüm taahhütleri veya yakındaki taahhütleri gösterebilirsiniz. Bu, size bu özelliği uygulamak için gereken her şeyi göstermelidir.

  • Bakmak için bir başlangıç ​​noktası bulmanın kolay bir yolu, kod tabanınızdaki düğmeyi kullanarak metni aramaktır.

  • Çoğu zaman, insanlar taahhüt iletilerinde sorun izleyicisinden bir sorun kimliği koyacaktır. Özellik isteğini açıklayan bir sorun bulursanız, bu sorun kimliğine sahip taahhütleri arayabilirsiniz.


Bu akıllı bir yaklaşım ama bence sadece şirket ortamlarında çalışıyor. Sadece bir tarball'ınız varsa ne olur?
py_script
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.