Endereços base (contadores de programas) de símbolos (métodos e funções) não correspondem. Por 1

Eu tenho algum código no meu aplicativo que me envia o rastreamento de pilha de exceções não identificadas.

"0   CoreFoundation   0x3ad073ff <redacted> + 186",
"1   libobjc.A.dylib  0x39412963 objc_exception_throw + 30",
"2   CoreFoundation   0x3ad0729d <redacted> + 0",
"3   Foundation       0x39f3b7b3 <redacted> + 90",
"4   UIKit            0x34a3ae29 <redacted> + 4184",
"5   MyApp            0x0001feab -[MAMyClassA firstMethod:withParameter1:andParameter2:] + 374",
"6   MyApp            0x000f76b5 -[MAMyClassB secondMethod:withParameter1:andParameter2:] + 164",
"7   UIKit            0x34bd0fe1 <redacted> + 84",
"8   UIKit            0x34af2047 <redacted> + 70",
"9   UIKit            0x34af1ffb <redacted> + 30",
"10  UIKit            0x34af1fd5 <redacted> + 44",
...

Como você pode ver, a maioria dos métodos da Apple é substituída por<redacted>. Eu consegui extrair os símbolos e seus correspondentes endereços base das bibliotecas da Apple usandonm, mas os endereços não correspondem. Eles estão fora por 1.

Eu calculei o endereço como explicado aqui:Relatórios de falhas do iOS: atos fortes não funcionam como esperado.

Symbol address = (base address of framework) - (base address of symbol from crash report) + (virtual memory slide [vmaddr]).

Por exemplo, estou recebendo 0xC2345, mas o endereço do símbolo real retornado pornm é 0xC2344. Eu sei que este é o símbolo certo. Eu tentei isso com diferentes endereços em diferentes estruturas (UIKit, Foundation, CoreFoundation, etc.) em diferentes relatórios de falhas e o resultado é o mesmo: o valor é sempre desligado por 1. Eu tenho que subtrair 1 do que eu recebo no relatório de falha para obter o endereço "correto" fornecido pelanm.

Enquanto digito esta pergunta, encontrei isto:Endereço de implementação do método errado do otool para armv7?.

Isso significa que toda vez que eu tenho um endereço para procurar, eu tenho que executar a seguinte lógica?

if ((symbol address) mod 2 == 1) {
  // This is a thumb instruction so it may be 2 or four bytes
  Subtract 1 from the symbol address and then use it to lookup the symbol.
}
else {
  // This is a standard 4-byte ARM instruction.
  Perform symbol lookup with the address as is.
}

Agradecemos antecipadamente por qualquer ajuda ou direção.

questionAnswers(1)

yourAnswerToTheQuestion