script - simbolo en consola linux
¿Cómo puedo obtener perf para encontrar símbolos en mi programa? (8)
Cuando uso el perf report
, no veo ningún símbolo para mi programa, en cambio obtengo una salida como esta:
$ perf record /path/to/racket ints.rkt 10000
$ perf report --stdio
# Overhead Command Shared Object Symbol
# ........ ........ ................. ......
#
70.06% ints.rkt [unknown] [.] 0x5f99b8
26.28% ints.rkt [kernel.kallsyms] [k] 0xffffffff8103d0ca
3.66% ints.rkt perf-32046.map [.] 0x7f1d9be46650
Que es bastante poco informativo.
El programa relevante está construido con símbolos de depuración, y la herramienta sysprof
muestra los símbolos apropiados, al igual que Zoom, que creo que está usando perf
bajo el capó.
Tenga en cuenta que esto está en x86-64, por lo que el binario se compila con -fomit-frame-pointer
, pero ese es el caso cuando se ejecuta bajo otras herramientas también.
¿Qué hay de su máquina de host dev? ¿También está ejecutando el sistema operativo x86_64? Si no es así, asegúrese de que el perf esté compilado de forma cruzada, ya que el perf depende del objeto y otras herramientas de Toolchain.
Asegúrese de compilar el programa con la opción -g junto con gcc (cc) para que la información de depuración se produzca en el formato nativo del sistema operativo. Intente hacer lo siguiente y verifique si hay símbolos de depuración presentes en la tabla de símbolos.
$objdump -t your-elf
$readelf -a your-elf
$nm -a your-elf
En mi caso, la solución fue eliminar los archivos elf que contenían símbolos almacenados en caché de compilaciones anteriores y estaban arruinando las cosas.
Están en la carpeta ~ / .debug /
Esta publicación ya tiene más de un año, pero como surgió en la parte superior de mis resultados de búsqueda de Google cuando tuve el mismo problema, pensé que lo respondería aquí. Después de buscar más alrededor, encontré que la respuesta dada en esta pregunta relacionada de fue muy útil. En mi sistema Ubuntu Raring, terminé haciendo lo siguiente:
- Compile mis fuentes de C ++ con
-g
(bastante obvio, necesita símbolos de depuración) Ejecutar
perf
asrecord -g dwarf -F 97 /path/to/my/program
De esta manera,
perf
puede manejar el formato de depuración DWARF 2 , que es el formato estándar que usagcc
en Linux. El parámetro-F 97
reduce la frecuencia de muestreo a 97 Hz. La tasa de muestreo predeterminada fue aparentemente demasiado grande para mi sistema y dio como resultado mensajes como este:Warning: Processed 172390 events and lost 126 chunks! Check IO/CPU overload!
y luego la llamada de
perf report
fallaría con una falla de segmentación. Con la reducida tasa de muestreo todo funcionó bien.- Una vez que el archivo
perf.data
se haya generado sin ningún error en el paso anterior, puede ejecutar elperf report
etc. Personalmente, me gustan las herramientas FlameGraph para generar visualizaciones SVG. Otras personas informaron que correr
echo 0 > /proc/sys/kernel/kptr_restrict
como root puede ayudar también, si se requieren símbolos del núcleo.
Siempre puedes usar el comando ''$ nm''.
Aquí hay un ejemplo de salida:
Ethans-MacBook-Pro:~ phyrrus9$ nm a.out
0000000100000000 T __mh_execute_header
0000000100000f30 T _main
U _printf
0000000100000f00 T _sigint
U _signal
U dyld_stub_binder
También tuve este problema, no pude ver ningún símbolo de espacio de usuario, pero vi algunos símbolos de kernel. Pensé que esto era un problema de carga de símbolos. Después de probar todas las soluciones posibles que pude encontrar, todavía no pude hacer que funcionara.
Entonces recuerdo que
ulimit -u ilimitado
es necesario Lo intenté y mágicamente funcionó.
Encontré en este wiki que este comando es necesario cuando usas demasiados descriptores de archivos.
https://perf.wiki.kernel.org/index.php/Tutorial#Troubleshooting_and_Tips
mi orden final fue
registro perf -F 999 -g ./my_program
no necesitaba --call-graph
puede verificar el valor de kptr_restrict por cat /proc/kallsyms
. Si las direcciones de los símbolos en el resultado son todas de 0x000000, puede corregirlo con el comando echo 0 > sys/kernel/kptr_restrict
. Después de esto, puede obtener un resultado deseado del perf report
prctl(PR_SET_NAME)
el mismo problema con perf después de anular el nombre de mi programa a través de prctl(PR_SET_NAME)
Como puedo ver tu caso es bastante similar:
70.06% ints.rkt [desconocido]
El comando que ha ejecutado ( raqueta ) es diferente del que ha visto el perf .