我在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
参数为type
,131
为limit
(256
)。 (我在这里可能是错的,正如我所说,我对汇编并不熟悉。)这可能是对图书馆的第一次调用。
0x100
有人在这里看到任何错误吗?我可以尝试调试此崩溃吗?这是一个GUI应用程序,所以我不确定我是否可以使用gdb或类似的方法通过SSH调试它。