- if (frame_idx >= bt_len) {
- T_FAIL("unexpected frame '%s' (%#lx) at index %u",
- CSSymbolGetName(symbol), addr, frame_idx);
- return;
+ const char *name = CSSymbolGetName(symbol);
+ if (name) {
+ if (cs->in_syscall_setup) {
+ if (strcmp(name, cs->callstack[cs->callstack_len - 1]) == 0) {
+ cs->in_syscall_setup = false;
+ cs->syscall_frames = bt_idx;
+ T_LOG("found start of controlled stack at frame %u, expected "
+ "index %zu", cs->syscall_frames, cs->callstack_len - 1);
+ } else {
+ T_LOG("found syscall setup symbol %s at frame %u", name,
+ bt_idx);
+ }
+ }
+ if (!cs->in_syscall_setup) {
+ if (cs->nchecked >= cs->callstack_len) {
+ T_LOG("frame %2u: skipping system frame %s", bt_idx, name);
+ } else {
+ size_t frame_idx = cs->callstack_len - cs->nchecked - 1;
+ T_EXPECT_EQ_STR(name, cs->callstack[frame_idx],
+ "frame %2zu: saw '%s', expected '%s'",
+ frame_idx, name, cs->callstack[frame_idx]);
+ }
+ cs->nchecked++;
+ }
+ } else {
+ if (!cs->in_syscall_setup) {
+ T_ASSERT_NOTNULL(name, NULL, "symbol should not be NULL");
+ }