我时不时地遇到一个小问题,我的程序在创建新线程后立即出现段错误。
新线程有一个回溯,如:
Thread 24 Crashed:
0 libsystem_c.dylib 0x00007fff8ea3c358 _spin_lock$VARIANT$mp + 8
1 libsystem_c.dylib 0x00007fff8e9e9f25 _pthread_exit + 55
2 libsystem_c.dylib 0x00007fff8e9ea27d pthread_exit + 30
3 libsystem_c.dylib 0x00007fff8e9a022b cthread_set_errno_self + 76
4 libsystem_kernel.dylib 0x00007fff87cd701d cerror + 33
5 libsystem_c.dylib 0x00007fff8e9e88bf _pthread_start + 335
6 libsystem_c.dylib 0x00007fff8e9ebb75 thread_start + 13
崩溃时CPU的状态如下:
Thread 24 crashed with X86 Thread State (64-bit):
rax: 0x0000000000000000 rbx: 0x0000000000000001 rcx: 0x00007fff87cd55ba rdx: 0x00000000ffffffff
rdi: 0x0000000101f0e010 rsi: 0x0000000000000001 rbp: 0x0000000101f0de70 rsp: 0x0000000101f0de08
r8: 0x0000000101f0e010 r9: 0x0000000000000001 r10: 0x00007fff87cd5ca6 r11: 0x0000000000000202
r12: 0x0000000000000032 r13: 0x0000000101f0e000 r14: 0x0000000101f0e000 r15: 0x0000000007010101
rip: 0x00007fff8ea3c358 rfl: 0x0000000000010286 cr2: 0x0000000101f0e010
Logical CPU: 0
cr2
==rdi
和r8
; 在没有看到这些实际代码的情况下,我只能冒险猜测为什么这个地址无效。
这似乎是一个问题errno
,哪个(AFAIK)是线程本地存储?
这可能是由于程序中其他地方的堆或其他内存损坏造成的吗?这个特殊问题非常难以重现,但如果可能的话,解决这个问题会很棒。