Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ios Symbolication Server side

Tags:

objective-c

How to symbolicate the ios crash report after uploading to server in a linux environment where iOS development tools and scripts will not be available. I know Apple uses atos and some other tools to map the hex addresses to symbol along with .dYSM file.

I can upload .dYSM file along with crash report to server. Refered QuincyKit, but they are doing symbolication locally. But other's like HockeyApp and Critterism are doing it remotely.

Pls recommend the possible ways to do it in server.

like image 339
RJR Avatar asked Feb 25 '13 15:02

RJR


2 Answers

It is possible. You can take a look at https://github.com/facebook/atosl

I got it working under Linux. (Ubuntu Server) However, it takes some time to get it up and running.


Installing atosl

First, you need to install libdwarf-dev, dwarfdump, binutils-dev and libiberty-dev.

E.g. on Ubuntu:

$ sudo apt-get install libdwarf-dev dwarfdump binutils-dev libiberty-dev

Download or clone the atosl repo from GitHub:

$ git clone https://github.com/facebook/atosl.git

CD to the atosl dir

$ cd atosl

Create a local config config.mk.local which contains a flag with the location of your binutil apps. (in Ubuntu by default that's /usr/bin). If you're not sure, you can find out by executing cat /var/lib/dpkg/info/binutils.list | less and copy the path of the file objdump. E.g. if the entry is /usr/bin/objdump, your path is /usr/bin.

So in the end, your config.mk.local should look like this:

LDFLAGS += -L/usr/bin

Compile it:

$ make

Now you can start using it:

$ ./atosl --help

Symbolicating example

To show how atosl is used, I'll provide a simple example.

Now let's take a look at a line from the crash log:

13  ErrorApp    0x000ea294 0xe3000 + 29332

To symbolicate this, we will need the load address, and the runtime address.

In this example the runtime address is 0x000ea294, and the load address is 0xe3000.

Now we have everything we need:

$ ./atosl -o [YOUR_dSYM_FILE] -l [LOAD_ADDRESS] [RUNTIME_ADDRESS]

In this example:

$ ./atosl -o ErrorApp.app.dSYM/Contents/Resources/DWARF/ErrorApp -l 0xe3000 0x000ea294

Which returns the symbolicated line:

main (in ErrorApp) (main.m:16)

FYI

Your vmaddr, which usually is 0x00001000, you can find by looking at the segname __TEXT Mach-O load command of your binary. In my example, this happens to be different, namely 0x00004000

To find the address, we need to do some math.

The address is found by the following formula:

address = vmaddr + ( runtime_address - load_address ) 

In this example our address is:

0x00004000 + ( 0x000ea294 - 0xe3000 ) = 0xB294

I haven't played around with this that much yet, but for now it seems to give me the results I needed. Maybe it will work for you too.

like image 64
Gianni Avatar answered Nov 08 '22 19:11

Gianni


You need to implement your own linux compatible versions of atos, otool and dwarfdump (at least the functionality needed for symbolication). The Apple tools are not open source and only run on Mac OS X.

None of the services provide a solution that can be used by 3rd parties on non OS X systems. So your only chance, besides implementing the required functionality to run on your linux system, is to do it on a Mac like QuincyKit does it, see https://github.com/TheRealKerni/QuincyKit/wiki/Remote-symbolication or use a third party service.

Note: I am the creator of QuincyKit and Co-Founder of HockeyApp.

like image 44
Kerni Avatar answered Nov 08 '22 17:11

Kerni