Windows için libfaketime
Kısa cevap: libfaketime Windows’ta çalışmaz ve çalışamaz - Windows’un sahip olmadığı
LD_PRELOAD üzerine kuruludur. Chrono Mock, aynı fikrin Windows’un izin verdiği şekilde
kurulmuş hâlidir.
Neden basitçe taşınamaz
libfaketime, dinamik yükleyicinin C
kitaplığının önüne küçük bir kitaplık yerleştirmesiyle çalışır; böylece bir programın
time() çağrıları önce yedeğe ulaşır. Bu kanca Linux’ta LD_PRELOAD,
macOS’ta DYLD_INSERT_LIBRARIES’dir. Kendi README’si tam olarak bu iki platformu
listeler.
Windows’un bir eşdeğeri yoktur ve saati zaten tek bir işlevin arkasında yaşamaz. Uygulamalar zamanı Win32 API’si, onun altındaki yerel API ve çalışma zamanlarının ikisinin etrafına sardığı her şey aracılığıyla okur - dolayısıyla bu fikrin Windows sürümü, tek bir sembol yerine bir dizi dışa aktarılmış işlevi yönlendiren, hedef sürece enjekte edilmiş bir kitaplıktır.
Bayraklar, karşılıklarıyla
| libfaketime | Chrono 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 |
burada varsayılan - aşağıya bakın |
LD_PRELOAD=libfaketime.so.1 |
ayarlanacak bir şey yok - araç enjekte eder |
Yani aynı testin iki tarafı şöyle görünür:
# 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
İkisinin gerçekten ayrıldığı yerler
Monoton saatler tersine çevrilmiştir. libfaketime bunları varsayılan olarak
sahtelenir ve durdurmak için FAKETIME_DONT_FAKE_MONOTONIC verir. Burada yüksek
çözünürlüklü sayaç varsayılan olarak gerçek kalır; çünkü onu ölçeklemek testlerde
render’ı kararsızlaştırdı ve --scale-qpc bunu etkinleştirir. Python 3.13+
monotonic, .NET Stopwatch ve Java nanoTime’ın oturum
saatini izlemesini sağlayan anahtar budur.
Windows’ta yakalanacak daha çok yer var. Duvar saatinin ötesinde saat dilimi, geçen zaman ekseni, dört zamanlayıcı ailesi, uyku ve bekleme işlevleri ve süreç oluşturma var - toplamda 44 kanal. Bunların 30 tanesi kaydırılır, ağ bağlantıları da dahil kalan 14 tanesi sayılır.
Bu araç kendi kapsamasını bildirir. Her oturum bir kararla, uygulamanın gerçekten okuduğu kanalların her biri için bir sayıyla ve kaçırılan kanallarla biter. Bu, iki platformda da eşdeğeri olmayan kısımdır.
libfaketime daha eskidir ve kendi alanında daha geniştir. Arkasında yılların kullanımı vardır, C kitaplığının geniş bir giriş noktası yelpazesini kapsar ve Linux’ta doğru araçtır. Buradaki hiçbir şey onu orada değiştirmez.
Gerçekten libfaketime’ın kendisini istiyorsanız
İkisi de test edilen programı Linux’a taşıyan iki dürüst yol:
- WSL - libfaketime’ı Linux alt sistemi içinde derleyip çalıştırın. Test edilen şey, Windows’ta geliştirdiğiniz bir Linux programıysa iyidir.
- Bir konteyner - aynı fikir, daha tekrarlanabilir.
İkisi de bir Windows uygulamasına yardımcı olmaz; bu aracın var olma nedeni tam da budur.