The libmalloc provides self inspection facilities to detect corruption. Here is quote from
... ENVIRONMENT The following environment variables change the behavior of the allocation-related functions. ... MallocCheckHeapStart <s> If set, specifies the number of allocations <s> to wait before begining periodic heap checks every <n> as specified by MallocCheckHeapEach. If MallocCheckHeapStart is set but MallocCheckHeapEach is not specified, the default check repetition is 1000. MallocCheckHeapEach <n> If set, run a consistency check on the heap every <n> operations. MallocCheckHeapEach is only meaningful if MallocCheckHeapStart is also set. MallocCheckHeapSleep <t> Sets the number of seconds to sleep (waiting for a debugger to attach) when MallocCheckHeapStart is set and a heap corruption is detected. The default is 100 seconds. Setting this to zero means not to sleep at all. Setting this to a negative number means to sleep (for the positive number of seconds) only the very first time a heap corruption is detected. MallocCheckHeapAbort <b> When MallocCheckHeapStart is set and this is set to a non-zero value, causes abort(3) to be called if a heap corruption is detected, instead of any sleeping. ...
When I enable the corruption checker via
MallocCheckHeapStart=X (for my app it's 1000000),
MallocCheckHeapEach=Y (for my app it's 1, but it could be 10, 100, or 1000 to lessen the slowdown of the app),
MallocCheckHeapAbort=1, I consistently get corruption detected in a large app I'm working on within the first few minutes of the app launch. I've also asked a friend who works on a different large, legacy app - they report the same story - corruption is eventually detected.
The problem is, either
libmalloc is providing false-positive detection or all Swift-based iOS apps are susceptible to subtle memory corruption bugs.
So, I kindly ask any developers who are developing for iOS: could you please check if your app can survive several minutes with
libmalloc checks enabled without triggering the memory corruption check? I would recommend starting with these initial values:
MallocCheckHeapStart=100000 MallocCheckHeapEach=100 MallocCheckHeapAbort=1
If your app is running too slowly, you can adjust these values.
Thanks a lot in advance to anyone who has read this and tried it on their app!