Suspendere Sie niemals einen Thread im eigenen Prozess!

2025-04-15
Suspendere Sie niemals einen Thread im eigenen Prozess!

Ein Kunde hatte ein langjähriges, aber selten auftretendes Problem mit einem Hängenbleiben: Sein UI-Thread rief den Kernel auf, und der Aufruf hing einfach ohne ersichtlichen Grund fest. Leider konnte der Kernel-Dump keinen Stack aus dem Benutzermodus anzeigen, da der Stack ausgelagert worden war. (Das ist sinnvoll, da ein blockierter Thread seinen Stack nicht verwendet, daher wird dieser Stack ausgelagert, sobald das System unter Speicherplatzmangel leidet.) Die Untersuchung ergab einen Watchdog-Thread, der den UI-Thread periodisch anhält, um eine Stack-Trace zu erfassen, aber dieses Mal hing er über fünf Stunden lang fest. Die Ursache: Eine Deadlock-Situation. Der Watchdog-Thread versucht, eine Stack-Trace des UI-Threads zu erhalten, benötigt aber ein Lock für die Funktionstabelle, während der UI-Thread angehalten und das Lock besitzt. Der Artikel betont, dass man niemals einen Thread in seinem eigenen Prozess anhalten sollte, da dies zu Deadlocks aufgrund von Ressourcenkonflikten führen kann. Um einen Thread anzuhalten und Stacks davon zu erfassen, muss dies von einem anderen Prozess aus erfolgen, um Deadlocks zu vermeiden.

Mehr lesen

Das Geheimnis des passiven USB-zu-PS/2-Mausadapters

2025-03-28
Das Geheimnis des passiven USB-zu-PS/2-Mausadapters

Frühe USB-Mäuse enthielten oft einen grünen Adapter, um den USB-Typ-A-Stecker in PS/2 umzuwandeln. Dies war kein intelligenter Adapter; er war rein mechanisch, ohne Schaltung. Die Maus selbst führte die Umwandlung durch, indem sie den Signaltyp (USB oder PS/2) erkannte und sich entsprechend anpasste. Es ist vergleichbar mit einem einfachen Netzadapter – die Intelligenz liegt im Gerät selbst, nicht im Adapter. Wenn Sie also einen solchen finden, denken Sie daran, dass es sich nur um einen physischen Stecker handelt; die eigentliche Umwandlung findet in der Dual-Bus-Maus statt.

Mehr lesen
Hardware Mausadapter

Debugging eines Race Conditions: Die RtlRunOnceExecuteOnce-Falle

2025-03-23
Debugging eines Race Conditions: Die RtlRunOnceExecuteOnce-Falle

Ein Kollege stieß während einer wöchentlichen Debugging-Sitzung auf ein kniffliges Nebenläufigkeitsproblem: Ein kritischer Abschnitt verhinderte nicht, dass zwei Threads denselben Codeblock betraten, was zu einem fehlerhaften Doppelaufruf von `TraceLoggingRegister` führte. Eine gründliche Fehlersuche ergab die Ursache: Die Initialisierungsfunktion `InitializeCriticalSectionOnce` für `RtlRunOnceExecuteOnce` gab fälschlicherweise `STATUS_SUCCESS` (0) zurück. Dies führte dazu, dass `RtlRunOnceExecuteOnce` davon ausging, die Initialisierung sei fehlgeschlagen, und den kritischen Abschnitt bei jedem Aufruf erneut initialisierte, wodurch die Race Condition ausgelöst wurde. Die Lösung bestand darin, den Rückgabewert auf `TRUE` zu ändern oder eleganter, `CRITICAL_SECTION` durch `SRWLOCK` zu ersetzen. Dieser Fall verdeutlicht, wie subtile Fehler im Rückgabewert zu schwerwiegenden Folgen führen können und unterstreicht die Bedeutung der Auswahl der richtigen Synchronisierungsprimitive.

Mehr lesen
Entwicklung

TypeScript nativer Compiler: 10-fache Performance-Steigerung

2025-03-11
TypeScript nativer Compiler: 10-fache Performance-Steigerung

Das TypeScript-Team hat einen nativen Port des TypeScript-Compilers und der -Tools angekündigt, um die Leistung drastisch zu verbessern. Diese native Implementierung soll den Editor-Start deutlich beschleunigen, die meisten Build-Zeiten um das Zehnfache reduzieren und den Speicherverbrauch erheblich senken. Erste Tests zeigen eine mehr als 10-fache Verbesserung der Kompiliergeschwindigkeit bei mehreren großen Projekten (z. B. VS Code, Playwright). Der zukünftige native TypeScript (geplant als TypeScript 7) wird erweiterte Refactorings, eine tiefere Codeanalyse und die Grundlage für die nächste Generation von KI-Entwicklungstools bieten. TypeScript 6 (JS-basiert) wird weiterhin gewartet, um einen reibungslosen Übergang zu gewährleisten.

Mehr lesen

Subtiles C++/WinRT Invoke-Problem und dessen Lösung

2025-03-09
Subtiles C++/WinRT Invoke-Problem und dessen Lösung

Ein Pull Request von C++/WinRT behob eine Mehrdeutigkeit beim Aufruf von `invoke` in `winrt::impl::promise_base::set_completed`, verursacht durch Argument-abhängiges Lookup (ADL). Das Upgrade auf C++20-Coroutinen erweiterte den ADL-Suchraum und fand unerwartet `std::invoke` statt des beabsichtigten `winrt::impl::invoke`. Der Artikel beschreibt den ADL-Mechanismus und bietet einen Patch für ältere C++/WinRT-Versionen: die Deklaration einer besser passenden `invoke`-Funktion im Namensraum `winrt::Windows::Foundation`, um den Compiler anzuleiten. Dieser Patch enthält auch eine statische Assertion, um sicherzustellen, dass er nach dem Upgrade von C++/WinRT automatisch entfernt wird.

Mehr lesen
Entwicklung

Die Falle des 'Anderen' in Enumerationen: Versionskompatibilität und offene Enumerationen

2025-03-02
Die Falle des 'Anderen' in Enumerationen: Versionskompatibilität und offene Enumerationen

Dieser Artikel behandelt die Probleme bei der Verwendung eines 'Anderen'-Werts (z. B. WidgetFlavor::Anderes) in C++-Enumerationen. Das Hinzufügen neuer Enumerationswerte stellt eine Herausforderung dar: Wie werden diese behandelt und die Kompatibilität mit älteren Codeversionen sichergestellt? Der Autor schlägt vor, 'Anderes' ganz zu vermeiden und die Enumeration als offen zu deklarieren, sodass Programme nicht erkannte Werte selbstständig verarbeiten können. Dies löst elegant Probleme mit der Versionskompatibilität, vermeidet Verwirrung beim Hinzufügen neuer Enumerationswerte und gewährleistet einen reibungslosen Übergang zwischen altem und neuem Code.

Mehr lesen

Wichtige Verbesserungen bei MSVC Address Sanitizer (ASan)

2025-02-25
Wichtige Verbesserungen bei MSVC Address Sanitizer (ASan)

Microsoft hat die Qualität von MSVC Address Sanitizer (ASan) deutlich verbessert. Wichtige Teile von ASan wurden erfolgreich zu LLVM upstreaming, was eine schnellere Integration von Verbesserungen der LLVM-Community ermöglicht. Darüber hinaus wurde ASan in die MSVC-Codebasis integriert, einschließlich Compiler, Linker und Tools, um Sicherheitsprobleme im Speicher in der kontinuierlichen Integration zu erkennen. Visual Studio 2022 Version 17.13 enthält zahlreiche Korrekturen, die falsch positive Ergebnisse reduzieren, die Fehlerberichterstattung verbessern und Multiprozess-Szenarien verwalten.

Mehr lesen
Entwicklung

Windows 95 Setup: Die überraschend komplexe Geschichte eines Mini-Betriebssystems

2025-02-17
Windows 95 Setup: Die überraschend komplexe Geschichte eines Mini-Betriebssystems

Dieser Artikel enthüllt die verborgene Komplexität des Windows 95 Setup-Programms. Um ein scheinbar einfaches Installationsprogramm zu erstellen, musste das Team ein Mini-Betriebssystem von Grund auf in MS-DOS entwickeln, einschließlich Grafikbibliotheken, eines Fenstermanagers, mehrsprachiger Unterstützung und sogar Kompatibilität mit Windows 3.1. Sie erkannten schließlich, dass es weitaus effizienter war, die vorhandene Windows 3.1-Laufzeitumgebung zu verwenden und so enorme Entwicklungsaufwände zu vermeiden. Die Geschichte unterstreicht die Bedeutung der Code-Wiederverwendung in der Softwareentwicklung und legt die überraschend komplexe Natur des Windows 95 Setup-Programms offen.

Mehr lesen
Entwicklung

Der Bildschirm „Es ist jetzt sicher, den Computer auszuschalten“: Eine nostalgische Reise zu Windows 95

2025-02-16
Der Bildschirm „Es ist jetzt sicher, den Computer auszuschalten“: Eine nostalgische Reise zu Windows 95

Erinnern Sie sich an die Meldung „Es ist jetzt sicher, den Computer auszuschalten“ in Windows 95? Diese Geschichte erzählt eine amüsante Anekdote in einem Flugzeug, bei der ein Mitreisender seinen Laptop wiederholt neu gestartet hat, nachdem er den Bildschirm „Windows wurde heruntergefahren“ gesehen hatte, ohne zu merken, dass er den Computer manuell ausschalten musste. Dies unterstreicht den Mangel an Energieverwaltung in älteren Computern und erklärt, warum Windows 95 die Meldung enthielt: eine freundliche Erinnerung daran, dass es sicher war, den Netzschalter zu drücken.

Mehr lesen
Technologie

Anekdote vom USB-Spezifikationsmeeting: Der Aufpreis für transluzent Blau

2025-02-10
Anekdote vom USB-Spezifikationsmeeting: Der Aufpreis für transluzent Blau

Bei einem Meeting zur USB-Spezifikation präsentierte ein Unternehmen seine USB-Diskettenlaufwerke und bot überraschenderweise separate Versionen für PCs und Macs an. Die Komitee-Mitglieder waren verwirrt, da die Spezifikation sicherstellte, dass dasselbe Laufwerk auf beiden Systemen funktionierte. Der Vertreter erklärte, dass die Laufwerke elektronisch identisch waren; der einzige Unterschied bestand darin, dass die Mac-Version aus transluzentem blauen Kunststoff bestand und mehr kostete. Dies spiegelte den damaligen Trend zu transluzentem Kunststoff bei iMacs wider und unterstrich, wie einige Hersteller Designunterschiede für Preisaufschläge nutzten.

Mehr lesen

Der 'Null-Garbage-Collector' in Raketen-Software: Speicherlecks? Kein Problem!

2025-02-07
Der 'Null-Garbage-Collector' in Raketen-Software: Speicherlecks? Kein Problem!

Ein Entwickler berichtet von einer cleveren Anwendung eines 'Null-Garbage-Collectors' in Raketensoftware. Aufgrund der begrenzten Flugzeit und des reichlich vorhandenen Hardwarespeichers waren Speicherlecks im Programm kein Problem. Die Ingenieure berechneten das potenzielle Speicherleck während des Fluges und fügten die doppelte Speichermenge hinzu, um sicherzustellen, dass das Programm nicht abstürzt, bevor die Mission abgeschlossen ist. Dieser Ansatz nutzte die Laufzeitbeschränkungen des Programms intelligent aus und löste das Problem der Speicherlecks effektiv: eine Art 'ultimative Garbage Collection'.

Mehr lesen
Entwicklung Speicherlecks

Go 1.24 Kryptografie-Überarbeitung: FIPS 140-3-Konformität erreicht

2025-02-06

Go 1.24 hat seine Kryptografie-Pakete umfassend überarbeitet, um die FIPS 140-3-Konformität zu erreichen. Dies ist ein großer Fortschritt, mit einer reinen Go-Implementierung (und Go-Assembler) eines FIPS 140-3-validierten kryptografischen Moduls, wodurch die Abhängigkeit von cgo oder Systemaufrufen entfällt. Microsoft Go 1.24 wurde ebenfalls aktualisiert und bietet jetzt Vorschau-Unterstützung für macOS und verbesserte Unterstützung für Azure Linux, verwendet aber weiterhin Systembibliotheken für die Kryptografie, was von der offiziellen Go-Methode abweicht. Neue Umgebungsvariablen wie GODEBUG=fips140=on und GOFIPS140=latest steuern den FIPS-Modus; die Laufzeit aktiviert ihn automatisch auf FIPS-konformen Systemen (Azure Linux, Windows).

Mehr lesen
Entwicklung

Ein Designfehler und ein versteckter Wasserkocher im Windows 3D Pipes Bildschirmschoner

2024-12-28
Ein Designfehler und ein versteckter Wasserkocher im Windows 3D Pipes Bildschirmschoner

Der beliebte Windows 3D Pipes Bildschirmschoner, bekannt für seine hypnotischen Rohranimationen, birgt ein wenig bekanntes Geheimnis: einen selten erscheinenden Wasserkocher. Dieser Wasserkocher ist eine Hommage an den Utah Teapot, ein Standardreferenzobjekt in der Computergrafik, aber seine unglaublich niedrige Erscheinungsrate führte zu Beschwerden von Benutzern über geringe Produktivität. Der Artikel enthüllt auch, dass der Bildschirmschoner in älteren Windows-Versionen aufgrund von Software-Rendering zu einer hohen CPU-Auslastung auf Servern führte, wobei ein schwarzer Bildschirmschoner für Server empfohlen wird.

Mehr lesen

C++-Compilerfehler: Unsinnige Fehler aus einer Funktionsdeklaration

2024-12-12
C++-Compilerfehler: Unsinnige Fehler aus einer Funktionsdeklaration

Ein Entwickler, der XAML-Unterstützung zu einer C++-Anwendung hinzufügen wollte, stieß auf eine Reihe von Compilerfehlern, allein durch das Einfügen der Headerdatei winrt/Windows.UI.Xaml.h. Die Fehler rührten von dem, was wie eine normale Funktionsdeklaration aussah, her: `template struct consume_Windows_UI_Xaml_IExceptionRoutedEventArgs { [[nodiscard]] auto ErrorMessage() const; };` Die Ursache war ein bereits vorhandenes Makro namens ErrorMessage im Projekt des Entwicklers, das mit dem Funktionsnamen kollidierte. Dieses Makro erzeugte ein ErrorMessageString-Objekt und gab einen Zeiger auf eine Fehlernachrichtenzeichenkette zurück. Die Begrenzungslosigkeit des Makros führte dazu, dass der Compiler die Funktionsdeklaration fälschlicherweise als Makroaufruf interpretierte, was zu Fehlern wie "nicht genügend Argumente" führte. Die Lösung bestand darin, das Makro mit #pragma undef zu deaktivieren, bevor der Header eingefügt wurde, oder das Makro ganz zu entfernen und es durch eine Inline-Funktion zu ersetzen.

Mehr lesen