Jakiś czas temu pracując z IntelliTrace próbowałem zdefiniować zdarzenie diagnostyczne dla pewnej metody. Dla ustalenia uwagi niech jej sygnatura wygląda tak, jak poniżej.
string Flip(string s)
Moim celem było, aby opis zdarzenia zawierał wynik zwrócony przez metodę oraz wartość argumentu s. Inaczej mówiąc, aby w oknie IntelliTrace Events View w Visual Studio 2010 zdarzenie zarejestowane dla wywołania metody z argumentem s="Hello" i wynikiem "olleH" wyglądalo tak:
"olleH" Flip("Hello")
O definiowaniu zdarzeń IntelliTrace już pisałem (Własne zdarzenia IntelliTrace!, Własne zdarzenia IntelliTrace 2) dlatego nie będę opisywał całego procesu. Przytoczę już gotową definicję zdarzenia:
string Flip(string s)
Moim celem było, aby opis zdarzenia zawierał wynik zwrócony przez metodę oraz wartość argumentu s. Inaczej mówiąc, aby w oknie IntelliTrace Events View w Visual Studio 2010 zdarzenie zarejestowane dla wywołania metody z argumentem s="Hello" i wynikiem "olleH" wyglądalo tak:
"olleH" Flip("Hello")
O definiowaniu zdarzeń IntelliTrace już pisałem (Własne zdarzenia IntelliTrace!, Własne zdarzenia IntelliTrace 2) dlatego nie będę opisywał całego procesu. Przytoczę już gotową definicję zdarzenia:
<DiagnosticEventSpecification enabled="true"> <Bindings> <Binding> <ModuleSpecificationId>FibTest.exe</ModuleSpecificationId> <TypeName>Utilities</TypeName> <MethodName>Flip</MethodName> <MethodId>Utilities.Flip(System.String):System.String</MethodId> <ShortDescription _locID="shortDescription.Utilities.Flip">"{0}" Flip("{1}")</ShortDescription> <LongDescription _locID="longDescription.Utilities.Flip">"{0}" Flip("{1}")</LongDescription> <DataQueries> <DataQuery index="-1" maxSize="100" type="String" query="" /> <DataQuery index="1" maxSize="100" type="String" query="" /> </DataQueries> <ProgrammableDataQuery> <ModuleName></ModuleName> <TypeName></TypeName> </ProgrammableDataQuery> </Binding> </Bindings> ... </DiagnosticEventSpecification>Niestety ku moje zdziwieniu to nie zadziałało. Zdarzenie zostało zarejestrowane, ale w oknie IntelliTrace Events View zamiast zobaczyć upragniony wynik otrzymałem komunikat: An error occured while fetching the data for this event. Zajrzałem, więc do wcześniej zdefiniowanych przez siebie zdarzeń i przypomniałem sobie o jednej rzeczy. Aby odwołać się do wartości zwróconej przez metodę należy ustawić atrybut onReturn.
... <Binding onReturn="true"> ...Niestety to też nie pomogło. Ponownie zajrzałem więc do wcześniej przygotowanych zdarzeń i na pierwszy rzut oka wszystko wyglądało tak samo. Po chwili zastanowienia doszedłem do wniosku, że przyczyną kłopotów może być to, że próbuję odwołać się zarówno do wartości argumentów jak i do wartości zwracanej przez metodę. Wcześniej czegoś takiego nie próbowałem. Zamiast jednego przygotowałem więc dwa zdarzenia. W jednym odczytuję wartość argumentu przekazanego do metody, a w drugim wynik zwrócony przez metodę.
... <Binding onReturn="false"> ... <ShortDescription _locID="shortDescription.Utilities.Flip">Flip("{0}")</ShortDescription> <LongDescription _locID="longDescription.Utilities.Flip">Flip("{0}")</LongDescription> <DataQueries> <DataQuery index="1" maxSize="100" type="String" query="" /> </DataQueries> ... </Binding> ...
... <Binding onReturn="true"> ... <ShortDescription _locID="shortDescription.Utilities.Flip">Flip returns "{0}"</ShortDescription> <LongDescription _locID="longDescription.Utilities.Flip">Flip returns "{0}"</LongDescription> <DataQueries> <DataQuery index="-1" maxSize="100" type="String" query="" /> </DataQueries> ... </Binding> ...To zadziałało, zostały zarejestrowane dwa zdarzenia, jedno z opisem Flip("Hello"), a drugie z opisem Flip returns "olleh". Moim zdaniem to spore ograniczenie IntelliTrace, ale nie ma rady i trzeba o tym po prostu pamiętać.