simbolos simbolo script para kali especiales escribir consola como caracteres caracter linux performance perf

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:

  1. Compile mis fuentes de C ++ con -g (bastante obvio, necesita símbolos de depuración)
  2. Ejecutar perf as

    record -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 usa gcc 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.

  3. Una vez que el archivo perf.data se haya generado sin ningún error en el paso anterior, puede ejecutar el perf report etc. Personalmente, me gustan las herramientas FlameGraph para generar visualizaciones SVG.
  4. 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 .