A fixed-size log can keep the most recent events by overwriting the oldest slot.

ring index The next write position wraps back to zero when it reaches the end of the array.
recent values The array stores a compact history without growing memory.

Rolling Log

extraEvent
rolling_log.c
Replay: real traced execution (multi-file project)
#include <stdio.h>

int main(void) {
    int extraEvent = 4;
    int log[3] = {0, 0, 0};
    int events[4] = {1, 2, 3, extraEvent};
    int next = 0;

    for (int i = 0; i < 4; i++) {
        log[next] = events[i];
        next = (next + 1) % 3;
    }

    printf("next=%d log=%d,%d,%d\n", next, log[0], log[1], log[2]);
    return 0;
}
#include <stdio.h>

int main(void) {
    int extraEvent = 2;
    int log[3] = {0, 0, 0};
    int events[4] = {1, 2, 3, extraEvent};
    int next = 0;

    for (int i = 0; i < 4; i++) {
        log[next] = events[i];
        next = (next + 1) % 3;
    }

    printf("next=%d log=%d,%d,%d\n", next, log[0], log[1], log[2]);
    return 0;
}
#include <stdio.h>

int main(void) {
    int extraEvent = 7;
    int log[3] = {0, 0, 0};
    int events[4] = {1, 2, 3, extraEvent};
    int next = 0;

    for (int i = 0; i < 4; i++) {
        log[next] = events[i];
        next = (next + 1) % 3;
    }

    printf("next=%d log=%d,%d,%d\n", next, log[0], log[1], log[2]);
    return 0;
}
  1. extraEvent ← 4, log ← ⟨addr A⟩, events ← ⟨addr B⟩, next ← 0

    3int main(void) {4    int extraEvent→ 4 = 4; //@extraEvent=2, 75    int log→ ⟨addr A⟩[3] = {0, 0, 0};6    int events→ ⟨addr B⟩[4] = {1, 2, 3, extraEvent4};7    int next→ 0 = 0;
  2. log[next] ← 1, next ← 1

    pass 1 of 4
    9for (int i0 = 0; i < 4; i++) {10    log[next]→ 1 = events[i]1;11    next→ 1 = (next + 1) % 3;12}
    All 4 passes — pass 1 is the card above
    passievents[i]log[next]next
    1010 10 1
    2120 21 2
    3230 32 0
    4341 40 1
  3. printf("next=%d log=%d,%d,%d ", next, log[0], log[1], log[2]);

    14    printf("next=%d log=%d,%d,%d\n", next1, log[0]4, log[1]2, log[2]3);15    return 0;16}
    outputnext=1 log=4,2,3
  1. extraEvent ← 2, log ← ⟨addr A⟩, events ← ⟨addr B⟩, next ← 0

    3int main(void) {4    int extraEvent→ 2 = 2;5    int log→ ⟨addr A⟩[3] = {0, 0, 0};6    int events→ ⟨addr B⟩[4] = {1, 2, 3, extraEvent2};7    int next→ 0 = 0;
  2. log[next] ← 1, next ← 1

    pass 1 of 4
    9for (int i0 = 0; i < 4; i++) {10    log[next]→ 1 = events[i]1;11    next→ 1 = (next + 1) % 3;12}
    All 4 passes — pass 1 is the card above
    passievents[i]log[next]next
    1010 10 1
    2120 21 2
    3230 32 0
    4321 20 1
  3. printf("next=%d log=%d,%d,%d ", next, log[0], log[1], log[2]);

    14    printf("next=%d log=%d,%d,%d\n", next1, log[0]2, log[1]2, log[2]3);15    return 0;16}
    outputnext=1 log=2,2,3
  1. extraEvent ← 7, log ← ⟨addr A⟩, events ← ⟨addr B⟩, next ← 0

    3int main(void) {4    int extraEvent→ 7 = 7;5    int log→ ⟨addr A⟩[3] = {0, 0, 0};6    int events→ ⟨addr B⟩[4] = {1, 2, 3, extraEvent7};7    int next→ 0 = 0;
  2. log[next] ← 1, next ← 1

    pass 1 of 4
    9for (int i0 = 0; i < 4; i++) {10    log[next]→ 1 = events[i]1;11    next→ 1 = (next + 1) % 3;12}
    All 4 passes — pass 1 is the card above
    passievents[i]log[next]next
    1010 10 1
    2120 21 2
    3230 32 0
    4371 70 1
  3. printf("next=%d log=%d,%d,%d ", next, log[0], log[1], log[2]);

    14    printf("next=%d log=%d,%d,%d\n", next1, log[0]7, log[1]2, log[2]3);15    return 0;16}
    outputnext=1 log=7,2,3