C#, refleksja, StackTrace, Method -> jak wydobyć this ?

0

Refleksja, coś tam jest pozyskiwane, pozostawmy na boku.

Uzyskuję StackTrace, jest stos wołających się metod z jakiś typów (klas).
Jak z tych metod (wywołań metod) wydobyć 'this', instancję obiektu, względem którego metoda pracuje ?

jestem nadal w tym stosie, wiec wszelkie ramki (jeszcze) istnieją

1

X/Y?

0
somekind napisał(a):

X/Y?

Tak i nie :-) Zastanawia mnie bardziej po co?
Domyślam się, że program system się wysypuje może w jakiejś pętli, może w przypadku kilku wątków. Jeśli mamy w pamięci kilka obiektów/funkcji, które obrabiają jakieś dane np. każdy obiekt inny rekord to potem z takiego stacktrace nie widać, który to dokładnie obiekt był przyczyną błędu. Czyli wiemy w którym miejscu kodu ale nie wiemy przy którym wywołaniu i jakim zestawie danych.
Inna sprawa, że można to na 100 innych sposobów wyłuskać.

0

Pachnie reverse engineeringiem, ale w debuggerze maszyny wirtualne możesz tego nie osiągnąć, chodź można podpiąć 2 debuggery naraz.
Jeden pod maszynę wirtualną drugi pod proces całej maszyny, oba mogą się nawzajem stopować, dając inny poziom abstrakcji.

Jak z tych metod (wywołań metod) wydobyć 'this', instancję obiektu, względem którego metoda pracuje ?

Masz pewnie na myśli pewną strukturę Jest sobie obiekt w jakiejś zmiennej na stosie, wywołuje swoją metodę, w tej metodzie ma inny obiekt, który wywołuje inną metodę, a ta np. dobiera się do jakiegoś adresu.

Jak z końca wywołania na dole, dojść do góry, są hardwarewe breakpointy, można ustawić na adres pamięci, metodę, zmienną.
Breakpoint wywali na operacji, która próbuje się dobrać do tego adresu czyli funkcję wcześniej i tam będziesz miał wyliczenie pointera czyli adres obiektu+ numer_metody, potem ustawiasz pointer na tym adres obiektu, dostajesz metodę wyżej, która to wywołuje, też podobnie jakiś adres pamięci + relatywne przesunięcie w nim.

Można też próbować stosem, return addresy ściągać i sprawdzać jaki op code przed return adressem, return adres jest zawsze następną instrukcją, na którą trzeba wrócić, i to będzie też ta funkcja wyliczająca adres lub skacząca tam bezpośrednio ze stałym adresem.
Adresy mogą też się zmieniać przy różnych wywołaniach tego samego programu.
Chodź te relatywne przesunięcia metod w obiekcie będą zawsze stałe, albo powinny być.

Pewnie mogą być lepsze sposoby, ale dość dobrze trzeba poznać mechanizmy jak wykonują się wszystkie sekwencje, to może pójdzie jakoś lepiej to obejść.
Najlepiej na prostym przypadku małej klasy, dobrze zrozumieć jak to działa, a potem w większe bagno się wpakować.

Nie debuggowałem zbyt dużo jednocześnie w maszynie wirtualnej i debuggując maszynę, ale może jak połączysz obie metody to coś wymyślisz.
W javie takie podejście działało dość dobrze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1