Archiv

Artikel Tagged ‘Fehlersuche’

Probleme mit Visual Studio Formular Designer

11. Januar 2014 Keine Kommentare

Beim Öffnen großer Formulare in Visual Studio Formular Designer (WinForms) tritt teilweise das Problem auf, dass Visual Studio 2012/2013 wegen eines Problems beendet wird. In der Ereignisanzeige wird dabei ein Problem in der KERNELBASE.dll vermerkt.

Die Lösung ist dann eigentlich trivial: Es muss der Dienst Performance Logs & Alerts (pla) gestartet werden.

Es besteht nun die Vermutung, dass der Formulardesigner einfach eine Performance-Warnung melden wollte und das nicht konnte, weil der Dienst nicht aktiv war.

SQL Deadlock durch Autoclose

9. Januar 2014 Keine Kommentare

Seit einigen Monaten nervte in einer Microsoft SQL 2008 Datenbank ein Problem, welches gelegentlich auftrat. Auf die betreffende Datenbank waren ab einem scheinbar zufälligen Zeitpunkt keine schreibenden Zugriffe mehr möglich, lesende Zugriffe aber schon. Ein einfacher Blick nach der Verfügbarkeit reichte also nicht, um die Lauffähigkeit der Datenbank zu testen.

Ein Blick in die Log-Dateien brachte die Erkenntnis, dass diese Datenbank ziemlich oft gestartet wurde (im Gegensatz zu den anderen Datenbanken) und plötzlich ein Fehler 1205 auftrat:

Transaction (Process ID …) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

Danach war die Datenbank schreibend nicht mehr verfügbar, der Fehler 9001 trat auf:

The log for database ‚…‘ is not available. Check the event log for related error messages. Resolve any errors and restart the database.

Select – Abfragen waren davon aber nicht betroffen, da diese ja keine Log-Einträge erzeugen.

Die Lösung wurde in SQL ServerCentral.com beschrieben: Abschalten der Option AutoClose in den Eigenschaften der Datenbank! Da diese Eigenschaft weder bewußt gesetzt worden war, noch benötigt wurde, konnte das Problem so einfach gelöst werden.

KategorienDatenbank Tags: ,

Fehler bei Windows Software RAID Wiederherstellung

16. Oktober 2013 Keine Kommentare

Gestern stand ich vor dem Problem, dass nach einem Festplattenfehler an einem Windows Server 2012 mit dem Tausch einer Festplatte, Windows keinen Spiegel mehr aufbauen konnte. Es kam zu einer klaren Fehlermeldung:

Error – All disks holding extents for a given volume must have the same sector size, and the sector size must be valid.

zu der es auch viele interessante Frage und Antwort Threads gab. Leider brachte mich anfangs kein Tipp wirklich weiter, also hieß es: Ursache suchen und verstehen.

Dabei hat mir das Tool smartctl geholfen. Damit kann man die technischen Daten der Festplatten anzeigen lassen.

Hier die alte Festplatte:

C:\Program Files (x86)\smartmontools\bin>smartctl -x sda
smartctl 6.2 2013-07-26 r3841 [i686-w64-mingw32-2012(64)] (sf-6.2-1)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family: Seagate Barracuda LP
Device Model: ST31000520AS
Serial Number: 5VX0WWJD
LU WWN Device Id: 5 000c50 02511506c
Firmware Version: CC32
User Capacity: 1.000.204.886.016 bytes [1,00 TB]
Sector Size: 512 bytes logical/physical
Rotation Rate: 5900 rpm
Device is: In smartctl database [for details use: -P show]
ATA Version is: ATA8-ACS T13/1699-D revision 4
SATA Version is: SATA 2.6, 3.0 Gb/s

und hier die neue Ersatzfestplatte:

C:\Program Files (x86)\smartmontools\bin>smartctl -x sdb
smartctl 6.2 2013-07-26 r3841 [i686-w64-mingw32-2012(64)] (sf-6.2-1)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family: Seagate Barracuda 7200.14 (AF)
Device Model: ST1000DM003-1CH162
Serial Number: Z1D4RCQ0
LU WWN Device Id: 5 000c50 063a48af4
Firmware Version: CC47
User Capacity: 1.000.204.886.016 bytes [1,00 TB]
Sector Sizes: 512 bytes logical, 4096 bytes physical
Rotation Rate: 7200 rpm
Device is: In smartctl database [for details use: -P show]
ATA Version is: ACS-2, ACS-3 T13/2161-D revision 3b
SATA Version is: SATA 3.1, 6.0 Gb/s (current: 3.0 Gb/s)

Hier wurde sofort klar, dass die Fehlermeldung das Problem sehr genau beschrieb, die physikalischen Sektorgrößen waren unterschiedlich, genauer gesagt kann ich keine Partition, die auf einer 512’er Sektor-Größe liegt, auf eine 4096’er Sektor-Größe spiegeln, weil das Raster passen kann, aber nicht muss. Ein Anruf beim Support mit der Bitte um Ersatz gegen eine neue Austaschplatte mit 512er Sektoren war dann einfach und löste das Problem.

Und hier noch eine Übersicht über die gefundenen Ratschläge, die auf zu finden waren:

Man kann nur identische Festplatten spiegeln, also beide Platten tauschen

Absoluter Quatsch ohne jede Basis. Identische Platten reduzieren nur die Stolperfallen, machen aber eine Clonen oder Neuaufsetzen vom System erforderlich! Man muss nur darauf achten, dass die Kapazität bis auf das Byte genau ausreichend ist, da die normalen Dialoge meist nur MB anzeigen.

Alles Partitionen löschen und gleich neu als Mirror anlegen

Das funktioniert natürlich, aber löst das Problem sehr aufwendig. In dem Falle geht es dann nur, weil das RAID über den kleinsten Nenner geht (Basis auf 4096’er Sektor) und der 512’er Sektor alle Bedingungen erfüllt. Ein Vermeiden der Mischung 4096er/512er Sektoren ist natürlich sinnvoller.

Vererbung von Properties entfernt die Attribute

Für eine Erweiterung von meinem Quellcode hatte ich geplant, ein paar Properties mit Attributen zu versehen. Dabei sollten die Properties virtual sein. Die Abfrage der Attribute sollte dann mittels GetCustomAttributes geschehen. Leider hat das gar nicht funktioniert, was auch schon andere .NET-Programmierer feststellen mussten. Darum habe ich die Problemstellung extrahiert:

Zum Prüfen der Attribute wurde folgende Funktion verwendet:

static void CheckAttribute(MemberInfo memberInfo)
{
    var attributes = memberInfo.GetCustomAttributes(true);
    if (attributes.Length == 0) return;
 
    foreach (object attribute in attributes)
        Console.WriteLine("The type of the attribute in {1} is {0}.", 
            attribute, memberInfo.Name);
}

Weiterhin wurden zwei Klassen geschrieben, wo einmal eine abgeleitete Methode und eine abgeleitete Propertie mit Attributen versehen wurde:

public abstract class BaseClass
{
    [TestAttribute]
    public virtual String TestProperty { get; set; }
 
    [TestAttribute]
    public virtual void TestMethod() { return; }
}
public class DerivedClass : BaseClass
{
    public override string TestProperty { get; set; }
    public override void TestMethod() { base.TestMethod(); }
}
 
public class TestAttribute : Attribute
{
}

Zu guter Letzt wurde das ganze überprüft:

Console.WriteLine("BaseClass:");
CheckAttribute(typeof(BaseClass).GetProperty("TestProperty"));
CheckAttribute(typeof(BaseClass).GetMethod("TestMethod"));
 
Console.WriteLine("DerivedClass:");
CheckAttribute(typeof(DerivedClass).GetProperty("TestProperty"));
CheckAttribute(typeof(DerivedClass).GetMethod("TestMethod"));

Das Ergebnis fiel überraschend aus:

BaseClass:
The type of the attribute in TestProperty is TestAttrib.TestAttribute.
The type of the attribute in TestMethod is TestAttrib.TestAttribute.
DerivedClass:
The type of the attribute in TestMethod is TestAttrib.TestAttribute.

Wähernd die Methode TestMethod in beiden Klassen als mit dem Attribut ausgezeichnet, erkannt wurde, war dies bei der Eigenschaft TestProperty nicht der Fall. Um die Ursache zu finden, war ein Blick in die IL notwendig. Hier die Umsetzung der BaseClass, welche das Attribute in beiden Fällen korrekt definiert.

.method public hidebysig newslot virtual instance void TestMethod() cil managed
{
    .custom instance void TestAttrib.TestAttribute::.ctor()
}
 
.property instance string TestProperty
{
    .get instance string TestAttrib.BaseClass::get_TestProperty()
    .set instance void TestAttrib.BaseClass::set_TestProperty(string)
    .custom instance void TestAttrib.TestAttribute::.ctor()
}

Die Ableitung war aber überaschend umgesetzt. Während die Methode offensichtlich überschrieben wurde, wurde die Propertie quasi neu angelegt, aber ohne dem zugewiesenen Attribut.

.method public hidebysig virtual instance void TestMethod() cil managed
{
}
 
.property instance string TestProperty
{
    .get instance string TestAttrib.DerivedClass::get_TestProperty()
    .set instance void TestAttrib.DerivedClass::set_TestProperty(string)
}

Damit war das Ergebnis der Untersuchung: GetCustomAttributes hat definitionsgemäß auch die Ableitungen untersucht. Jedoch verlieren sich die Attribute beim Überschreiben von Properties. Eine Erklärung dafür habe ich bis jetzt nicht gefunden, ich konnte den Effekt aber in .NET 2.0 – 4.0 nachstellen.

PSSecurityException, obwohl in Powershell die Ausführung von Skripten erlaubt wurde

13. April 2011 2 Kommentare

Beim Ausführen einer Powershell-Datei erhielt ich im Protokoll neulich folgende bekannte Fehlermeldung, obwohl Set-ExecutionPolicy auf RemoteSigned gesetzt war:

Die Datei "...test.ps1" kann nicht geladen werden, da die Ausführung
 von Skripts auf diesem System deaktiviert ist. Weitere
 Informationen erhalten Sie mit "get-help about_signing".
Bei Zeile:1 Zeichen:2
+ . <<<<  '...test.ps1'
    + CategoryInfo          : NotSpecified: (:) [], PSSecurityException
    + FullyQualifiedErrorId : RuntimeException

Die Lösung lag letztendlich darin, dass das entsprechende Skript auf einem 64Bit-System als 32Bit-Task aufgerufen wurde. Es war ausreichend, Set-ExecutionPolicy unter Powershell (x86) ebenfalls aufzurufen und entsprechend zu setzen.

Fehlercode 8004402F beim Installation von Sp1 auf Windows 7

23. März 2011 5 Kommentare

Seit einigen Tagen versuche ich das Servicepack 1 (KB976932) von Windows 7 zu installieren. Immer ohne Erfolg. Der Vorgang startet ganz normal, aber beim Neustart des Rechners läuft die Konfiguration zügig auf 99% hoch, bevor ein Fehler auftritt und alles wieder rückgängig gemacht wird.

Da das ganze ca. eine Stunde dauert, ist jeder Test schwierig und einfach aufwändig. Im Ereignisprotokoll oder WindowsUpdate.log waren leider keine sinnvollen Hinweise zu finden, lediglich kurz nach dem Hochfahren wird der Fehlercode 8004402F angezeigt. Ein ähnliches Problem brachte dann auch noch die Installation vom Internet-Explorer 9.

Glücklicherweise habe ich heute einen recht alten Blog-Beitrag für Windows Vista gefunden, der dann auch half. Mein %TEMP% Ordner war auf Laufwerk D umgestellt. Dieses Laufwerk ist aber ein verschlüsseltes TrueCrypt-Laufwerk, was beim Neustart nicht zur Verfügung steht. Ich habe diesen Ordner wieder auf eine unverschlüsselte Festplatte umgelenkt, und die Installation war erfolgreich.

Schade, dass hier nirgends ein entsprechender Fehler ausgegeben wird. Beim Starten der Installation hätte mir der Hinweis auf einen nicht verfügbaren Temp-Ordner viele Stunden der Suche erspart.

Windows 7, Delphi und das Datumsformat

18. November 2010 Keine Kommentare

Vor kurzem hatten wir auf einem neuen Windows 7 Rechner das Problem, dass die Regionaleinstellungen in der Anwendung nach EN-en aussahen, obwohl DE-de aktiviert war. Andere Windows 7 Rechner zeigten die Probleme nicht. Nach einiger Suche habe ich in einem Forum zwei mögliche Workaround ausmachen können:

1) Man schaltet die Ländereinstellungen auf irgendwas anderes, und dann wieder zurück auf die Wunschsprache.

2) Man fügt in sein Delphi Projekt folgende Unit ein und trägt sie in irgendeiner uses ein.

unit Win7;
 
interface
 
uses
 SysUtils, Windows;
 
implementation
 
initialization
 SetThreadLocale(LOCALE_USER_DEFAULT);
 GetFormatSettings;
end.

Speziell nach Sichtung dieser zwei Zeilen bleibt aber die Frage zurück, ob das ein Problem von Windows 7 oder ein Problem von alten Win32 Anwendungen ist, die sich vielleicht unbewußt nicht an die Vorgaben von Microsoft halten.

Robocopy und seine Rückgabewerte

3. November 2010 Keine Kommentare

Im Rahmen einer Datensicherung mit Acronis sollte das Sicherungsarchiv auf Wechselmedien gespiegelt werden. Dazu bietet sich das Kommandozeilentool Robocopy an, das seit Jahren zum Lieferumfang von Windows gehört und extrem mächtig ist. Grundsätzlich hat es funktioniert, aber der Abschlusstask mit Robocopy wurde von Acronis immer als fehlerhaft bewertet. Nach einer Weile war die Ursache klar: Kommandozeilenbefehle liefern als Rückgabewert üblicherweise

= 0: kein Fehler
> 0: Fehler

Robocopy belegt aber die Codes 0-7 mit Erfolgsmeldungen. Um diesem Verhalten gerecht zu werden, Acronis im Erfolgsfalle aber Null zurückzugeben, wurde eine kleine Batchdatei geschrieben, welche die ErrorLevel 0-7 in 0 umwandelt und in allen anderen Fällen die 8 zurückgibt (der reale Rückgabewert ist bei Fehlern egal, da Robocopy eine Logdatei schreiben kann).

robocopy "Quellpfad" "Zielpfad" "*.TIB" /PURGE
if NOT errorlevel 8 (EXIT /B 0)
EXIT /B 8

Interessant ist hier besonders die Abfrage

if NOT errorlevel 8

, welche quasi für

if errorlevel < 7

steht. Wer nicht so oft Batch-Dateien schreibt, wird von diesem Verhalten oft überrascht.

KategorienAllgemein Tags: , ,

Probleme beim Erstellen einer Solution

10. Oktober 2010 Keine Kommentare

Auf meinem Notebook wurde ich beim Erstellen einer Solution völlig von folgender Fehlermeldung überrascht:

The OutputPath property is not set for this project

Nach einer langen Fehlersuche bin ich dank dieses Beitrags dem Fehler auf die Spur gekommen. Rechner von HP haben (zumindest in meinem Falle) die Umgebungsvariable „Platform = HPD“. Diese muss gelöscht werden, damit Visual Studio die Solutions sauber erstellt. Ich hoffe, dass die HP-Programme danach trotzdem ohne Fehler laufen.

Probleme bei der Verwendung des VisualBasic.PowerPacks

8. September 2010 Keine Kommentare

In einer Visual Studio 2008 Anwendung habe ich die Shapes aus dem VisualBasic PowerPack verwendet, das im Lieferumfang von Visual Studio 2008 SP1 bereits enthalten ist. Nun hat sich ein Anwender aber mit folgender Fehlermeldung gemeldet, obwohl die korrekte Version des PowerPacks im Programm-Verzeichnis mit ausgeliefert wurde:

System.TypeLoadException:
 Could not load type 'Microsoft.VisualBasic.PowerPacks.ShapeContainer'
 from assembly 'Microsoft.VisualBasic.PowerPacks.Vs,
 Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.

Nach einiger Suche war die Ursache klar. Visual Studio 2008 (ohne SP1) kennt diese DLL ebenfalls, nur leider noch ohne Shapes. Unglücklicherweise haben beide DLLs (mit und ohne SP1) die Version 9.0.0.0. Somit wird, sofern im GAC die DLL gefunden wird, automatisch immer die DLL aus dem GAC geladen. Die einzige Lösung ist darum, die DLL im GAC zu löschen oder zu aktualisieren:

Das geht, Admin-Rechte vorrausgesetzt, erstaunlich einfach per Drag & Drop.