posts - 644, comments - 2003, trackbacks - 137

My Links

News

Raffaele Rialdi website

Su questo sito si trovano i miei articoli, esempi, snippet, tools, etc.

Archives

Post Categories

Image Galleries

Blogs

Links

lunedì 25 giugno 2012

Windows 8 Release Preview e l'eccezione 0xC000027B

La buona notizia per noi è che la mia azienda ha ottenuto il Token per la pubblicazione di applicazioni Metro-Style sullo store di Windows 8. Attualmente lo Store è ancora chiuso al pubblico a meno che non venga sostenuta una sorta di pre-certificazione.

Mentre stavamo lavorando ad una applicazione di Barcode abbiamo incontrato un'eccezione randomica di tipo 0xC000027B che non ha una storia utile in internet, nè è disponibile una descrizione dell'errore che possa suggerire qualcosa.

Cosa dovrebbe fare in questo caso lo sviluppatore? La normale procedura diagnostica è la seguente:

  • Dalle proprietà del progetto, opzioni Debug, abilitare il "Mixed Mode Debugging". Poiché WinRT e Xaml sono dll native (C++) molti dettagli verrebbero nascosti in assenza dell'abilitazione del debugger nativo.
  • Riprodurre il problema con questi settaggi guardando la "Output Window" in Visual Studio. Quando il debugger nativo/mixed è abilitato potrebbero vedersi più messaggi nella finestra di output.
  • Tenere d'occhio la "Call Stack Window". Se si vede una chiamata del proprio codice dentro lo stack trace, significa avere un buon punto di partenza per capire le cause del problema. Diversamente può essere un problema che si verifica nel loop di rendering, all'interno del thread del dispatcher. In questo caso si vedranno solo liberie Microsoft come la Windows.UI.Xaml.dll.
  • Se si vuole capire cosa stiano facendo le librerie WinRT/Xaml libraries were doing, ovviamente il codice assembler non può essere di aiuto, ma abbiamo ancora un'arma a nostra disposizione. Nella finestra di Visual Studio accessibile da Tools – Options – Debugging – Symbols, abilitare i Microsoft Symbol Servers. Si può usare anche la "Modules Window" per verificare che siano caricati i simboli relativi alle dll usate dall'applicazione.
  • I simboli pubblici daranno un nome di metodo/funzione al codice assember. Non si vedranno i sorgenti ma il nome del metodo può rivelarsi decisamente molto utile.

Ma torniamo al problema che abbiamo riscontrato. La procedura appena descritta non ha aiutato affatto poiché non c'erano simboli pubblici disponibili per Windows.UI.Xaml.dll e l'eccezione era generata da quella dll.

Abbiamo così applicato il vecchio trucco di copiare il progetto in un altra cartella e cancellare tutte le parti della UI fino a che il problema non si verificava più. Si, è un pessimo modo di inseguire un bug ma era anche l'unica possibilità.

E ha funzionato alla grande, scoprendo così che la causa del problema era il tag <Image … /> dentro la Grid usata per eseguire il layout della pagina. Navigando avanti e indietro su questa pagina veniva generata l'eccezione dopo circa 10-20 navigazioni. Abbiamo anche scoperto che ci sono più variabili che cambiano le condizioni del bug, come le transitions e i controlli usati nella pagina verso cui si navigava e persino dal modo in cui viene utilizzato il mouse. Un misto di stregoneria e incantesimi Winking smile.

La soluzione è super-semplice: basta mettere un <Border /> intorno ad ogni singola immagine nell'applicazione… e l'eccezione scompare!

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (1) |

Powered by:
Powered By Subtext Powered By ASP.NET