Mobile APM: Feedback on methods for uploading dSYM files

New Relic Mobile iOS crash monitoring is one of our favorite features. In order to make it work, we rely on app developers to upload dSYM files so our services can symbolicate crashes, making the crash stacks an incredibly powerful tool when debugging iOS performance.

Today, we have a few ways of supplying dSYMs to us outlined in the docs. We are looking for your feedback regarding your method of choice and why that method works for you.

Our recommended approach is to add a post-build step to your app that invokes a Python script ( packaged with the agent. This script finds the dSYMs, converts them to text files (map files), then uploads those map files to New Relic. The map files allow us to symbolicate crashes faster, allowing us to decouple our systems from OSX hardware and ultimately letting us scale faster and bigger.

A second approach of supplying map files to us is by using an HTTP endpoint that accepts zipped up dSYMs. Once uploaded, we have systems in place to convert the dSYMs to map files, supplementing the step missed by not using the packaged Python script. This option is more manual and could slow down symbolication time as our systems must wait until the map files are ready for use.

We want to make the New Relic XCFramework (formally known as iOS) agent the best it can be, so we’re curious – why do you prefer the second option (manual dSYM upload) to the first (automatic uploads by the agent)?

Thank you for your feedback!


Hello, Thank you for great APM!

why do you prefer the second option to the first?

Whenever i try to use, I surface some problems.

One is we use CI via Bitrise and I noticed that there is an error when i run the script, The error indicates that a tmp directory has already exist and due to that reason, our dSYM files didn’t upload correctly.

The other is i confirmed that sometimes dSYM upload endpoint returns rate limit exceed error while processing dSYM files. But it can be reduce to rewrite the retry count set to 1 (By default is 3). And if the error is occurred, remaining tasks is almost failed.

Beside this reasons, We mainly use python3. is only provided via python2. It more stable than python3, but it already unsupported officially.
I would be happy if the script written in python3.

Thank you!

FYI: Our script patch for avoid directory conflict

1 Like

Thanks for the detailed feedback @native! Really great to see!

1 Like