C函数在Mac OS X 10.11或更早版本或Windows上运行,但在Mac OS X 10.12中崩溃

时间:2016-09-30 20:18:21

标签: c++ assembly macos-sierra

我在Mac OS X上有一个可动态加载的软件包,它在Mac OS X Sierra上崩溃了。它在早期的Mac OS X版本(至少在64位上)上工作正常,并且(这是一个跨平台的插件,这个代码是共享的)在Windows上,32位和64位。该软件包在Mac OS X 10.11上编译,clang处于通用模式,无需针对10.11 SDK进行优化;最小操作系统版本首先设置为10.4,然后设置为10.11而没有任何影响。

它在一个相当简单的功能中崩溃。我没有访问Sierra的计算机,所以我只有崩溃日志,崩溃的二进制文件和源代码。我正在尝试阅读程序集转储以了解可能出错的地方。到目前为止,一切似乎都没问题(有一些冗余的操作,但没有错误),但我对汇编不熟悉。以下是相关部分:

崩溃日志:

Exception Type:        EXC_BAD_ACCESS (SIGSEGV)
Exception Codes:       KERN_INVALID_ADDRESS at 0x0000140009f3cabc
Exception Note:        EXC_CORPSE_NOTIFY
...
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 ... 0x0000000109f2825b Do_GetString2(unsigned char, unsigned long, unsigned short*) + 171
...
Thread 0 crashed with X86 Thread State (64-bit):
  rax: 0x0000000000000000  rbx: 0x00007fcb95adc528  rcx: 0x0000140009f3cabc  rdx: 0x0000000000000000
  rdi: 0x0000000000000082  rsi: 0x0000000000000100  rbp: 0x00007fff5b5f5f10  rsp: 0x00007fff5b5f5f10
   r8: 0x00000000000014c0   r9: 0x0000000000000001  r10: 0x0000000106c823fc  r11: 0x0000000106c82400
  r12: 0x0000000000000082  r13: 0x0000000000000000  r14: 0x00007fcb95adc552  r15: 0xffffffffffffffff
  rip: 0x0000000109f2825b  rfl: 0x0000000000010287  cr2: 0x0000140009f3cabc

Do_GetString2是一个简单的函数,可以将一些简短的ASCII字符串复制到更宽的UTF-16字符串中:

static void
Do_GetString2(uint8_t type, uint64_t limit, uint16_t *target)
{
    const char *source; uint64_t i;

    switch (type) {
        case 128 : source = strings[0]; break;
        case 129 : source = strings[1]; break;
        case 131 : source = strings[2]; break;
    }
    for (i = 0; i < limit && source[i] != '\0'; ++i)
        target[i] = source[i];
}

strings就是这样:

static const char* strings[] = {
    "... A ...",
    "... B ...",
    "... C ..."
};

汇编代码如下。就我而言,崩溃的地址是(+171)000000000000125b,这意味着它在尝试阅读source[i]时崩溃,第一个字符(i是{{1} }})。 0参数为type131limit256)。 (我在这里可能是错的,正如我所说,我对汇编并不熟悉。)这可能是对图书馆的第一次调用。

0x100

有人在这里看到任何错误吗?我可以尝试调试此崩溃吗?这是一个GUI应用程序,所以我不确定我是否可以使用gdb或类似的方法通过SSH调试它。

0 个答案:

没有答案