Eppur si muoveva…

Nel mio precedente post di stamattina riportavo un’alternativa per l’implementazione di INotifyPropertyChanged basata sullo StackTrace.

Come si evince dallo stesso Namespace, la classe StackTrace viene utilizzata per scopi relativi alla diagnostica, quindi il primo pensiero quasi naturale é stato “ok, in release non andrà”!
Poi penso... beh, ma Exception ha una property StackTrace che funziona anche in Release.

Creo un progettino Console di prova, creo un po’ di metodi “a cascata” per riempire lo StackFrame. Compilo in Release, copio solo l’eseguibile… Funziona!

Ohibò!

Erroneamente convinto del risultato, passo all’implementazione. Il tempo stringe, vorrei “evadere” l’argomento e non provo più in “stand-alone”.

Dopo la segnalazione di Corrado, riprovo, con risultati strani (lo StackTrace traccia solo alcuni passaggi saltandone alcuni intermedi) fino a quando arrivo a verificare che in Release probabilmente lo “scope” del tracciamento effettivamente avviene ma è solo interno alla classe o qualcosa di simile. (E mi verrebbe da chiedermi come funziona Exception.StackStrace...)

Morale: ricordo a me stesso ancora una volta che nonostante il tempo sia tiranno, non bisogna mai aver fretta di arrivare alla conclusione. Devo imparare a pensare “piuttosto lascia perdere”...

Print | posted @ lunedì 3 agosto 2009 19:40

Comments on this entry:

Gravatar # re: Eppur si muoveva…
by Phillo at 03/08/2009 20:52

A sentimento nella tua soluzione io vedo due problemi:
1) La chiamata per recuperare lo StackFrame di un metodo credo sia una chiamata che, internamente, usa la reflection. Questo ha probabilmente degli impatti di performance, se usi lo StackFrame dentro la gestione degli errori (come immagino faccia Exception.StackTrace) probabilmente il costo è minimale confrontato al costo della generazione dell'eccezione e comunque è un evento eccezionale, usato in un metodo chiamato spesso mi preoccupa
2) Direi che StackFrame probabilmente è "non deterministico" perchè quando il codice viene Jittato il comportamento tra debug e release è diverso, in debug sicuramente ogni metodo viene Jittato in un metodo a parte, in release il framework potrebbe decidere di fare inlining di pezzi di codice e quindi potresti avere dei problemi
Gravatar # re: Eppur si muoveva…
by Mario Duzioni at 04/08/2009 16:31

x Phillo:
Grazie. Riguardo al punto 1, ovviamente banalizzando, avevo visto che la Exception.StackTrace richiama anche il metodo internal Environment.GetStackTrace, che a sua volta crea una nuova istanza di StackTrace. Quindi ci sarà qualche passaggio, nella gestione dello StackTrace da parte dell'Exception, che non comprendo.

x Luca e Vlad:
Grazie per la "pacca sulla spalla"! :-)
Comments have been closed on this topic.