matrix icon indicating copy to clipboard operation
matrix copied to clipboard

iOS线程堆栈为何没有symbol_addr?

Open fantexi023 opened this issue 1 year ago • 1 comments

异常类型: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生成的地方也没有发现明显异常。

fantexi023 avatar Apr 07 '23 06:04 fantexi023

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);
        }

vail2017 avatar Mar 27 '24 06:03 vail2017