Szoftverfejlesztés .NET platformon - Jegyzet 10. fejezet

A VIK Wikiből
Ugrás a navigációhoz Ugrás a kereséshez

Ez az oldal a korábbi SCH wiki-ről lett áthozva. Az eredeti változata itt érhető el.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor kérlek javíts rajta egy rövid szerkesztéssel.

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót


70-536 .NET framework 2.0 Application Development Foundation

%TOC{depth="3"}%

Alkalmazás nyomon követése

Logolás

Az alkalmazások bejegyzéseket helyezhetnek el a központi windowsos eseménynaplóban. Cserébe oda kell figyelni, hogy =EventLog= objektumokat soha ne adjunk át kevésbé megbízható kódnak. A legjobb, ha a részlegesen megbízható kód egyáltalán nem kap

EventLogPermission

-t. A logolás erőforrásigényes művelet, úgyhogy csínján kell bánni vele.

Log bejegyzések felvétele, visszaolvasása és törlése

  • Log típusa lehet =EventLogEntryType.Error=, =FailureAudit=, =SuccessAudit=, =Warning= és =Information=.
  • Bejegyzés hozzáadása
EventLog demoLog = new EventLog("demo");
demoLog.Source = "demo";
demoLog.WriteEntry("CreateEventLog called", EventLogEntryType.Information);
	  
  • Bejegyzések olvasása
EventLog demoLog = new EventLog();
demoLog.Log = "demo";
foreach (EventLogEntry demoEntry in demoLog.Entries)
	 Console.WriteLine(demoEntry.Source + ": " + demoEntry.Message);
	  
  • Log kiürítése
EventLog demoLog = new EventLog("demo");
demoLog.Source = "demo";
demoLog.Clear();
	  
  • Log törlése: =EventLog.Delete("demo")=

Beépített logok:

  • =Application=: =EventLog myLog = new EventLog("Application", machineName, applicationName);=
  • =System=: =EventLog myLog = new EventLog("System")=
  • =Security=
  • saját: a =Source= attribútumot később nem lehet megváltoztatni.

Ha már létezik a log, kapcsolódik hozzá

Debuggolás

=Debugger= osztály

  • =Break()=: breakpointként működik, jól használható breakpoint feltételes elhelyezéséhez
  • =IsAttached=: hozzá van-e csatolva a processzhez
  • =IsLogging=: most éppen logol-e
  • =Launch()=: elindítja és processzhez csatolja a debuggert
  • =Log()=: küld egy üzenetet a csatolt debuggernek, ha létezik. Az üzenet a listenereknek továbbítódik.

=Debug= osztály

  • =Assert(feltétel)=: ellenőrzi a feltételt, és kiír egy üzenetet, ha nem teljesült
  • =Flush=, =Close=
  • =Fail=: hibaüzenetet ír ki
  • =Indent=, =Unindent=: behúzás (xml-be logoláskor)
  • =Print=: üzenetet ír ki a listenekre
  • =Write[Line][If]=: VS Output ablakába ír (Debug ill. Trace listenereknek küld üzenetet)

Debugger attribútumok

  • =[DebuggerBrowsable]=: mit mutasson a tagváltozóból
    • értékei: =DebuggerBrowsableState.Never=, =Collapsed=, =RootHidden=
  • =[DebuggerDisplay]=: =ToString()= debuggeres megfelelője, ez jelenik meg a struktúra becsukásakor.

Pl. =[DebuggerDisplay("CompanyName = {_companyName}, CompanyCity{_companyCity}")]=

  • =[DebuggerHidden]=: breakpointnál nem áll meg
  • =[DebuggerNonUserCode]=
  • ...

=Trace= osztály: release módban is működik

  • =AutoFlush=, =Close=, =Flush=
  • =Indent=, =Unindent=
  • =Listener= (lehet =DefaultTraceListener=, =TextWriterTraceListener=, =XmlWriterTraceListener=, =ConsoleTraceListener=, ...)
  • =Write[Line][If]=
  • ...

Listenerek

Listener regisztrálása

A regisztráció végezhető kódból vagy

app.config

-ból.

TraceSource demoTrace = new TraceSource("DemoApp");
demoTrace.Listeners.Add(new ConsoleTraceListener());
demoTrace.Switch = new SourceSwitch("DemoApp.Switch", "Information");  // logolási szint
demoTrace.TraceInformation("Before writing to Console");
Console.WriteLine("Writing to the Console");
demoTrace.TraceInformation("After writing to Console");

vagy

a =configuration/system.diagnostics/trace/listeners= csoportot kell bővíteni.

Listenerek típusai

  • =DefaultTraceListener=: az Output ablakhoz kapcsolódik
  • =TextWriterTraceListener=: szöveges file-ba vagy streambe írja az üzeneteket
  • =XmlWriterTraceListener=: XML-be logol.
  • =EventLogTraceListener=: windowsos Event Logot hízlalja

A =CorrelationManager= osztály segít több logikailag elkülönülő trace-t kezelésében.

Teljesítmény monitorozása

A =PerformanceCounter= komponens a Windows Forms toolbox Components szakaszában található. A Windowsban rengeteg beépített counter található, a legtöbb erőforrás állapota mérhető velük. Egy

PerformanceCounter

-t azonosít:

  • Computer name
  • Category name
  • Category instance
  • Counter name

Létrehozáskor át kell adni egy =CounterCreationData= objektumot, ami tartalmazza a counter rövid és hosszú nevét, illetve a típusát. Az egyedi counterek az =PerformanceCounterCategory= osztállyal rendezhetők csoportokba. A =PerformanceCounterCategory= 5 statikus metódussal rendelkezik:

  • =Create()=
  • =Delete()=
  • =Exists()=
  • =GetCategories()=
  • =ReadCategory()=

Példa:

private static PerformanceCounter HeapCounter = null;
private static PerformanceCounter ExceptionCounter = null;
private static Timer DemoTimer = new Timer(3000);

HeapCounter = new PerformanceCounter(".NET CLR Memory", "# Bytes in all Heaps");
HeapCounter.InstanceName = "_Global_";
ExceptionCounter = new PerformanceCounter(".NET CLR Exceptions", "# of Exceps Thrown");
ExceptionCounter.InstanceName = "_Global_";

Console.WriteLine("# of Bytes in all Heaps : " + HeapCounter.NextValue().ToString());
Console.WriteLine("# of Framework Exceptions Thrown : " + ExceptionCounter.NextValue().ToString());

Stack nyomon követése

A =StackTrace= osztálytól kérdezhető le a stack aktuális állapota, azaz a

StackFrame

-ek listája.

Exception elkapásakor a =StackTrace= property-jéből lekérdezhető az exception bekövetkezésekor a stack állapota.

Processzek

=Process= osztály

  • =GetCurrentProcess()=
  • =GetProcesses()=: összes futó processz felsorolása
  • =GetProcessByName()=
  • =GetProcessById()=

Processz indítása: =Process.Start(new ProcessStartInfo(file))=. A =ProcessStartInfo= property-i:

  • =FileName=
  • =Arguments=
  • =UserName=: melyik felhasználó nevében fusson
  • =Password=: biztonsági okokból =SecureString= osztályban kell tárolni
  • =UseShellExecute=: ha másik felhasználó nevében akarjuk indítani, false-ra kell állítani

Windows Management Instrumentation

A =System.Management= névtérben található. Windowst lehet vele scriptelni. El tudjuk vele érni azokat a windowsos objektumokat, amit a menedzselt környezetből nem lehetne.

  • logikai lemezmeghajtók
  • hálózati adapterek
  • pause-olt service-ek

Fel lehet iratkozni a management eseményekre is:

  1. létre kell hozni egy =ManagementEventWatcher= objektumot
  2. ki kell tölteni a query-t
  3. meghívni a =WaitForNextEvent()= metódusát
  4. a =Stop()= metódussal leállítani a figyelést
EventQuery demoQuery = new EventQuery();
demoQuery.QueryString =
	 "SELECT * FROM __InstanceCreationEvent WITHIN 2 " +
	 "WHERE TargetInstance isa \"Win32_Service\" AND TargetInstance.State = 'Paused'";
ManagementEventWatcher demoWatcher = new ManagementEventWatcher(demoQuery);
demoWatcher.Options.Timeout = new TimeSpan(0, 0, 10);
Console.WriteLine("Open an application to trigger WaitForNextEvent");
ManagementBaseObject Event = demoWatcher.WaitForNextEvent();
demoWatcher.Stop();

-- Peti - 2007.06.27.