2012-06-20 20 views
6

He estado teniendo problemas recientemente tratando de simbolizar un registro de bloqueo de una aplicación de iOS. Por algún motivo, el UUID del dSYM no se indexó en Spotlight. Después de una búsqueda manual y una buena dosis de encantamientos de línea de comando, logré simbolizar parcialmente el registro de bloqueo.¿Es posible simbolizar el código C++?

Al principio pensé que el dSYM podría estar incompleto o algo así, pero luego me di cuenta de que las llamadas al método faltantes estaban ocurriendo en el código C++: este proyecto es una aplicación Objective-C que llama a bibliotecas C++ (Objective-C++) que llama de nuevo al código Objective-C (nuevamente, a través del código Objective-C++). Las llamadas que me faltan son, específicamente, las que ocurren en C++.

Entonces, mi pregunta es: ¿hay alguna forma en que el proceso de simbolización pueda resolver las llamadas a funciones del código C++? ¿Qué opciones especiales debo establecer, si hay alguna?

+0

¿Simplemente deja las direcciones o le da algo como _ZN7 ...? – C0deH4cker

+0

no, no son funciones de nombre mutilado si se refiere a eso. Es una dirección base y un desplazamiento: 14 MiApl \t 0x001001bc 0xfe000 + 8636 15 MiApl \t 0x00100174 0xfe000 + 8564 –

+0

si 'lldb' su aplicación, se puede desmontar cualquiera de los métodos por nombre de C++? ¿Tiene un binario de biblioteca estática o está compilando todo en su proyecto? – nielsbot

Respuesta

0

Un programa útil que viene con la manzana SDK es atos (dirección al símbolo). Básicamente, esto es lo que quiere hacer:

atos -o myExecutable -arch armv7 0x(address here) 

Debe imprimir el nombre del símbolo en esa dirección.

+0

Eso funciona para ObjC. Para C++, obtengo algo como: 0x00261588 (en MyApp) + 465932 –

+0

Espera, hay una forma de hacerlo con gdb ... – C0deH4cker

+0

gracias, pero estoy usando LLVM aunque –

0

No soy muy versado en Objective-C, pero me aseguraría de que el código C++ se esté compilando con símbolos. En particular, ¿se aseguró de incluir -dinámica y/o -g al compilar el código C++?

+0

Esos parecen banderas para gcc. ¿Sabes cómo lograr lo mismo en LLVM? –

+1

Apple usa LLVM como back-end para gcc y clang. clang básicamente toma los mismos indicadores que gcc. Asegúrese de que todo su código esté compilado con el nivel de depuración convertido en 3. Use '-g3'. Es posible que también desee deshabilitar la optimización ('-O0'). – sfstewman

+0

@sfstewman el nivel de optimización no tiene nada que ver -AFAIK- con la simbolización después de un bloqueo, que sería más bien de extracción. No hay '-g3' en clang, solo' -g' –

0

tratar

dwarfdump --lookup = 0xYOUR_ADRESS YOUR_DSYM_FILE

tendrá que buscar cada dirección manualmente (o escribir un script para hacer esto), pero si los símbolos están bien (su archivo dSym es más grande que digamos 20 MB) esto hará el trabajo.

Cuestiones relacionadas