ChatGPT解决这个技术问题 Extra ChatGPT

How to symbolicate crash log Xcode?

Xcode 5 organizer had a view which would list all the crash logs. and we could drag drop crash logs here. But since Xcode 6, I know they have moved devices out of organize and have a new window for the same. But I do not find a place where I view the crash logs which i drag-dropped in Xcode 5 after upping to Xcode 6. Anybody knows the answer ?

I asked this months ago on the Apple developer forums and never got an answer. This is a loss of useful functionality. File a bug report with Apple asking to get this feature back.
I knocked this together over a weekend to solve symbolication for both iOS and OSX crash dumps. It is still very rough, but it should work. github.com/agentsim/Symbolicator
Xcode, can you please just f---ing symbolicate crash logs from Apple reviewers like you are supposed to... rather than assume we literally have all day to figure out how to do this?

S
Sea Coast of Tibet

Writing this answer as much for the community as for myself.

If there ever are problems symbolicating a crash report, one can overcome them as follows:

Create a separate folder, copy Foo.app and Foo.app.dSYM from the corresponding .xcarchive into the folder. Also copy the .crash report into the folder. Open the crash report in TextEdit or elsewhere, go to the Binary Images: section, and copy the first address there (e.g. 0xd7000). cd into the folder. Now you can run the following command: xcrun atos -o Foo.app/Foo -arch arm64 -l 0xd7000 0x0033f9bb

This will symbolicate the symbol at address 0x0033f9bb. Please make sure to pick the correct value for the -arch option (can be obtaned from the first line in the Binary Images: section, or figured out from the Hardware Model: in the crash report and the app's supported archs).

You can also copy the necessary addresses (e.g. a thread call stack) from the crash report directly into a text file (in TextEdit, hold Option and select the necessary text block, or copy and cut), to get something like this:

0x000f12fb
0x002726b7
0x0026d415
0x001f933b
0x001f86d3

Now you can save this into a text file, e.g. addr.txt, and run the following command:

xcrun atos -o Foo.app/Foo -arch arm64 -l 0xd7000 -f addr.txt

This will give a nice symbolication for all the addresses at once.

P.S.

Before doing the above, it's worth checking that everything is set up correctly (as atos will happily report something for basically any supplied address).

To do the checking, open the crash report, and go to the end of the call stack for Thread 0. The first line from the end to list your app (usually the second one), e.g.:

34  Foo                    0x0033f9bb 0xd7000 + 2525627

should be the main() call. Symbolicating the address (0x0033f9bb in this case) as described above should confirm that this is indeed main() and not some random method or function.

If the address is not that of main(), check your load address (-l option) and arch (-arch option).

P.P.S.

If the above doesn't work due to bitcode, download the dSYM for your build from iTunes Connect, extract the executable binary from the dSYM (Finder > Show Package Contents), copy it into the directory, and use it (i.e. Foo) as the argument to atos, instead of the Foo.app/Foo.


thank you for the trouble of writing the mini xcrun tutorial and updating it with the sanity check section. my sanity is saved after lots of swearing and no symbolicate in sight
Don't forget to validate that the crash report matches the executable and dSYM. You can check this by matching the identifier in the <>'s under the Binary Image section with that returned from your executable file by running xcrun dwarfdump --uuid <path to executable>
It's important to note that only symbols from your app (Foo) will show up. It won't show up for symbols from external libraries / frameworks, such as Foundation, or libsystem_kernel.dylib.
this is helpful, but still doesn't work for me. the part I'm having trouble with is i don't have the 0xd7000 information. my line looks like this 0x100038328 __mh_execute_header + 99112. I've read what __mh_execute_header is but how can i get info on 0x100038328??? i have everything else
I wrote a simple bash script that does most of the work for you. Usage: ./symbolicate.sh mycrash.crash MyApp.app arch64 output.crash Only it will symbolicate the full crash report and give you the symbolicated version of it. gist.github.com/nathan-fiscaletti/…
N
Nimantha

You can refer this one too, I have written step by step procedure of Manual Crash Re-Symbolication.

Crash Re-Symbolication

STEP 1

Move all the above files (MyApp.app, MyApp-dSYM.dSYM and MyApp-Crash-log.crash) into a Folder with a convenient name wherever you can go using Terminal easily.

For me, Desktop is the most easily reachable place ;) So, I have moved these three files into a folder MyApp at Desktop.

STEP 2

Now its turn of Finder, Go to the path from following whichever is applicable for your XCODE version.

Use this command to find the symbolicatecrash script file,
find /Applications/Xcode.app -name symbolicatecrash

Xcode 8, Xcode 9, Xcode 11 /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

Xcode 7.3 /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

XCode 7 /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash

Xcode 6 /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

Lower then Xcode 6 Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

Or Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources

STEP 3

Add the found symbolicatecrash script file's directory to $PATH env variable like this: sudo vim /etc/paths.d/Xcode-symbolicatecrash and paste the script file's directory and save the file. When opening a new terminal, you can call symbolicatecrash at any folder as commands located in /usr/bin.

Or

Copy symbolicatecrash file from this location, and paste it to the Desktop/MyApp (Wait… Don’t blindly follow me, I am pasting sybolicatecrash file in folder MyApp, one that you created in step one at your favorite location, having three files.)

STEP 4

Open Terminal, and CD to the MyApp Folder.

cd Desktop/MyApp — Press Enter
export DEVELOPER_DIR=$(xcode-select --print-path)

 — Press Enter

./symbolicatecrash -v MyApp-Crash-log.crash MyApp.dSYM

 — Press Enter

That’s it !! Symbolicated logs are on your terminal… now what are you waiting for? Now simply, Find out the Error and resolve it ;)


Use export DEVELOPER_DIR=xcode-select --print-path
Worked a treat - thank you. Just one thing I had to use export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer (without the quotes).
"export DEVELOPER_DIR=xcode-select --print-path" just tells me "-bash: export: `--print-path': not a valid identifier
update; here it is ; for xcode7 find symbolicatecrash here ; /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash per stackoverflow.com/questions/32804611/…
hm, it does only symbolicate everything except my app target's symbols i provided the dsym for...
p
pkamb

Ok I realised that you can do this:

In Xcode > Window > Devices, select a connected iPhone/iPad/etc top left. View Device Logs All Logs

You probably have a lot of logs there, and to make it easier to find your imported log later, you could just go ahead and delete all logs at this point... unless they mean money to you. Or unless you know the exact point of time the crash happened - it should be written in the file anyway... I'm lazy so I just delete all old logs (this actually took a while).

Just drag and drop your file into that list. It worked for me.


I am having the same problem, but this doesn't resolve the issue for me - logs which I drag & drop into the window appear, but don't symbolicate.
The trick is that you have to connect a device and select the device from the list. I don't think it's possible without a device.
In order for your crash file to be draggable into that list, it should have the extension .crash.
The missing step for me was once the file was dropped I needed to right mouse click on file and Re-Symbolicate Log
Don't forget to "Download dSYMs" for that archive inside Organizer.
M
Marek Manduch

For me the .crash file was enough. Without .dSYM file and .app file.

I ran these two commands on the mac where I build the archive and it worked:

export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer" 

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash  /yourPath/crash1.crash > /yourPath/crash1_symbolicated.crash

wow. I don't know how this works without the .dsym file but it works!
@rustyMagnet The way it works is by using dsyms from the archived builds on your computer.
Yeah, this only works for builds you've archived with Xcode, not any other builds that you may have generated for ad-hoc runs that you then want to symbolicate crash logs for.
E
Esref

There is an easier way using Xcode (without using command line tools and looking up addresses one at a time)

Take any .xcarchive file. If you have one from before you can use that. If you don't have one, create one by running the Product > Archive from Xcode. Right click on the .xcarchive file and select 'Show Package Contents' Copy the dsym file (of the version of the app that crashed) to the dSYMs folder Copy the .app file (of the version of the app that crashed) to the Products > Applications folder Edit the Info.plist and edit the CFBundleShortVersionString and CFBundleVersion under the ApplicationProperties dictionary. This will help you identify the archive later Double click the .xcarchive to import it to Xcode. It should open Organizer. Go back to the crash log (in Devices window in Xcode) Drag your .crash file there (if not already present) The entire crash log should now be symbolicated. If not, then right click and select 'Re-symbolicate crash log'


Your answer is correct and simple. There is no need to use the Terminal app. The recreation of the .xcarchive folder is very important, since there is no .xcarchive file in some Continuous-Integration system, instead of the .app.dSYM folder's zip ball. By coincidence, what I have done yesterday is exactly the same as you said.
what should the full output look like?
This partially symbolicates my crash logs although I did skip step 3-5 as my xcarchive is for the version of the app that crashed.
It will only symbolicate your own code of course - not the external library code that you may have used.
What if dragging doesn't work? The file does have the .crash extension but the window rejects it (it does the animation where it moves back). Regardless of where I drag it or whether I have All Logs selected or not.
S
Suraj K Thomas

Xcode 11.2.1, December 2019

Apple gives you crash log in .txt format , which is unsymbolicated

**

With the device connected

**

Download ".txt" file , change extension to ".crash" Open devices and simulators from window tab in Xcode select device and select device logs drag and drop .crash file to the device log window

https://i.stack.imgur.com/7hMne.gif

We will be able to see symbolicated crash logs over there

Please see the link for more details on Symbolicating Crash logs


Wow. Changing file extension from .txt to .crash did it. They gave me a .txt file. Thanks man. Can't believe your answer is this low.
E
Ely

Follow these steps in Xcode 10 to symbolicate a crash log from an app build on the same machine:

Inside Organizer, locate the archive where the app is based on. Click on the Download Debug Symbols button. Nothing will appear in your Downloads folder, but that's OK. Connect the build machine to an iOS device. Select the device in Devices and Simulators. Click on the View Devices Logs button. Drag-and-drop the crash file to the left panel. The file must end with a .crash extension, otherwise the drag fails. Switch to the All Logs tab. Select the added crash file. The file should automatically symbolicate, otherwise use the right-click context menu item Re-Symbolicate Log.


At first I didn't think that this was adding anything to other posts but the first two steps, specifically the 'Download Debug Symbols', seems to be what I was missing. Thank you.
V
Victor Bogdan

You need access to the .dSYM package (folder) that contains a DWARF file, and you should open the .crash file with an editor.

Looking at the backtrace section, you should see something like this:

...
13  TheElements                         0x0000000100f62ca0 0x100f5c000 + 27808
14  UIKitCore                       0x00000001843e3044 -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 356 (UIApplication.m:2328)
...

Binary Images:
0x100f5c000 - 0x101673fff TheElements arm64 ...
...

Note the long address in the stacktrace section, the 3rd column (0x0000000100f62ca0) Note the short address in the 4th column (0x100f5c000) Note the architecture in the Binary Images section (arm64) Execute the following:

$ atos -arch <arch> -o TheElements.app.dSYM/Contents/Resources/DWARF/TheElements -l <short_address> <long_address>

You should get a result like this:

-[AtomicElementViewController myTransitionDidStop:finished:context:]

Authoritative source: https://developer.apple.com/library/content/technotes/tn2151/_index.html#//apple_ref/doc/uid/DTS40008184-CH1-SYMBOLICATE_WITH_ATOS

Note: if for any reason you don't have access to the .dSYM file, you can recreate the .xcarchive using Xcode>Product>Archive, but make sure you are building the exact same code. Then you can extract the symbols from inside the .xcarchive package.


This worked for me. Note that the second to last number (0x1000e4000 in the example above) is found in the first column of the Binary Images section, or the fourth column of the stack trace. Also, it was not necessary to have the .dSYM and the .crash file in the same sub-folder.
Updated the answer to simplify it. Added some extra info too.
B
Bouke

Make sure that your Xcode application name doesn't contain any spaces. This was the reason it didn't work for me. So /Applications/Xcode.app works, while /Applications/Xcode 6.1.1.app doesn't work.


Have you tried? If not, please try and see if your comment makes any sense.
That is not the same issue as I'm talking about. Xcode can be renamed after install, but before first use. However the script for symbolication cannot handle spaces in the application's name and will fail.
@ChuckKrutsinger Have you actually tried? Because escaped spaces will allow you to run the script, but the script itself will fail. The script probably doesn't call other scripts with the escaped space.
@ChuckKrutsinger That's very nice and all, but if one wants Xcode to automatically symbolicate the crash log, you'll need my answer in the end.
I'd like to reiterate that bouke is correct and that if you have a space in the path for the Xcode app, the script Xcode uses to re-symbolicate crash logs will NOT work. Nothing to do with manual re-symbolication.
E
Ethan

From Apple's docs:

Symbolicating Crash Reports With Xcode Xcode will automatically attempt to symbolicate all crash reports that it encounters. All you need to do for symbolication is to add the crash report to the Xcode Organizer.

Connect an iOS device to your Mac

Choose "Devices" from the "Window" menu

Under the "DEVICES" section in the left column, choose a device

Click the "View Device Logs" button under the "Device Information" section on the right hand panel

Drag your crash report onto the left column of the presented panel

Xcode will automatically symbolicate the crash report and display the results To symbolicate a crash report, Xcode needs to be able to locate the following: The crashing application's binary and dSYM file. The binaries and dSYM files for all custom frameworks that the application links against. For frameworks that were built from source with the application, their dSYM files are copied into the archive alongside the application's dSYM file. For frameworks that were built by a third-party, you will need to ask the author for the dSYM file. Symbols for the OS that the that application was running on when it crashed. These symbols contain debug information for the frameworks included in a specific OS release (e.g, iOS 9.3.3). OS symbols are architecture specific - a release of iOS for 64-bit devices won't include armv7 symbols. Xcode will automatically copy OS symbols from each device that you connect to your Mac.

The crashing application's binary and dSYM file.

The binaries and dSYM files for all custom frameworks that the application links against. For frameworks that were built from source with the application, their dSYM files are copied into the archive alongside the application's dSYM file. For frameworks that were built by a third-party, you will need to ask the author for the dSYM file.

Symbols for the OS that the that application was running on when it crashed. These symbols contain debug information for the frameworks included in a specific OS release (e.g, iOS 9.3.3). OS symbols are architecture specific - a release of iOS for 64-bit devices won't include armv7 symbols. Xcode will automatically copy OS symbols from each device that you connect to your Mac.

If any of these are missing Xcode may not be able to symbolicate the crash report, or may only partially symbolicate the crash report.


S
Sanchita

The easiest process to symbolicate crash logs:

preserve the xcarchive file from the organizer during IPA building process for future use. When the crash occurs, collect the crash logs from affected device. The extension should be .crash. If the crash log is in .ips format, just rename it to .crash. Double click the xcarchive from the stored path to make it appear in organizer(if not present already). open in xcode window->devices and simulators -> view device logs -> all logs -> drag and drop the .crash file.

Wait for 5secs. Bang! the application calls in stack trace will be symbolicated! You may still see a lot of symbols though! those are internal library and framework calls.

This is the easiest one, tried and tested!


S
SaadurRehman

I was struggling to have the crash report symbolicated through atos but I was reluctant as the process seems cumbersome, But I found the crash report in the Xcode-> Window -> Organizer->Crashes(in left-side menu) Xcode will automatically download the crash logs and will symbolicate automatically, From there you can easily find the reason of the crash.

https://i.stack.imgur.com/AKijZ.png