Callcluster

Tool for callgraph extraction, analysis and visualization

Extracción del callgraph de programas C

Requisitos

callcluster-clang requiere tener instalado el paquete libclang-10-dev para poder ejecutarse, busca la librería en /usr/lib/llvm-10/lib/libclang-10.so tal como detallado en el archivo CMakeLists.txt. Para obtener esta librería debe instalarse clang 10 como descripto en https://apt.llvm.org/.

Compilación

  1. Clonar el repositorio de código fuente de callcluster-clang
git clone https://github.com/callcluster/callcluster-clang
  1. Compilar callcluster-clang
cd callcluster-clang
mkdir build
cd build
cmake ..
cmake --build .
chmod a+x callclusterClang

Extracción del callgraph

callclusterClang necesita, además de acceso al código fuente, una compilation database, que es una enumeración de las invocaciones al compilador de C y al linker. La compilation databse, por convención es un archivo denominado compile_commands.json. Existe un parámetro de línea de comando de cmake que permite generar compile_commands.json al compilar el proyecto cuyo callgraph se desea extraer. Si el proyecto analizado no utiliza cmake, puede usarse Bear, que funciona con cualquier toolchain. El archivo compile_commands.json utiliza rutas relativas para identificar los archivos de código fuente, con lo cual no se debe cambiar su ubicación.

En el caso de utilizar bear, debe tenerse en cuenta que Bear tiene que capturar todas las invocaciones al compilador, con lo cual suele ser necesario ejecutar make clean antes de ejecutar bear make.

Una vez obtenido compile_commands.json, puede ejecutarse el binario callclusterClang de la siguiente manera:

./callclusterClang <directorio donde se encuentra compile_commands.json> --progress

Una vez que se termina de ejecutar callclusterClang, se escribe un archivo denominado analysis.json en la carpeta donde se ejecutó el comando (es decir, en el current working directory, no en el directorio de compile_commands.json).

Opciones recibidas por callclusterClang

./callclusterClang [CARPETA] [--progress]
  • La CARPETA es obligatoria, y debe tener un archivo llamado compile_commands.json
  • La opción --progress es opcional, e indica si se desea que el programa escriba a la consola información sobre el avance. Esta opción es importante para proyectos con muchos archivos de código fuente.

Ejemplo (php)

Asumiendo ubuntu, según README.md:

git clone https://github.com/php/php-src
cd php-src
sudo apt install -y pkg-config build-essential autoconf bison re2c libxml2-dev libsqlite3-dev
./buildconf
./configure
bear make

En el directorio donde se encuentra callclusterClang:

./callclusterClang <ubicación de la carpeta php-src> --progress

Ejemplo (redis)

git clone https://github.com/redis/redis
cd redis
bear make

En el directorio donde se encuentra callclusterClang:

./callclusterClang <ubicación de la carpeta redis> --progress