Skip to main content
Answered

iOS crash randomly on saveMetrics

  • February 17, 2025
  • 1 reply
  • 7 views

iOS crashed randomly (18.5 version of SDK).
Stacktrace: 

Thread 25 name:
Thread 25 name:
Thread 25 Crashed:
0   libsystem_kernel.dylib            0x00000001e3b572d4 __pthread_kill + 8 (:-1)
1   libsystem_pthread.dylib           0x000000021d08d59c pthread_kill + 268 (pthread.c:1721)
2   libsystem_c.dylib                 0x000000019a2a0b08 abort + 128 (abort.c:122)
3   libsystem_malloc.dylib            0x00000001a2a54b74 malloc_vreport + 896 (malloc_printf.c:251)
4   libsystem_malloc.dylib            0x00000001a2a7dc00 malloc_zone_error + 100 (malloc_printf.c:319)
5   libsystem_malloc.dylib            0x00000001a2a72c30 nanov2_guard_corruption_detected + 44 (nanov2_malloc.c:2496)
6   libsystem_malloc.dylib            0x00000001a2a53c6c nanov2_allocate_outlined + 460 (nanov2_malloc.c:2989)
7   libsystem_malloc.dylib            0x00000001a2a53a18 nanov2_calloc_type + 568 (nanov2_malloc.c:1247)
8   libobjc.A.dylib                   0x000000018f9a8b04 class_createInstance + 72 (objc-runtime-new.mm:9183)
9   CoreFoundation                    0x000000019243d670 __CFAllocateObject + 20 (NSObject.m:706)
10  CoreFoundation                    0x000000019243d2b8 __NSDictionaryM_new + 136 (NSDictionaryM.m:359)
11  Foundation                        0x0000000191039ccc _encodeObject + 980 (NSKeyedArchiver.m:1252)
12  Foundation                        0x0000000191039734 -[NSKeyedArchiver _encodeArrayOfObjects:forKey:] + 460 (NSKeyedArchiver.m:1300)
13  Foundation                        0x0000000191202ee4 -[NSSet(NSSet) encodeWithCoder:] + 384 (NSSet_Foundation.m:42)
14  Foundation                        0x0000000191039d94 _encodeObject + 1180 (NSKeyedArchiver.m:1255)
15  Intercom                          0x000000010341f000 -[ICMMetric encodeWithCoder:] + 92
16  Foundation                        0x0000000191039d94 _encodeObject + 1180 (NSKeyedArchiver.m:1255)
17  Foundation                        0x00000001910d7a8c +[NSKeyedArchiver archivedDataWithRootObject:requiringSecureCoding:error:] + 92 (NSKeyedArchiver.m:651)
18  Intercom                          0x00000001033f5d4c +[ICMPersistenceProxy archiveRootObject:toFile:] + 64
19  Intercom                          0x000000010341ed84 +[ICMMetric saveMetrics:] + 96
20  libdispatch.dylib                 0x000000019a1e5248 _dispatch_call_block_and_release + 32 (init.c:1549)
21  libdispatch.dylib                 0x000000019a1e6fa8 _dispatch_client_callout + 20 (object.m:576)
22  libdispatch.dylib                 0x000000019a1f9094 _dispatch_root_queue_drain + 860 (queue.c:7331)
23  libdispatch.dylib                 0x000000019a1f96c4 _dispatch_worker_thread2 + 156 (queue.c:7399)
24  libsystem_pthread.dylib           0x000000021d088644 _pthread_wqthread + 228 (pthread.c:2709)
25  libsystem_pthread.dylib           0x000000021d086474 start_wqthread + 8 (:-1)

How to disable metrics saving to avoid this crash? Can you fix it?

Best answer by mateusz.leszkiewicz

hi ​@Siarhei Leushunou It’s Mat from the Support Engineering Team 😀
 

You’re experiencing a crash in the Intercom iOS SDK (18.5) related to metrics saving. The stack trace indicates a failure when ICMMetric saveMetrics: attempts to persist data, specifically during NSKeyedArchiver serialization.

 

The issue is likely due to:

1. Corrupt data being saved in metrics.

2. Thread safety issue when multiple threads attempt to write metrics simultaneously.

3. Memory corruption (nanov2_guard_corruption_detected) related to malloc.

 

To mitigate the crash, you can disable metrics saving.

✅ Workaround: Disable Metrics Saving

 

You can prevent ICMMetric from persisting data by disabling logging in Intercom. Add the following code during SDK initialization:

 

Option 1: Disable Logs via Intercom API

Intercom.setLogLevel(.none) // Prevents unnecessary logging

This reduces metric logging but may not fully prevent saving.

 

Option 2: Disable Metrics via User Defaults (More Reliable)

 

Intercom does not provide a direct way to disable metrics persistence, but you can override the UserDefaults storage key for metrics by injecting an invalid or empty value.

UserDefaults.standard.set(nil, forKey: "ICMMetricSavedKey") 
UserDefaults.standard.synchronize()

This will prevent the SDK from retrieving old metric data and attempting to save it.

 

Option 3: Patch the SDK (If You Control the Source)

 

If you have access to the SDK source, you can monkey-patch ICMMetric to avoid writing to disk:

• Locate +[ICMMetric saveMetrics:] in the SDK.

• Replace the contents with:

+ (void)saveMetrics:(NSArray *)metrics {
    return; // No-op to prevent crashes
}

 

This will completely disable metric persistence.

🚀 Permanent Fix

 

Since this issue appears in SDK 18.5, we recommend updating to the latest SDK version at the moment it is 18.6.1 where this might have been resolved.

1. Check for an updated version of Intercom iOS SDK:

pod outdated Intercom

 

2. If an update is available, upgrade:

pod update Intercom

 

If the issue persists after updating, please let us know. We can escalate this to the Intercom engineering team for a deeper investigation. 🚀

View original
Did this topic help you find an answer to your question?

1 reply

mateusz.leszkiewicz
Intercom Team
Forum|alt.badge.img+5

hi ​@Siarhei Leushunou It’s Mat from the Support Engineering Team 😀
 

You’re experiencing a crash in the Intercom iOS SDK (18.5) related to metrics saving. The stack trace indicates a failure when ICMMetric saveMetrics: attempts to persist data, specifically during NSKeyedArchiver serialization.

 

The issue is likely due to:

1. Corrupt data being saved in metrics.

2. Thread safety issue when multiple threads attempt to write metrics simultaneously.

3. Memory corruption (nanov2_guard_corruption_detected) related to malloc.

 

To mitigate the crash, you can disable metrics saving.

✅ Workaround: Disable Metrics Saving

 

You can prevent ICMMetric from persisting data by disabling logging in Intercom. Add the following code during SDK initialization:

 

Option 1: Disable Logs via Intercom API

Intercom.setLogLevel(.none) // Prevents unnecessary logging

This reduces metric logging but may not fully prevent saving.

 

Option 2: Disable Metrics via User Defaults (More Reliable)

 

Intercom does not provide a direct way to disable metrics persistence, but you can override the UserDefaults storage key for metrics by injecting an invalid or empty value.

UserDefaults.standard.set(nil, forKey: "ICMMetricSavedKey") 
UserDefaults.standard.synchronize()

This will prevent the SDK from retrieving old metric data and attempting to save it.

 

Option 3: Patch the SDK (If You Control the Source)

 

If you have access to the SDK source, you can monkey-patch ICMMetric to avoid writing to disk:

• Locate +[ICMMetric saveMetrics:] in the SDK.

• Replace the contents with:

+ (void)saveMetrics:(NSArray *)metrics {
    return; // No-op to prevent crashes
}

 

This will completely disable metric persistence.

🚀 Permanent Fix

 

Since this issue appears in SDK 18.5, we recommend updating to the latest SDK version at the moment it is 18.6.1 where this might have been resolved.

1. Check for an updated version of Intercom iOS SDK:

pod outdated Intercom

 

2. If an update is available, upgrade:

pod update Intercom

 

If the issue persists after updating, please let us know. We can escalate this to the Intercom engineering team for a deeper investigation. 🚀


Cookie policy

We use cookies to enhance and personalize your experience. If you accept you agree to our full cookie policy. Learn more about our cookies.

 
Cookie settings