Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the difference between DWARF and DWARF with dSYM file?

Tags:

xcode

ios

dwarf

XCode supports those 2 values for this Build Setting:

Build Settings > Build Options > Debug Information Format.

Could anybody explain the differences?

like image 674
Lio Avatar asked Mar 20 '14 16:03

Lio


People also ask

What is dSYM file?

A dSYM file is an ELF file that contains DWARF (debugging with attributed record formats) debug information for your application. DWARF is a debugging file format that supports source-level debugging.

What is dSYM file Mac?

On macOS, debug symbols are often in stand alone bundles called dSYM files. These are bundles that contain DWARF debug information and other resources related to builds and debug info. The DebugSymbols. framework framework helps locate dSYM files when given a UUID.

What is dSYM file Crashlytics?

iOS+ Android Flutter Unity. By default, Firebase Crashlytics automatically processes your debug symbol (dSYM) files to give you deobfuscated and human-readable crash reports. This behavior is set when you add a run script that initializes Crashlytics to your app's build phase.

What is dSYM in Swift?

Xcode Debugging Symbols(dSYM) dSYM ) which contains a mapping information and with which you can, for example, decode a stack-trace into readable format.

What is the difference between dSYM and dwarf?

The DWARF debug information in all of the .o files is intelligently linked into the dSYM file. Any code that was dead stripped will have its debug information removed, and the dsymutil will unique types within the debug information, so the resulting DWARF is much smaller and more efficient.

What is the difference between dwarf and dwarf?

It is the plural form of dwarf, where dwarf is either a human with genetically-based unusual short stature, or a creature who appears in fantasy literature. Human dwarfs are usually defined as having an adult height of less than 4’10”.

What is the difference between Pygmies and dwarves?

Dwarves have the least amount of muscle mass while midgets have the most. Pygmies have even more muscle mass than dwarves which helps them to be able to move quickly and easily. Midgets also have more muscle mass than pygmyes which gives them better endurance and strength.

What is the plural of dwarves?

What does dwarves mean? Dwarves is an alternative spelling of dwarfs. It is not a standard spelling either as a plural noun or a verb, but it still occasionally appears and appears to be growing in use. This chart, which graphs dwarfs vs. dwarves, shows that dwarfs is about three times more common, but dwarves still occasionally appears.


3 Answers

The difference is that in the case of DWARF with dSYM file your Archive app.xcarchive (for adHoc distribution) contains also dSYM file needed for reverse symbolication of your code in crash reports. In general, .xcarchive contains

dSyms Products info.plist 

So if you need it for external analysis of crash reports under archiving you app for distribution you should use DWARF with dSYM file.

like image 92
malex Avatar answered Sep 22 '22 04:09

malex


As always understanding the abbreviations help!

DWARF is a widely used, standardized debugging data format:

DWARF was originally designed along with Executable and Linkable Format (ELF), although it is independent of object file formats. The name is a medieval fantasy complement to "ELF" that has no official meaning. Only that both (dwarf and elf) are mythological creatures

Debug Symbol (dSYM):

By default, debug builds of an application store the debug symbols inside the compiled binary while release builds of an application store the debug symbols in a companion dSYM file to reduce the binary size.

The Debug Symbol file and application binary are tied together on a per-build-basis by the build UUID. A new UUID is generated for each build of your application and uniquely identifies that build. Even if a functionally-identical executable is rebuilt from the same source code, with the same compiler settings, it will have a different build UUID.

For example, if you have a library libfoo.dylib, the debug symbol file would be libfoo.dylib.dSYM.

From here

So long story short

  • DWARF is just a debug file

  • DWARF with dSYM File is a debug file along with symbolification file


Pro tip:

On our project's GitHub repo, on the releases section we have something like this:

enter image description here

We upload the .ipa and dysm file so then if 3 months from now a user has a weird crash for our 10.16 build then we'd go to this release branch and run it with this dsym and try to reproduce the issue.

like image 45
mfaani Avatar answered Sep 19 '22 04:09

mfaani


Both DWARF and DWARF with dSYM create DWARF debug information like on all other platforms, but they differ on where the debug information will be accessed when debugging or symbolicating:

DWARF means that the debug information is left in .o files and this debug information is not linked during the build process. Each .o file will contain unlinked DWARF and the debugger (LLDB, GDB) will link the debug information on the fly when debugging. The main executable contains a debug map contained in the symbol table which has everything that is needed to link the debug information. The maps contains STABS symbol entries that points to each .o file and tells the debugger or linker where everything needs to be linked (for functions, globals and static variables). The debug information will be less efficient since it is not linked, and each .o file can contain type definitions that are also found in other .o files, so the overall debug information size will be bigger. This is often most useful for the edit/compile/debug cycles that you while implementing new features or trying to track down bugs. The benefit is you do not have to link the debug information during your build process. Not all tools that parse debug information support this mode of debug information, so you might want create dSYM files if local crash reports on your system do not contain source file and line information in the backtraces. Tools like sample, ReportCrash, and Instruments that need to parse debug information might not support the DWARF setting.

DWARF with dSYM means that after you build your executable, a dSYM debug information file will be linked using a tool named dsymutil. dsymutil gets run after your executable is linked to parse the debug map in the main executable and produce a dSYM file with all of the debug information. Linking the debug information can add to your build times if you have a lot of code in your project. The DWARF debug information in all of the .o files is intelligently linked into the dSYM file. Any code that was dead stripped will have its debug information removed, and the dsymutil will unique types within the debug information, so the resulting DWARF is much smaller and more efficient. Use this setting when building your releases or if you have a build machine that is caching builds for others to download.

In order find the dSYM file for an executable, the UUID from the main executable is copied into the dSYM file. A previous comment suggested that the UUID changes with each build even if the same source code and compiler was used, but this is not true. The UUID is a MD5 checksum of the parts of the binary that do not change due to debug information. Debug information can contain paths and other data that change depending on what directory the sources exist in. If the UUID was simply a MD5 checksum of the entire binary, then the UUID would be different for the same sources built with the same compiler if one was built in /tmp/myproj vs /users/data/myproj. So the UUID built into Darwin binaries will match if the important bits (__TEXT, __DATA, etc) are the same even if the project is built in different directories. This allows the UUID to be used to unique dSYM files across multiple builds that produce the same binary. If SDK header files or different compilers or linkers are used, the UUID can easily differ.

There is Spotlight importer for dSYM files knows how to extract the UUID from the dSYM file to make it possible for debuggers and other tools like sample, Instruments, ReportCrash and more to find the dSYM file for a binary even if the dSYM file is not right next to the binary. You can see the UUID of your binary by running dwarfdump:

$ dwarfdump --uuid ~/a.out
UUID: E76A2647-AFB4-3950-943A-CB1D701B7C07 (x86_64) ~/a.out

Then you can use the Spotlight window in your system to search for the dSYM file. There is also a command line tool for spotlight called "mdfind" that can be used:

$ mdfind E76A2647-AFB4-3950-943A-CB1D701B7C07
/Users/admin/a.out.dSYM

So to sum up: use DWARF for edit/compile/debug cycles if you have large projects and want to avoid the time it takes to link a dSYM file during your daily workflow. Use DWARF with dSYM all the time if you have smaller projects, doing release builds, or need other Apple tools that are not debuggers to be able to parse your debug information. Both formats contain the same kind of information and can be used for debugging, but not all tools can load the DWARF format where the DWARF is left in the .o files.

like image 38
Greg Clayton Avatar answered Sep 22 '22 04:09

Greg Clayton