Opdrachtregelreferentie
Elke optie van beide commando's, beide tabellen met afsluitcodes en hoe je leest wat er terugkomt. De verhalende versie, met de redenering, staat op de pagina CLI en CI.
Twee commando's
chrono run start een applicatie op een andere datum en tijd. chrono calc
berekent een datum en zegt wat die interessant maakt. Ze delen één stappengrammatica, dus een
verschuiving die voor het ene is geschreven betekent in het andere hetzelfde.
chrono version beantwoordt een derde, veel kleinere vraag: welke build dit is, welke
van de twee kernen het uitvoerbare bestand is en welke protocolversie het spreekt. Eén regel op
stdout, zodat een script hem kan opvangen.
chrono license beantwoordt de vierde: onder welke licentie deze build wordt
verspreid, de uitsluiting van garantie en de componenten van derden die erin zijn gelinkt.
Het zegt ook waar op schijf de volledige licentietekst en de vermeldingen van derden staan,
of geeft toe dat de kopie die je draait ze niet naast zich heeft. --components
toont elk meegeleverd onderdeel met zijn versie in plaats van een samenvatting.
chrono presets toont de scenariocatalogus zoals --preset hem
leest: elk scenario in de map, geschreven in de woorden die de grammatica van de
rekenmachine leest, en elk bestand dat het zou weigeren, met de reden. --json
schrijft chronomock.presets/1 en --dir noemt een andere map.
chrono run <target> [options] chrono calc [options] chrono version # chrono 0.4.0 (x64, protocol 1) chrono license # GPL-3.0-only, and what is bundled chrono presets # de catalogus, zoals --preset hem leest chrono --help # usage for all of them
chrono run - opties
| Optie | Wat ze doet |
|---|---|
--at <moment> |
Het moment waarop begonnen wordt, in de sessiezone. Absoluut
(2038-01-19T03:14:07) of relatief met een voorloopteken
(+1d, -2h). Eenheden: s m h d w mo q y -
m is minuten en mo is maanden. Zonder deze optie
begint de sessieklok bij de echte huidige tijd, dus --mode xN alleen laat het
doel gewoon sneller lopen. |
--zone +HH:MM |
De sessiezone: de zone waarin het moment is geschreven en die de lokale-tijdaanroepen van het doel rapporteren. Een vaste offset, zonder zomertijd. Zonder deze optie de eigen zone van de host. |
--mode flow|frozen|xN |
flow loopt op echte snelheid, frozen houdt de klok stil,
xN laat hem N keer sneller lopen (x60 maakt van een uur een
minuut, x1440 van een dag). |
--scale-duration |
Versnel ook de as van de verstreken tijd: tickcounters, interrupttijd, pauzes en timers. Wachten op objecten wordt geteld en houdt zijn echte lengte. Standaard uit, omdat een wandklok en een stopwatch verschillende vragen zijn. Een timer of vertraging die op een datum en tijd is gezet volgt de sessieklok met of zonder deze optie. |
--scale-qpc |
Schaalt ook de high-resolution teller, waaruit Python 3.13+ monotonic, .NET
Stopwatch en Java nanoTime de verstreken tijd lezen. Standaard
uit: een applicatie die haar rendering met die teller timet, kan er vervormd uitzien. |
--ticks N |
Beëindigt de sessie na N hartslagen, elk één echte seconde, en rapporteert. Zonder deze optie blijft het gereedschap gekoppeld totdat het doel, en elk programma dat het startte en dat op de sessieklok draait, is afgesloten - een launcher die meteen eindigt laat de sessie aan de applicatie die hij startte. |
--timeout <s> |
Geeft na zoveel seconden op en eindigt met 6, voor een pipeline die niet mag blijven hangen. Los van deze optie wordt een kern die 15 seconden niets zegt gestopt en eindigt ook met 6 - in beide gevallen is de run afgebroken en draagt dus geen oordeel. |
--args "..." |
Argumenten voor het doel, als één tekenreeks, gesplitst volgens dezelfde regel die Windows
gebruikt - zodat een argument met spaties de reis overleeft. Voor een Chromium-doel worden
--user-data-dir en --remote-debugging-port geweigerd in plaats van
overschreven: de sessie heeft een eigen geïsoleerd profiel nodig, en stilletjes draaien op je
echte browserprofiel is het ene wat niet mag gebeuren. |
--cwd <dir> |
Start het doel in die map. Zonder deze optie erft het doel de onze, wat elke run deed voordat
deze optie bestond. Een lege waarde is een gebruiksfout en niet “geen map” - afwezig en leeg
zijn verschillende dingen, en alleen afwezig is iets wat Windows kan krijgen. Een map die niet
bestaat, stopt de sessie met target.cwd_missing voordat er iets wordt gestart, in
plaats van later naar voren te komen als een doel dat niet wilde starten. |
--preset <id> |
Neemt het moment en de snelheid uit presets/<id>.json. Sluit
--at, --mode en --scale-duration uit, omdat het
scenario dan de enige bron van beide is. |
--param id=value |
Vult een scenarioparameter in. Herhaalbaar, vereist --preset. Alleen bij
run valt de startdatum van een proefperiode terug op de eigen aanmaakdatum van het
uitvoerbare doelbestand, zodat een proefscenario telt vanaf de dag waarop de applicatie is
geïnstalleerd zonder dat je die typt. |
--set-after T:M |
Verandert bij hartslag T de snelheid naar M. Onderweg is de vermenigvuldiger minstens 1 - bevriezen midden in de sessie wordt hier niet aangeboden. |
--jump-after T:moment |
Laat bij hartslag T de klok naar dat moment springen, absoluut of relatief, in de sessiezone. |
--force |
Houdt de sessie aan, ook als het openingsoordeel zegt dat de vervanging niet van kracht werd - standaard wordt het doel dan gestopt, omdat een sessie die niets bewees erger is dan geen sessie. Het oordeel verandert niet, en de afsluitcode ook niet. Dit bepaalt alleen of het doel blijft draaien. |
--no-embedded |
Laat de webpagina's binnen de toepassing (WebView2, Qt WebEngine) op de echte klok en opent geen debugpoort. Zonder deze optie vraagt de sessie zo'n engine een lokale poort te openen en zet via die poort zijn pagina's op de sessieklok - zolang de poort open is, kan elk ander programma op deze computer hem gebruiken om die pagina's te bereiken. |
--elevated-embedded |
Voor een toepassing die als beheerder draait, vanuit een Chrono Mock die ook als
beheerder draait. WebView2 negeert voor zo'n toepassing de instelling waarmee de
sessie haar pagina's bereikt, dus de sessie schrijft gedurende haar looptijd één
waarde naar het register van de machine (HKLM, genoemd naar de .exe van de toepassing)
en verwijdert die aan het einde. Zolang de toepassing draait, kan elk ander programma
op deze computer haar pagina's via de poort bereiken, en de toepassing heeft
beheerdersrechten. Niet samen met --no-embedded. |
--keep-background-timers |
Start de webengine - de browser van een Chromium- of Electron-toepassing, of de
engine binnen een toepassing - met de vertraging van timers in verborgen vensters
uitgeschakeld, zodat een geminimaliseerd venster de sessiesnelheid behoudt. De
toepassing werkt dan ook op volle snelheid terwijl ze verborgen is. Een toepassing die
via --elevated-embedded als beheerder wordt gestart, krijgt het
niet. |
--dry-run |
Drukt af wat de sessie zou zijn en start niets: het opgeloste moment en de zone en
waar ze vandaan komen, waarmee een scenario elke parameter vulde, de argumenten na het
splitsen en welk van de twee mechanismen het doel zou nemen. Er wordt geen proces
gestart en geen bestand geschreven, ook niet dat wat --report noemt. Het
eindigt met 0 voor een haalbaar plan en met 2 voor een doel dat er niet is, de code
die een echte run voor hetzelfde feit geeft. Een plan draagt geen oordeel en zegt dat
- alleen een echte sessie heeft er een. Met --json is het plan data,
waaronder session.elevated_embedded en
session.elevated_embedded_value, de bestandsnaam waarnaar de
registerwaarde zou worden genoemd wanneer de optie op een .exe-doel van
toepassing is, anders null. Een naam daar is geen belofte dat er geschreven wordt: de
sessie schrijft de waarde alleen als Chrono Mock zelf als beheerder draait. |
--report <path> |
Schrijft het rapport voor mensen naar een bestand. Een ander oordeel dan werkt opent dat bestand met een banner over onbetrouwbaar bewijs, omdat bewijs dat zijn eigen twijfel verbergt erger is dan geen. Ook een sessie met het oordeel werkt krijgt deze banner wanneer de applicatie geen van de klokken heeft gelezen die de sessie vervangt, of wanneer het een Go-programma is, waarvan Chrono Mock de wandklok niet bereikt. Het bestand noemt ook de run zelf: de versie, het starttijdstip, het doel, de map ervan en de opties. |
--report-args |
Schrijft samen met --report ook de argumenten van het doel letterlijk in dat bestand. Standaard uit, omdat een argument een wachtwoord kan bevatten - het bestand noemt dan alleen hoeveel het er waren. |
--json |
Geeft de sessie als machineleesbare records in plaats van het rapport - dezelfde stroom die het venster zelf verwerkt. De eigen uitvoer van een consoleapplicatie gaat naar standard error, dus standard output bevat de records en niets anders. Een applicatie die nog draait als de sessie eindigt, blijft daar schrijven, zodat alles wat standard error tot het einde leest erop wacht, en de run zegt dat. |
chrono run - afsluitcodes
De afsluitcode is het sessieoordeel, niet wat de applicatie teruggaf. De eigen afsluitcode van de applicatie wordt apart gemeld, in het rapport en in de sessiegegevens - de pagina CLI en CI legt uit waarom het zo om is.
| Code | Betekenis |
|---|---|
| 0 | werkt - elk proces dat de tijd las, zag de sessieklok |
| 10 | werkt gedeeltelijk - sommige kanalen gedekt, andere niet |
| 11 | werkt niet - de vervanging heeft de belangrijkste kanalen niet bereikt |
| 4 | onbepaald - de dekking kon niet worden vastgesteld. Een eerlijk “dat kan ik niet zeggen”, nooit een voorgewend slagen |
| 12 | het doel verdween direct na de injectie en liet niets achter dat op de sessieklok draait, wat wijst op een applicatie met één instantie die overdraagt aan een al lopende kopie, of op een overdracht aan een programma waar de sessie niet in kon, meestal dat van de andere bitness. Een doel dat de applicatie start en eindigt is een launcher, en de sessie gaat door voor de applicatie |
| 1 | gebruiksfout - een foute optie, een foute expressie of een scenario dat dit commando niet accepteert |
| 2 | het doel kon niet worden gestart of geïnjecteerd |
| 3 | interne fout - de engine kon niet starten, kwam in een onverwachte toestand of stopte voordat de sessie werd afgesloten (wat haar eigen afsluitcode ook was). Zo'n run draagt geen oordeel |
| 5 | de bewerking is niet opgenomen in deze release - bijvoorbeeld een scenario waarvan het moment een kalender nodig heeft die run nog niet kan laden. Bewust anders dan een gebruiksfout: je vroeg om iets wat nog niet bestaat, niet om iets verkeerds |
| 6 | de run is afgebroken - --timeout verliep, of de engine reageerde 15 seconden niet meer en werd gestopt. Dit is geen oordeel: de sessie is onderbroken, dus ze bewijst niets over het doel, in welke richting dan ook |
| 7 | er loopt al een andere sessie - één sessie tegelijk. Opnieuw proberen zodra die klaar is, is genoeg |
| 8 | de sessie kwam tot een oordeel, maar het bewijs staat niet in het bestand dat --report noemt - de schijf was vol, of een ander programma hield het oude bestand open, dat dan blijft zoals het was. Het oordeel staat nog steeds in het rapport dat de opdracht toont |
Het rapport lezen
Zonder --json eindigt de sessie in een gewoon rapport. Elke regel is een feit dat de
sessie heeft waargenomen of ontbreekt - niets wordt ingevuld met een aannemelijke standaardwaarde.
Chrono Mock - session report
target: .\build\test.exe
verdict: WORKS - time substitution took effect (processes: 1)
every process that read time saw the session clock
session: fake clock reached 2038-01-19T03:14:08
real elapsed 1.3s, fake elapsed 1.3s
exited: the target closed itself with code 3
covered channels (substituted, with call counts, 10 calls in all):
- pid 21240: GetSystemTimeAsFileTime (5 calls)
- pid 21240: GetLocalTime (5 calls)
observed channels (hooked but left real):
- pid 21240: NtCreateUserProcess (0 calls)
warnings:
- the target opened a network connection ...
- verdict - het familieoordeel over het ouderproces en elk kindproces, met het aantal processen. Dit is het getal dat de afsluitcode draagt.
- exited - de eigen afsluitcode van de applicatie, en alleen als ze
zichzelf afsloot. Een run begrensd met
--tickslaat het doel draaien, een Chromium-sessie is er een die het gereedschap zelf sluit, en een sessie die nooit startte heeft zo'n code niet - de regel ontbreekt dan in plaats van een verzonnen nul te tonen. Een crashcode komt aan als een groot negatief getal, dus krijgt ook zijn hexadecimale vorm. - covered - kanalen die de vervanging bereikte, met hoe vaak elk werkelijk is aangeroepen, per proces. Aantallen worden nooit over processen heen opgeteld: de audit van het ene proces mag de cijfers van een ander niet lenen. Een teller stopt bij 1048576 en toont dan minstens dat aantal.
- observed - kanalen die zijn onderschept maar bewust echt gelaten, zoals objectwachten en multimediatimers. Een eigen bak, zodat ze nooit als vervangen worden gelezen.
- uncovered - kanalen die de applicatie opvroeg en die de sessie niet dekte. Dit maakt van een oordeel gedeeltelijk.
- not fully cleaned up - alles wat het opruimen niet kon verwijderen. Afwezig bij een schone afsluiting, het normale geval.
chrono calc - opties
Geen natuurlijke taal: elke optie is één stap, en de volgorde van de opties is de volgorde van de stappen. Het resultaat na elke stap wordt afgedrukt, zodat een foute stap zichtbaar is in plaats van begraven.
| Optie | Wat ze doet |
|---|---|
--base today|now|<moment> |
Waar te beginnen, standaard today. Opgelost in de sessiezone. Een onmogelijke
dag zoals 2025-02-31 wordt geweigerd, nooit stilletjes genormaliseerd naar de
volgende maand. |
--base-utc <moment> |
Net als --base, maar het begin is een moment in UTC, met een optionele
afsluitende Z, in plaats van een wandklokaflezing in de sessiezone. |
--shift ±N<unit> |
Herhaalbaar. Het teken is verplicht. Eenheden: s m h d w mo q y bd, of hun
volledige namen. m is minuten, mo is maanden.
Maanden, kwartalen en jaren worden met een begrenzing op de kalenderdatum gevouwen, dus een
maand na 31 januari is eind februari, niet een vast aantal ticks. bd
(werkdagen) heeft --calendar nodig. |
--set-time HH:MM:SS | Stelt het tijdstip van de dag in op het huidige resultaat. |
--snap <target> |
Springt naar een periodegrens: som eom soq eoq soy eoy (begin of einde van
maand, kwartaal, jaar). Een begin is de eerste dag om 00:00:00, een einde de laatste dag om
23:59:59. |
--nearest nbd|pbd |
De dichtstbijzijnde werkdag vooruit of achteruit, de huidige dag meegerekend als die er al
een is. Heeft --calendar nodig. |
--to-zone +HH:MM |
Een stap: drukt hetzelfde moment uit in een andere vaste offset. Het moment blijft
behouden, dus de epochwaarde verschuift niet en alleen de burgerlijke velden veranderen. Niet
te verwarren met --zone. |
--zone +HH:MM |
De sessiezone, gebruikt om today en now op te lossen en het
resultaat weer te geven. Zonder deze optie de zone van de host. |
--calendar us-banking|us-federal|pl |
Laadt een feestdagenkalender. Het voegt werkdag en feestdag toe aan de metadata en
maakt bd en --nearest mogelijk. De twee Amerikaanse
kalenders verschillen in hoe ze een feestdag in het weekend viereren, en dat is
precies het soort afwijking van een dag dat een test moet vinden. Elke kalender
antwoordt voor een reeks jaren: pl vanaf 2002, us-federal
vanaf 1960 en us-banking vanaf 2008. Een werkdagstap die een dag daarvoor
bereikt, wordt geweigerd met exitcode 1, en een datum daarvoor wordt getoond als niet
beoordeeld. Als de feestdagen van een kalender het laatst meer dan een jaar geleden
aan de wet zijn getoetst, krijgt een latere dag die hij beoordeelde de markering
calendar_outdated, omdat een nieuwere feestdag kan ontbreken. |
--preset <id> --param id=value |
Een benoemd moment uit presets/<id>.json, met de parameters ingevuld.
Sluit de stapopties en --analyze uit, en combineert met
--calendar, --zone en --format. |
--analyze <date> |
Leest een geplakte datum terug en zegt wat het is. Een dubbelzinnige 04/08 wordt
in beide lezingen getoond, Amerikaans en Pools, in plaats van geraden - die
dubbelzinnigheid is een echte bron van verkeerde bugrapporten. |
--format <mask> |
Drukt het resultaat ook af in je eigen masker, zodat het past bij het formaat van de geteste
applicatie: yyyy-MM-dd HH:mm:ss. Tokens zijn hoofdlettergevoelig in de zin van
.NET en Java - M is maand, m is minuut. |
--json |
Machine-uitvoer (chronomock.calc/1) voor alles hierboven, zodat een pipeline een
datum kan berekenen en rechtstreeks terugvoeren in chrono run. |
# Laatste werkdag van het kwartaal, Amerikaanse bankkalender chrono calc --base today --snap eoq --nearest pbd --calendar us-banking
chrono calc - afsluitcodes
Een aparte, kleinere tabel: de calculator heeft geen dekkingsoordeel om te rapporteren.
| Code | Betekenis |
|---|---|
| 0 | berekend |
| 1 | gebruiksfout - een foute optie, een onmogelijke datum, een bereikoverloop of een kalenderbestand zonder enkele werkdag |
| 5 | de stap of eenheid is niet opgenomen in deze release, of de stap heeft een kalender nodig die je niet hebt opgegeven. Bewust gescheiden van een gebruiksfout, zodat een script “nog niet” van “fout” kan onderscheiden |