iOS: disable using CFI in stackwalking

dump_syms produces incomplete CFI info on iOS because it doesn't support
converting compact unwind to Breakpad symbols. Attempting to use
incomplete CFI can result in infinte stack traces.

Bug: google-breakpad:764
Change-Id: Id042aa515d17928cb5503a79038607d95c56238d
Reviewed-on: https://chromium-review.googlesource.com/1128252
Reviewed-by: Ivan Penkov <ivanpe@chromium.org>
This commit is contained in:
Joshua Peraza 2018-07-06 13:22:17 -07:00
parent 79ba6a494f
commit 89e7a8615f
2 changed files with 15 additions and 6 deletions

View file

@ -40,6 +40,7 @@
#include "google_breakpad/processor/memory_region.h"
#include "google_breakpad/processor/source_line_resolver_interface.h"
#include "google_breakpad/processor/stack_frame_cpu.h"
#include "google_breakpad/processor/system_info.h"
#include "processor/cfi_frame_info.h"
#include "processor/logging.h"
#include "processor/stackwalker_arm.h"
@ -249,10 +250,14 @@ StackFrame* StackwalkerARM::GetCallerFrame(const CallStack* stack,
scoped_ptr<StackFrameARM> frame;
// See if there is DWARF call frame information covering this address.
scoped_ptr<CFIFrameInfo> cfi_frame_info(
frame_symbolizer_->FindCFIFrameInfo(last_frame));
if (cfi_frame_info.get())
frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info.get()));
// TODO(jperaza): Ignore iOS CFI info until it is properly collected.
// https://bugs.chromium.org/p/google-breakpad/issues/detail?id=764
if (!system_info_ || system_info_->os != "iOS") {
scoped_ptr<CFIFrameInfo> cfi_frame_info(
frame_symbolizer_->FindCFIFrameInfo(last_frame));
if (cfi_frame_info.get())
frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info.get()));
}
// If CFI failed, or there wasn't CFI available, fall back
// to frame pointer, if this is configured.

View file

@ -782,8 +782,12 @@ TEST_F(CFI, RejectBadExpressions) {
class StackwalkerARMFixtureIOS : public StackwalkerARMFixture {
public:
StackwalkerARMFixtureIOS() {
system_info.os = "iOS";
system_info.os_short = "ios";
// iOS_test is used instead of iOS because the stackwalker has a check to
// avoid using CFI for iOS dumps. This is a workaround for bad CFI being
// produced by dump_syms for iOS.
// https://bugs.chromium.org/p/google-breakpad/issues/detail?id=764
system_info.os = "iOS_test";
system_info.os_short = "ios_test";
}
};