matrix
matrix copied to clipboard
iOS线程堆栈为何没有symbol_addr?
异常类型:app 运行时异常
手机型号:iphone12或模拟器iPhone14
手机系统版本:iOS 16.3
matrix版本:master分支
问题描述:如:运行demo iOS工程,无论是Lay还是NSException crash,在日志文件中查看threads堆栈信息,都没有symbol_addr字段,如下:
`"threads": [
{
"backtrace": {
"contents": [
{
"instruction_addr": 4462201019
},
{
"instruction_addr": 4445719459
},
{
"instruction_addr": 4462200745
},
{
"instruction_addr": 4439224548
},
{
"instruction_addr": 4438637834
},
{
"instruction_addr": 4702104837
},
{
"instruction_addr": 4693068916
},
{
"instruction_addr": 4693069944
},
{
"instruction_addr": 4693053955
},
{
"instruction_addr": 4693063887
},
{
"instruction_addr": 4702387861
},
{
"instruction_addr": 4702396145
},
{
"instruction_addr": 4702214130
},
{
"instruction_addr": 4702899809
},
{
"instruction_addr": 4702909801
},
{
"instruction_addr": 4702869665
},
{
"instruction_addr": 4461543477
},
{
"instruction_addr": 4461543284
},
{
"instruction_addr": 4461541233
},
{
"instruction_addr": 4461518451
},
{
"instruction_addr": 4461516535
},
{
"instruction_addr": 4600836746
},
{
"instruction_addr": 4702078507
},
{
"instruction_addr": 4702098759
},
{
"instruction_addr": 4438655242
},
{
"instruction_addr": 4442944191
},
{
"instruction_addr": 4686164752
}
],
"skipped": 0
},
"index": 0,
"crashed": true,
"current_thread": true,
"notable_addresses": {}
}
]`
调试发现,writeBacktrace的时候总是走到下面代码块的的if分支中:
`bool kssymbolicator_symbolicate(KSStackCursor *cursor) {
Dl_info symbolsBuffer;
if (ksdl_dladdr_use_cache(CALL_INSTRUCTION_FROM_RETURN_ADDRESS(cursor->stackEntry.address), &symbolsBuffer)) {
cursor->stackEntry.imageAddress = (uintptr_t)symbolsBuffer.dli_fbase;
cursor->stackEntry.imageName = symbolsBuffer.dli_fname;
cursor->stackEntry.symbolAddress = (uintptr_t)symbolsBuffer.dli_saddr;
cursor->stackEntry.symbolName = symbolsBuffer.dli_sname;
return true;
}
cursor->stackEntry.imageAddress = 0;
cursor->stackEntry.imageName = 0;
cursor->stackEntry.symbolAddress = 0;
cursor->stackEntry.symbolName = 0;
return false;
}`
请问,这是什么原因?在分析KSCrashMonitor_NSException的KSStackCursor生成的地方也没有发现明显异常。
1、修改 s_enableLocalSymbolicate 为 true,可以显示symbolName名称。 2、然后在KSCrashReport.c 第775行修改为以下代码:
writer->beginObject(writer, NULL);
{
if (stackCursor->symbolicate(stackCursor)) {
if (stackCursor->stackEntry.imageName != NULL) {
writer->addStringElement(writer, KSCrashField_ObjectName, ksfu_lastPathEntry(stackCursor->stackEntry.imageName));
}
writer->addUIntegerElement(writer, KSCrashField_ObjectAddr, stackCursor->stackEntry.imageAddress);
if (stackCursor->stackEntry.symbolName != NULL) {
writer->addStringElement(writer, KSCrashField_SymbolName, stackCursor->stackEntry.symbolName);
}
writer->addUIntegerElement(writer, KSCrashField_SymbolAddr, stackCursor->stackEntry.symbolAddress);
}
writer->addUIntegerElement(writer, KSCrashField_InstructionAddr, stackCursor->stackEntry.address);
if (isRepeatCount) {
writer->addIntegerElement(writer, KSCrashField_RepeatCount, *(stackRepeatCountArray + g_tailPoint - 1));
}
}
writer->endContainer(writer);
}