是什么导致iOS上的ILL_ILLTRP代码带有SIGILL?

时间:2019-05-28 18:22:36

标签: ios objective-c swift

我收到了我的iOS应用程序的崩溃报告,其中异常类型为Sub ExampleCall() ' [1] Identify source range Dim src As Range Set src = ThisWorkbook.Worksheets("MySheet").Range("A1:D2") ' [2] define any target, e.g. 1 column to the right of source data Dim target As Range, r&, c& r = src.Rows.Count: c = src.Columns.Count Set target = src.Offset(0, c + 1).Resize(r, c * 2) ' reserve double space for columns ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' [3] write redoubled source range columns back to target ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RedoubleCols src, target End Sub ,异常代码为SIGILL,这是我从未见过的。

我只能在ILL_ILLTRP中找到有关ILL_ILLTRP的唯一信息:

signal.h

在iOS(以及Swift或Obj-C)上,什么会导致“非法陷阱”的发生?

作为参考,这是崩溃线程的堆栈跟踪:

/*
 * When the signal is SIGILL or SIGFPE, si_addr contains the address of
 * the faulting instruction.
 * When the signal is SIGSEGV or SIGBUS, si_addr contains the address of
 * the faulting memory reference. Although for x86 there are cases of SIGSEGV
 * for which si_addr cannot be determined and is NULL.
 * If the signal is SIGCHLD, the si_pid field will contain the child process ID,
 *  si_status contains the exit value or signal and
 *  si_uid contains the real user ID of the process that sent the signal.
 */

/* Values for si_code */

/* Codes for SIGILL */
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
#define ILL_NOOP        0       /* if only I knew... */
#endif
#define ILL_ILLOPC      1       /* [XSI] illegal opcode */
#define ILL_ILLTRP      2       /* [XSI] illegal trap */
#define ILL_PRVOPC      3       /* [XSI] privileged opcode */
#define ILL_ILLOPN      4       /* [XSI] illegal operand -NOTIMP */
#define ILL_ILLADR      5       /* [XSI] illegal addressing mode -NOTIMP */
#define ILL_PRVREG      6       /* [XSI] privileged register -NOTIMP */
#define ILL_COPROC      7       /* [XSI] coprocessor error -NOTIMP */
#define ILL_BADSTK      8       /* [XSI] internal stack error -NOTIMP */

1 个答案:

答案 0 :(得分:2)

我试图了解发生了什么。我没有解决方案,但是有一些想法:

堆栈跟踪(第0行)表示崩溃是在第73行的CocoaLumberjack快速代码中,应使用{来访问Bool var asyncLoggingEnabled {1}}。
显然,这是指令

unsafeMutableAddressor

此代码在第73行。

我相信可以使用public var asyncLoggingEnabled = true docs)访问此var。这里的应用是

  

...负责处理您使用的任何内存的生命周期   通过不安全的指针来避免泄漏或未定义的行为。

特别是

  

许多指针操作只能应用于具有内存的指针   在特定状态下-您必须跟踪内存的状态   正在合作并了解对该状态的更改,   执行不同的操作。内存可以是无类型的和未初始化的,   绑定到类型并初始化,或者绑定到类型并初始化   值。最后,先前分配的内存可能具有   被释放,留下引用未分配的现有指针   记忆。

我相信您的应用程序崩溃是因为用于访问UnsafeMutablePointer的指针指向了处于非法状态的内存。
如果发生这种情况,应该执行系统陷阱以处理这种情况,但是只有在安装了针对此类异常的陷阱处理程序后才能执行。如果不是这种情况,则会执行非法陷阱(异常代码:ILL_ILLTRP),以处理所有未处理的陷阱。

取决于执行历史记录,内存可能也可能处于合法状态。因此,崩溃可能会发生或不会发生。

简而言之,我认为这是asyncLoggingEnabled中的错误。