Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何找到导致目标C崩溃的函数调用的来源?_Ios_Objective C_Swift_Iphone_Ipad - Fatal编程技术网

Ios 如何找到导致目标C崩溃的函数调用的来源?

Ios 如何找到导致目标C崩溃的函数调用的来源?,ios,objective-c,swift,iphone,ipad,Ios,Objective C,Swift,Iphone,Ipad,我的iPad应用程序是用Objective C编写的,它在NSDictionary类别中的方法上崩溃了,而NSDictionary类别是在框架中编写的(我在框架中只有头文件)。我并没有在任何地方调用那个category方法,但它不知何故被调用了,并且它正在崩溃,无法识别的选择器被发送到实例。我想找到导致这种情况的电话的来源。我们有什么办法可以做到吗 它只在iOS14上崩溃,在以下版本的iOS上运行良好。非常感谢您的帮助 用崩溃日志更新-NSDictionary(NSDictionary\u SA

我的iPad应用程序是用Objective C编写的,它在NSDictionary类别中的方法上崩溃了,而NSDictionary类别是在框架中编写的(我在框架中只有头文件)。我并没有在任何地方调用那个category方法,但它不知何故被调用了,并且它正在崩溃,无法识别的选择器被发送到实例。我想找到导致这种情况的电话的来源。我们有什么办法可以做到吗

它只在iOS14上崩溃,在以下版本的iOS上运行良好。非常感谢您的帮助

用崩溃日志更新-NSDictionary(NSDictionary\u SA\u Additions)是我前面提到的框架中的一个类别

2020-08-27 11:00:03.017073+0100 MyApp[5881:81328] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConstantIntegerNumber characterAtIndex:]: unrecognized selector sent to instance 0x7fff86cc4850'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff20439dee __exceptionPreprocess + 242
    1   libobjc.A.dylib                     0x00007fff20177f78 objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff2044893f +[NSObject(NSObject) instanceMethodSignatureForSelector:] + 0
    3   CoreFoundation                      0x00007fff2043e32e ___forwarding___ + 1489
    4   CoreFoundation                      0x00007fff20440368 _CF_forwarding_prep_0 + 120
    5   Foundation                          0x00007fff207c2b1f -[NSDictionary(NSKeyValueCoding) valueForKey:] + 79
    6   MyApp                               0x0000000101b645fd -[NSDictionary(NSDictionary_SA_Additions) SA_md5Hash] + 397
    7   MyApp                               0x0000000101b64646 -[NSDictionary(NSDictionary_SA_Additions) SA_md5Hash] + 470
    8   MyApp                               0x0000000101b6445b -[NSDictionary(NSDictionary_SA_Additions) hash] + 43
    9   libcache.dylib                      0x00007fff53be7bc7 _entry_get_optionally_checking_collisions + 42
    10  libcache.dylib                      0x00007fff53be6097 cache_get + 128
    11  CoreFoundation                      0x00007fff20465132 -[NSCache objectForKey:] + 152
    12  CoreText                            0x00007fff21000ed2 _ZN15TPurgeableCache19RetainedValueForKeyEPKv + 54
    13  CoreText                            0x00007fff210b192e _ZN12TCGFontCache21CopyFontWithVariationEP6CGFontPK14__CFDictionary + 1694
    14  CoreText                            0x00007fff210813e4 _ZNK29TTenuousComponentInstanceFont16CopyGraphicsFontEv + 150
    15  CoreText                            0x00007fff20fdf98b _ZNK9TBaseFont26GetInitializedGraphicsFontEv + 63
    16  CoreText                            0x00007fff2106ca11 _ZNK9TBaseFont13GetParserFontEv + 9
    17  CoreText                            0x00007fff21054284 _ZNK10TcmapTable8MapRangeE7CFRangePt + 42
    18  CoreText                            0x00007fff21072c20 _ZNK9TBaseFont26GetGlyphsForCharacterRangeE7CFRangePt + 94
    19  CoreText                            0x00007fff2107eab8 _ZNK14TComponentFont26GetGlyphsForCharacterRangeE7CFRangePt + 278
    20  CoreText                            0x00007fff20fc884a _ZN15TASCIIDataCacheC2EPK5TFont + 78
    21  CoreText                            0x00007fff20fdd430 _ZNK5TFont18InitASCIIDataCacheEv + 34
    22  CoreText                            0x00007fff20fcf9d0 CTFontGetLatin1GlyphsAndAdvanceWidths + 51
    23  UIFoundation                        0x00007fff239e0268 -[NSCoreTypesetter _NSFastDrawString:length:attributes:paragraphStyle:typesetterBehavior:lineBreakMode:rect:padding:graphicsContext:baselineRendering:usesFontLeading:usesScreenFont:scrollable:syncAlignment:mirrored:boundingRectPointer:baselineOffsetPointer:drawingContext:] + 1821
    24  UIFoundation                        0x00007fff239e1b0b -[NSCoreTypesetter _stringDrawingCoreTextEngineWithOriginalString:rect:padding:graphicsContext:forceClipping:attributes:stringDrawingOptions:drawingContext:stringDrawingInterface:] + 1278
    25  UIFoundation                        0x00007fff239db738 __NSStringDrawingEngine + 2887
    26  UIFoundation                        0x00007fff239dabc7 -[NSString(NSExtendedStringDrawing) boundingRectWithSize:options:attributes:context:] + 187
    27  UIKitCore                           0x00007fff24ae3d10 -[UILabel _drawTextInRect:baselineCalculationOnly:] + 4020
    28  UIKitCore                           0x00007fff24ae0ff7 -[UILabel drawTextInRect:] + 1061
    29  UIKitCore                           0x00007fff24ae3e42 -[UILabel drawRect:] + 71
    30  UIKitCore                           0x00007fff24ba1c85 -[UIView(CALayerDelegate) drawLayer:inContext:] + 625
    31  QuartzCore                          0x00007fff27a7830d -[CALayer drawInContext:] + 288
    32  QuartzCore                          0x00007fff27935321 CABackingStoreUpdate_ + 190
    33  QuartzCore                          0x00007fff27a819b9 ___ZN2CA5Layer8display_Ev_block_invoke + 53
    34  QuartzCore                          0x00007fff27a77b4a -[CALayer _display] + 2111
    35  QuartzCore                          0x00007fff27a8b327 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 463
    36  QuartzCore                          0x00007fff279cb3d4 _ZN2CA7Context18commit_transactionEPNS_11TransactionEdPd + 496
    37  QuartzCore                          0x00007fff27a02163 _ZN2CA11Transaction6commitEv + 783
    38  UIKitCore                           0x00007fff246656a0 __34-[UIApplication _firstCommitBlock]_block_invoke_2 + 81
    39  CoreFoundation                      0x00007fff203a834b __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
    40  CoreFoundation                      0x00007fff203a775f __CFRunLoopDoBlocks + 434
    41  CoreFoundation                      0x00007fff203a217c __CFRunLoopRun + 899
    42  CoreFoundation                      0x00007fff203a190e CFRunLoopRunSpecific + 567
    43  GraphicsServices                    0x00007fff2ba85db3 GSEventRunModal + 139
    44  UIKitCore                           0x00007fff24647ffd -[UIApplication _run] + 912
    45  UIKitCore                           0x00007fff2464cf0e UIApplicationMain + 101
    46  MyApp                               0x000000010177f16e main + 78
    47  libdyld.dylib                       0x00007fff20257415 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConstantIntegerNumber characterAtIndex:]: unrecognized selector sent to instance 0x7fff86cc4850'
CoreSimulator 732.13 - Device: iPad Air (3rd generation) (C762993D-AFF7-412A-89AF-92DB600B2153) - Runtime: iOS 14.0 (18A5351d) - DeviceType: iPad Air (3rd generation)
terminating with uncaught exception of type NSException

有趣。基于此,
CFDictionary
/
NSDictionary
的真正哈希函数似乎是最基本的(计算出的哈希值是字典中的元素数)。如果有人想要一本使用
NSDictionary
作为键的字典,这将导致大量冲突。似乎是通过
NSDictionary\u SA\u Additions
类别和
SA\u md5Hash
实现覆盖股票散列函数的合理原因

我认为下一步将是调查
NSDictionary
(内部有不同的值)的iOS14哈希函数与以前的iOS版本

我想如果检测到运行iOS14的话,一个潜在的修复方法可能是恢复
NSDictionary
的哈希函数,前提是这个麻烦的框架可以继续正常工作

更新: 无法还原类别。但是你可以通过旋转来覆盖它

#include <objc/message.h>
__attribute__((constructor))
static void premain() {
    SEL hashSelector = @selector(hash);
    Method method = class_getClassMethod([NSDictionary class], hashSelector);
    const char * encoding = method_getTypeEncoding(method);
    IMP newHashImplementation = imp_implementationWithBlock(^NSUInteger (NSDictionary* self, SEL __cmd){
        return CFDictionaryGetCount((CFDictionaryRef)self);
    });
    class_replaceMethod([NSDictionary class], hashSelector, newHashImplementation, encoding);
}
#包括
__属性(构造函数)
静态void premain(){
SEL hashSelector=@selector(散列);
方法Method=class\u getClassMethod([NSDictionary class],hashSelector);
const char*encoding=method\u getTypeEncoding(method);
IMP newHashImplementation=IMP_implementationWithBlock(^NSUInteger(NSDictionary*self,SEL\uu cmd){
返回CFDictionaryGetCount((CFDictionaryRef)self);
});
类\替换方法([NSDictionary类]、hashSelector、newHashImplementation、encoding);
}
这是一个新的实现,其精神是原始的。不幸的是,由于选择器名称(
“hash”
)冲突,我们无法在类别覆盖后获得真正的原始名称<代码>\uuuuu属性(构造函数))保证在你的应用程序完成初始化类别后第一件事就是执行它

或者,为了从字面意义上还原类别,需要对框架进行二进制修改。特别是
\uuuu文本,\uuuuu objc\u methname

您可以将
散列
更改为其他内容,例如
hasg
。但这几乎肯定会违反框架的许可证。

有人在NSConstantIntegerNumber类型的对象上调用NSString函数characterAtIndex,这显然不起作用


除非您觉得有责任在需要字符串键的字典中以某种方式将整数设置为键,否则我会针对iOS 14提交一份错误报告。

控制台崩溃时没有stacktrace?控制台中的完整错误消息是什么?谢谢您的回复。但是,我们能找出它试图覆盖哈希函数的代码中的哪个字典吗?类别哈希覆盖是在NSDictionary类级别上。因此,它会影响应用程序生命周期中的每个NSDictionary实例。但值得研究的是,这个麻烦的框架究竟使用了什么样的散列。在另一本词典中用作键的词典只是我的猜测。让我来看看。但是,我不确定我是否能够找到它,因为我只有它的头文件和所有我能看到的SA_md5Hash的整数声明@属性(非原子,只读)NSUSA_md5Hash整数;有没有办法停止使用框架类别?我在main.m中添加了代码,它似乎覆盖了框架的哈希函数。现在,它没有崩溃。我现在对swizzling感兴趣,并试图了解它是如何工作的。谢谢你的耐心和帮助。