2013-06-03 6 views
12

Yani, bir kesme noktasında rasgele bir nesne örneğim var. Bu nesneye hangi nesnelerin işaretçisi olduğunu bulmak istiyorum. Bunu hata ayıklayıcı konsolunda görmenin bir yolu var mı? Belki nesneyi elinde tutan bütün nesneleri gösteren bir şey?LLDB: Tüm nesneleri bir nesneye bir işaretçi ile gösterme

Örnek: NSViewController örneğim var ve bu görünüm denetleyicisi örneğini işaretçiyi tutan diğer tüm nesneleri görmek istiyorum. Bu, yardımcı olacaktır çünkü örneğimi içine alan görünüm denetleyici hiyerarşisini görmeme izin verir.

Sadece çılgınca bir fikrim vardı, bu gerçekten yardımcı olabilirdi.

+1

Bunun mümkün olduğundan emin değilim. Çalışma zamanı bile bu tür bilgileri korumaz, çünkü çocuğun ebeveynin bilgisi olduğu anlamına gelir (bağımlılık kurallarını ihlal eder). – CodaFi

+0

Belki haklısınız. 0x2827 ... –

+0

için bir işaretçi içeren nesneler için bir aptal bellek araması daha düşünüyordum. Verileri bulabilir ama ne için olduğunu bilemez. – StilesCrisis

cevap

26

lldb'de, bellek arama işlevlerini yüklemek için command script import lldb.macosx.heap'u kullanın. . Ptr_refs komutu istediğiniz şeyi yapabilmelidir; Daha fazla bilgi edinmek için ptr_refs --help kullanın.

+2

'ptr_refs' gitmenin yoludur. Uygulamanızı "MallocStackLogging = 1" ortam değişkeniyle başlatırsanız, ptr_refs --stack ADDRESS işlevini kullanabilirsiniz ve yalnızca bu adresi içeren tüm bellek bloklarını değil, o nesne/bellek bloğu ayrıldığında veya serbest bırakıldığında backtrace'i de görebilirsiniz. Ptr_refs'in sadece bu noktada Mac OS X uygulamaları için olduğunu unutmayın - Xcode 4.6'da uygulanma biçimi iOS üzerinde çalışmasını engeller. –

+2

Xcode 6.3 ile Ben hem bir cihazda (iOS 7.1.2) hem de simülatörde (iOS 8.3) çalışan bir iOS uygulamasında ptr_refs'leri başarıyla kullandım, bu yüzden artık Mac OS X ile sınırlı değil gibi görünüyor. – user2067021

+0

@ user2067021, Ve çalışmak için ne ithal ettiniz? 'lldb.ios.heap' mevcut görünmüyor –

0

Etkin bir çözüm ya da her durumda uygulanabilir, ancak aradığınız nesneyi sınıflarınızdan birinde bir accessor yönteminde kapsülleyebilir ve içine bir kesme noktası koyabilirsiniz. Erişim yönteminin sonuna doğru ilerleyerek, tüm çağrı noktalarını görebilirsiniz.

Alternatif olarak, değişkenin tanımını kaldırabilirsiniz ve derleyici tonlarca hata çıkarır, her biri de bu nesneye yönelik bir çağrı olacaktır.

Henüz yapmadıysanız ARC kullanmayı öneririm. İdeal olarak kodunuz, kod aracılığıyla okuyarak referansları tanımlayamayacak kadar dağınık olmaz, ARC bu departmanda biraz yardımcı olabilir