AsyncGetCallTrace often returns traces that report a 0 bci.  The problem is that the logic in is_decipherable_compiled_frame has two tests that look like this:
  if (pc_desc != NULL &&
      pc_desc->scope_decode_offset() == DebugInformationRecorder::serialized_null) {
that should be:
  if (pc_desc == NULL ||
      pc_desc->scope_decode_offset() == DebugInformationRecorder::serialized_null) {
The existing logic keeps us from doing searching nearby for valid PcDescs and selecting them as the start of the stack walk.  I would have expected vframeStream to assert about this but it apparently does not.