code: private int compareToErrStackLines(List<StackLine> stackLines, List<StackLine> errStackLines) {
          if (errStackLines == null || errStackLines.size() == 0) {
              return -1; // already executed
          }
          if (stackLines.size() == 0) {
              throw new IllegalArgumentException("empty stackLine");
          }
  
          for (int i = 0; i < stackLines.size(); i++) {
              if (i >= errStackLines.size()) {
                  throw new IllegalArgumentException(String.format(
                          "stack mismatch:%n[stackLines]%n%s[errStackLines]%n%s",
                          stackLinesStr(stackLines), stackLinesStr(errStackLines)));
              }
              int indexFromTail = stackLines.size() - 1 - i;
              int errIndexFromTail = errStackLines.size() - 1 - i;
              int line = stackLines.get(indexFromTail).getCodeBodyIndex();
              int errLine = errStackLines.get(errIndexFromTail).getCodeBodyIndex();
              if (line < errLine) {
                  return -1; // already executed
              } else if (line > errLine) {
                  return 1; // not executed
              }
          }
          return 0;
      }
docs: returns negative if stackLines < errStackLines (means already executed)