let extract_backtrace_position str =
  let prefixes =
    [
      "Raised at ";
      "Re-raised at ";
      "Raised by primitive operation at ";
      "Called from ";
    ]
  in

  let rec extract_one_line s prefixes =
    match prefixes with
      | [] -> None
      | prefix :: tl ->
          let really_starts, eol = start_substr ~prefix s in
          if really_starts then begin
            if eol = "unknown location" then
              None
            else
              try
                Scanf.sscanf eol "file \"%s@\", line %d, characters %d-%d"
                  (fun fn line _ _ -> Some (fn, line))
              with Scanf.Scan_failure msg ->
                None
          end else begin
            extract_one_line s tl
          end
  in
    List.map
      (fun s -> extract_one_line s prefixes)
      (split_lines str)