Pergunta

I have a problem in understanding some things about these two crash reports that I get from Apple:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x617401fa
Crashed Thread:  0
0   app                     0x0017c0ca Json::parse(int, JSON_value_struct const*) + 378
1   app                     0x0017bf46 Json::parse(void*, int, JSON_value_struct const*) + 2
2   app                     0x001302d2 JSON_parser_char + 2070
3   app                     0x0017bb58 Json::parse(std::string const&) + 356
4   app                     0x0008e682 NotificationData::ProcessNotifications(std::vector<UserEvent, std::allocator<UserEvent> >&) + 1062
5   app                     0x00106aea SMS::CheckNotifications() + 106
6   app                     0x001073dc SMS::update(Rex::TimeData const&) + 936
7   app                     0x00192c7e SceneManager::updateTick(TimeData const&) + 314
8   app                     0x001685ae Core::onRender(TimeData const&) + 522

and

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0xffff0202
Crashed Thread:  0
0   app                     0x0017c0ca 0x1000 + 1552586
1   app                     0x0017bf46 0x1000 + 1552198
2   app                     0x001302d2 0x1000 + 1241810
3   app                     0x0017bb58 0x1000 + 1551192
4   app                     0x0008e682 0x1000 + 579202
5   app                     0x00106aea 0x1000 + 1071850
6   app                     0x001073dc 0x1000 + 1074140
7   app                     0x00192c7e 0x1000 + 1645694
8   app                     0x001685ae 0x1000 + 1471918

Some facts first: the first is said to occur 40% of the time and the second time 35%. If this is true it's quite a good thing for me.

My reasoning based upon what I read about this stuff is that they are one and the same because the memory adresses of the functions are exactly the same, just the KERN_INVALID_ADDRESS at 0x617401fa and KERN_INVALID_ADDRESS at 0xffff0202 differ, which would be expected because the function was writting some corrupt file on disk

My first question is why do the crash reports sometime come symbolicated (or partially symbolicated) and other times not? (I just got into analyzing them and our build system wasn't saving the dSYM files generated for each build so I can't do much thing about symbolicating the second one)

The second one is how is it possible for a crash report to come symbolicated from the user? As I looked into the project , the settings for the released build are like this: the GCC_GENERATE_DEBUGGING_SYMBOLS is set to NO for ALL_BUILDS and and the target application level debug_information is set to dwarf with dSYM file and generate debug symbols is set to No. ( Side question: When it is built with these settings there is no dSYM generate but if I magically set the GCC_GENERATE_DEBUGGING_SYMBOLS to true from cMake(...) the dSYM is generated. As I read target level settings override build level settings)

Sorry for the long post, it's my first one.

Foi útil?

Solução

Regarding the facts: it is 40% of the crashes that iTunes gets! That is by far not all crashes your app has. iTunes Connect only shows crashes from devices, where the user did approve sending anonymous usage data when setting up the device (since iOS 5 can be changed deep in the settings app later on). And only a fraction of users enable that, since they don't want to be tracked. On systems pre iOS5 crash reports are also only send once the device gets synced with iTunes.

So in a nutshell: Crash Reports on iTunes Connect do not give you a real view on crash reports. Here an example blog post about this fact from the Camera+ developers: http://taptaptap.com/blog/cameraplus-2-3-1-available-attack-of-the-crashinator/

Those two crash reports are identical, you are correct.

Question 1: All crash reports on the device are send to Apple not symbolicated. The symbolication happens on Apple's servers. And since they still get a damn lot of crash reports (even though only a fraction of what really happens) they only symbolicate 1 report per group to reduce load on their servers.

The symbolication of the second one would show the same result as the first one, since the memory addresses are identical.

Question 2: Apple uses the symbols from the app binary if they are not stripped from it. They don't use the dSYM nor do they have or want it. Disadvantage of this way: you don't get line numbers and the binary executable is 30-50% larger. The relevant build setting is COPY_PHASE_STRIP. I assume that is set to NO in your case.

Regarding settings level: select the project in Xcode, then the target, View the build settings not as Combined but as Levels. The value on the far left (Resolved column) is the one being used. If you are using build settings in .xcconfig files, they are usually set per build configuration on project level, target overwrites these if set differently.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top