Chrono Mock
SpracheDeutsch

libfaketime für Windows

Kurze Antwort: libfaketime läuft unter Windows nicht und kann es nicht - es baut auf LD_PRELOAD auf, das Windows nicht kennt. Chrono Mock ist dieselbe Idee, so gebaut, wie Windows es zulässt.

Warum es sich nicht einfach portieren lässt

libfaketime funktioniert, indem der dynamische Lader eine kleine Bibliothek vor die C-Bibliothek setzt, sodass die Aufrufe eines Programms an time() zuerst beim Ersatz ankommen. Dieser Haken heißt unter Linux LD_PRELOAD und unter macOS DYLD_INSERT_LIBRARIES. Die eigene README listet genau diese beiden Plattformen.

Windows hat nichts Vergleichbares, und seine Uhr liegt ohnehin nicht hinter einer einzigen Funktion. Anwendungen lesen die Zeit über die Win32-API, über die native API darunter und über alles, was ihre Laufzeit um die eine oder andere wickelt - die Windows-Version dieser Idee ist also eine in den Zielprozess eingeschleuste Bibliothek, die eine Menge exportierter Funktionen umleitet statt eines einzelnen Symbols.

Die Optionen, übertragen

libfaketimeChrono Mock
FAKETIME="2020-12-24 20:30:00" --at 2020-12-24T20:30:00
FAKETIME="+14d" --at +14d
FAKETIME="-10m" --at -10m
FAKETIME="+0 x2" --mode x2
FAKETIME_DONT_FAKE_MONOTONIC=1 hier der Standard - siehe unten
LD_PRELOAD=libfaketime.so.1 nichts zu setzen - das Werkzeug injiziert

So sehen die beiden Seiten desselben Tests aus:

# Linux
FAKETIME="2020-12-24 20:30:00" LD_PRELOAD=/usr/local/lib/libfaketime.so.1 ./test

# Windows
chrono run "C:\apps\test.exe" --at 2020-12-24T20:30:00

Wo sich beide wirklich unterscheiden

Monotone Uhren sind umgekehrt. libfaketime fälscht sie standardmäßig und bietet FAKETIME_DONT_FAKE_MONOTONIC, um das zu stoppen. Hier bleibt der hochauflösende Zähler standardmäßig echt, weil seine Skalierung im Test das Rendering destabilisiert hat, und --scale-qpc schaltet sie ein. Dieser Schalter lässt Python-3.13+-monotonic, .NET-Stopwatch und Java-nanoTime der Sitzungsuhr folgen.

Windows hat mehr Stellen zum Abfangen. Neben der Wanduhr gibt es die Zeitzone, die Achse der verstrichenen Zeit, vier Familien von Timern, die Sleep- und Wait-Funktionen und die Prozesserzeugung - insgesamt 44 Kanäle. Davon werden 30 verschoben, die übrigen 14, darunter Netzwerkverbindungen, werden gezählt.

Dieses Werkzeug meldet seine eigene Abdeckung. Jede Sitzung endet mit einem Urteil, den Kanälen, die die Anwendung tatsächlich gelesen hat, mit der Zahl je Kanal, und den Kanälen, die verfehlt wurden. Das ist der Teil, der auf keiner der beiden Plattformen ein Gegenstück hat.

libfaketime ist auf seinem eigenen Gebiet älter und breiter. Es hat Jahre im Einsatz hinter sich, deckt eine große Zahl von Einstiegspunkten der C-Bibliothek ab, und unter Linux ist es das richtige Werkzeug. Nichts hier ersetzt es dort.

Wenn Sie tatsächlich libfaketime selbst wollen

Zwei ehrliche Wege, die beide das zu testende Programm auf Linux verlegen:

  • WSL - libfaketime im Linux-Subsystem bauen und ausführen. Das passt, wenn das Getestete ein Linux-Programm ist, das Sie zufällig unter Windows entwickeln.
  • Ein Container - dieselbe Idee, reproduzierbarer.

Beides hilft bei einer Windows-Anwendung nicht, und für diesen Fall gibt es dieses Werkzeug.

Ausprobieren