2013-06-03 17 views
12

Tak, w punkcie przerwania mam instancję obiektu losowego. Chcę dowiedzieć się, które obiekty mają wskaźnik do tego obiektu. Czy jest sposób, aby to zobaczyć w konsoli debuggera? Może coś, co pokazuje mi wszystkie przedmioty, które zatrzymują obiekt?LLDB: Pokaż wszystkie obiekty ze wskaźnikiem do obiektu w pamięci

Przykład: Mam instancję NSViewController i chcę zobaczyć wszystkie inne obiekty, które posiadają wskaźnik tej instancji kontrolera widoku. Byłoby to pomocne, ponieważ pozwoliłoby mi zobaczyć hierarchię kontrolera widoku, która hermetyzuje moją instancję.

Po prostu szalona myśl, która mi pomogła.

+1

Nie jestem pewien, czy to możliwe. Nawet środowisko wykonawcze nie utrzymuje tego rodzaju informacji, ponieważ oznaczałoby to, że dziecko ma wiedzę o jego rodzicach (narusza zasady zależności). – CodaFi

+0

Może masz rację. Myślałem raczej o wyszukiwaniu pamięci niemy dla obiektów, które zawierają wskaźnik do 0x2827 ... –

+0

Jednak wyszukiwanie pamięci głupi nie znajdzie obiektów. Znajdzie dane, ale nie będzie wiedział, co one oznaczają. – StilesCrisis

Odpowiedz

26

W lldb, użyj command script import lldb.macosx.heap, aby zainstalować niektóre funkcje wyszukiwania pamięci . Polecenie ptr_refs powinno być w stanie zrobić, co chcesz; użyj ptr_refs --help, aby dowiedzieć się więcej.

+2

'ptr_refs' jest drogą do zrobienia. Jeśli uruchomić aplikację z 'MallocStackLogging = 1 'zmiennej środowiskowej, można zrobić' ptr_refs --stack ADDRESS' i nie tylko zobaczyć wszystkie bloki pamięci, które zawierają ten adres ale ślad kiedy ten blok obiekt/pamięć została przydzielona lub zwolniona. Zauważ, że 'ptr_refs' jest tylko dla aplikacji Mac OS X w tym momencie - sposób, w jaki jest zaimplementowany w Xcode 4.6, uniemożliwia działanie w systemie iOS. –

+2

Z Xcode 6.3 z powodzeniem użyłem 'ptr_refs' na aplikacji na iOS działającej zarówno na urządzeniu (iOS 7.1.2), jak iw symulatorze (iOS 8.3), więc wygląda na to, że nie jest już ograniczone do Mac OS X. – user2067021

+0

@ user2067021, A co zaimportowałeś do działania? 'lldb.ios.heap' nie wydaje się istnieć –

0

Nie jest to wydajne rozwiązanie, lub może być stosowane we wszystkich przypadkach, ale można objąć obiekt, którego szukasz, w metodę dostępową na jednej z klas i umieścić punkt przerwania wewnątrz. Przechodząc przez koniec metody dostępowej, można ostatecznie zobaczyć wszystkie punkty wywołania.

Alternatywnie można usunąć definicję zmiennej, a kompilator wypluje mnóstwo błędów, każde z nich będzie również wywołaniem tego obiektu.

Proponuję użyć ARC, jeśli jeszcze nie jesteś. Najlepiej byłoby, gdyby Twój kod nie był wystarczająco brudny, abyś nie mógł zidentyfikować referencji czytając kod, ARC może trochę pomóc w tym departamencie.

Powiązane problemy