Z komendy Make Object ID korzystam już od bardzo dawna, nie codziennie ale w niektórych sytuacjach jest ona nieodzowna. Ostatnio zorientowałem się jednak, że nawet doświadczeni użytkownicy VS mogą o niej wiedzieć i stąd pojawił się pomysł na ten post.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4Y-NTRAYAcKS9_ArxHdMdl2Ju4jjwSHFs7mvx6zfqVhCLjP9OagSAMbGYiVXe-OvyP-uhi2vysrxHl45FzlTTwQhJ7tHEpbhaxw-hfq0IdwKVq5Ikmf-_PkhDNQU6Qh_aOexWj1gX8A21/s1600/MakeObjectIDCommand.jpg)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB6VroiYFi7Ua4QUyuFdNUDFoxNl8Eakd-v9WypzopkJa8WalAUi50BqNSXPa7oHEY8HmdtD-sWpd1LO7q9T2r4yiubTALKGq5fONHEzQnmoGiGz4AeMYsBQ3YA5UPl-7EynO-rhDmi06N/s1600/MakeObjectIDCommand2.jpg)
Make Object ID to komenda (pokazana na powyższych zrzutach ekranu), która dostępna jest z poziomu menu kontekstowego w okienku Locals i Watch czy też z poziomu edytora kodu. Po jej wywołaniu dla danego obiektu zostanie wygenerowany identyfikator. Nadanie identyfikatora objawia się tym, że w oknie Locals czy też Watch w kolumnie Value zostanie dodany przyrostek {ID#}.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUi1lr5PlT1oV_7hV-WuyE5HDvs9TYZosmFtsymNyfD6SeypblcKzq2k29LkBAsG0Bgm3ApuTcmC_DmghdAqq9Aoafp-TqtMnB0Y2M7dp4aNB2yx3vnMPrhDF6WEM025w63ZP4TrduJBHg/s1600/NewIdentifier.jpg)
Mając taki identyfikator możemy w dowolnym momencie debugowania programu odwołać się do danego obiektu i podejrzeć jego zawartość wpisując w okienku Watch identyfikator w formacie ID#. Co najważniejsze możemy to zrobić nawet jeśli w danym momencie nie mamy dostępu (referencji) do danego obiektu:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaEv7MeZKyR7m9dnEcdP6-ouom7RWbdhqyMWSsWm1Mu3dGMd8uSEXkg8LB0YFgg3Rk3BdQbhoYdyvsEadJ-gozhDhwwqj94Go0k0AbYaAyq3LNq4R0u7z7IhrdPR6DXs_oKvK_I-Ja81Em/s1600/IdentifierUsedInWatch.jpg)
Wyobraźmy sobie, że debugujemy problem i dochodzimy do wniosku, że stan jakiegoś obiektu zmienił się w niepowołany sposób pomiędzy jego utworzeniem/zainicjowaniem, a miejscem użycia. Niestety prześledzenie "drogi" jaką przebył obiekt krok po kroku jest bardzo trudne. W międzyczasie wywołanych zostało setki jeśli nie tysiące metod, kod jest skomplikowany, uzyskanie referencji do danego obiektu jest w wielu miejscach trudne lub niemożliwe itd. W tym przypadku Make Object ID ułatwi nam znalezienie miejsca gdzie obiekt został popsuty. W praktyce mogłoby wyglądać to tak:
Na koniec dwie uwagi. Spotkałem się z informacją, że Make Object ID jest dostępne tylko w Visual Studio w wersji Ultimate. Nie mam teraz dostępu do innej wersji środowiska więc nie mogę tego zweryfikować. Po drugie, o ile wiem, nie istnieje sposób aby wylistować listę obiektów i nadanych im identyfikatorów. W praktyce trzeba więc albo zapamiętać albo zapisać sobie na kartce nadane identyfikatory.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4Y-NTRAYAcKS9_ArxHdMdl2Ju4jjwSHFs7mvx6zfqVhCLjP9OagSAMbGYiVXe-OvyP-uhi2vysrxHl45FzlTTwQhJ7tHEpbhaxw-hfq0IdwKVq5Ikmf-_PkhDNQU6Qh_aOexWj1gX8A21/s1600/MakeObjectIDCommand.jpg)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB6VroiYFi7Ua4QUyuFdNUDFoxNl8Eakd-v9WypzopkJa8WalAUi50BqNSXPa7oHEY8HmdtD-sWpd1LO7q9T2r4yiubTALKGq5fONHEzQnmoGiGz4AeMYsBQ3YA5UPl-7EynO-rhDmi06N/s1600/MakeObjectIDCommand2.jpg)
Make Object ID to komenda (pokazana na powyższych zrzutach ekranu), która dostępna jest z poziomu menu kontekstowego w okienku Locals i Watch czy też z poziomu edytora kodu. Po jej wywołaniu dla danego obiektu zostanie wygenerowany identyfikator. Nadanie identyfikatora objawia się tym, że w oknie Locals czy też Watch w kolumnie Value zostanie dodany przyrostek {ID#}.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUi1lr5PlT1oV_7hV-WuyE5HDvs9TYZosmFtsymNyfD6SeypblcKzq2k29LkBAsG0Bgm3ApuTcmC_DmghdAqq9Aoafp-TqtMnB0Y2M7dp4aNB2yx3vnMPrhDF6WEM025w63ZP4TrduJBHg/s1600/NewIdentifier.jpg)
Mając taki identyfikator możemy w dowolnym momencie debugowania programu odwołać się do danego obiektu i podejrzeć jego zawartość wpisując w okienku Watch identyfikator w formacie ID#. Co najważniejsze możemy to zrobić nawet jeśli w danym momencie nie mamy dostępu (referencji) do danego obiektu:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaEv7MeZKyR7m9dnEcdP6-ouom7RWbdhqyMWSsWm1Mu3dGMd8uSEXkg8LB0YFgg3Rk3BdQbhoYdyvsEadJ-gozhDhwwqj94Go0k0AbYaAyq3LNq4R0u7z7IhrdPR6DXs_oKvK_I-Ja81Em/s1600/IdentifierUsedInWatch.jpg)
Wyobraźmy sobie, że debugujemy problem i dochodzimy do wniosku, że stan jakiegoś obiektu zmienił się w niepowołany sposób pomiędzy jego utworzeniem/zainicjowaniem, a miejscem użycia. Niestety prześledzenie "drogi" jaką przebył obiekt krok po kroku jest bardzo trudne. W międzyczasie wywołanych zostało setki jeśli nie tysiące metod, kod jest skomplikowany, uzyskanie referencji do danego obiektu jest w wielu miejscach trudne lub niemożliwe itd. W tym przypadku Make Object ID ułatwi nam znalezienie miejsca gdzie obiekt został popsuty. W praktyce mogłoby wyglądać to tak:
- Generujemy identyfikator dla obiektu w momencie jego inicjalizacji.
- Stawiamy pułapkę w miejscu gdzie podejrzewamy, że obiekt jest już zmieniony.
- Po zatrzymaniu się na pułapce sprawdzamy stan obiektu.
- Jeśli obiekt jest zmieniony to przesuwamy pułapkę w kierunku miejsca gdzie został zainicjowany.
- Jeśli obiekt jest niezmieniony to przesuwamy pułapkę w kierunku przeciwnym do miejsca gdzie został zainicjowany.
- Powtarzamy procedurę.
Na koniec dwie uwagi. Spotkałem się z informacją, że Make Object ID jest dostępne tylko w Visual Studio w wersji Ultimate. Nie mam teraz dostępu do innej wersji środowiska więc nie mogę tego zweryfikować. Po drugie, o ile wiem, nie istnieje sposób aby wylistować listę obiektów i nadanych im identyfikatorów. W praktyce trzeba więc albo zapamiętać albo zapisać sobie na kartce nadane identyfikatory.
1 comments:
Ano niestety tylko w Ultimate... Nic wiec dziwnego iz wiekszosc o tym nie wie :)
Post a Comment