2010-02-09 9 views

Respuesta

5

Sí. Cree LLVM en modo no liberado (el valor predeterminado). Lleva un poco más de tiempo que una versión de lanzamiento, pero puede usar gdb para depurar el archivo de objeto resultante.

Una nota de precaución: tuve que actualizar mi caja de Linux a 3 GB de memoria para hacer que el tiempo de enlace del modo de depuración LLVM sea razonable.

+0

¿Pero puedo depurar un pase de ILVM? Los pases LLVM generalmente se ejecutan usando opt, por lo que no sé cómo usar gdb para ejecutarlo. ¿Puedes decirme el comando? –

+0

Puede ejecutar, p. "gdb/usr/local/bin/opt" y escriba "ejecutar ". –

+1

http://llvm.org/docs/WritingAnLLVMPass.html#debughints – name

0

Siguiendo Richard Penningtons consejos + añadir acentos abiertos funciona para mí:

gdb /usr/local/bin/opt 

continuación, escriba

run `opt -load=/pathTo/LLVMHello.so -hello </pathTo/your.bc> /dev/null` 

Nota: (Rep. Faltante) me hubiera comentado, pero no pudieron

2

Primero asegúrese de que LLVM esté compilado con las opciones de depuración habilitadas, que es básicamente la configuración predeterminada. Si no compiló LLVM con opciones no predeterminadas, entonces su compilación actual debería estar bien.

Todas las pasadas LLVM se ejecutan utilizando la herramienta opt (optimizador) de LLVM. Los pases se compilan en archivos de objeto compartido, es decir, archivo LLVMHello.so en build/lib y luego se cargan en la herramienta opt. Para depurar o atravesar el pase, debemos detener LLVM antes de que comience a ejecutar el archivo .so porque no hay forma de poner un punto de corte en un archivo de objeto compartido. En cambio, podemos poner un corte en el código antes de invoca el pase.

Vamos a poner un punto de interrupción en llvm/lib/IR/Pass.cpp

Así es como se hace:

  1. Desplazarse construir/bin y terminal abierto y escriba gdb opt. Si compiló llvm con los símbolos de depuración agregados, entonces gdb tardará algún tiempo en cargar los símbolos de depuración, de lo contrario, gdb dirá loading debugging symbols ... (no debugging symbols found).

  2. Ahora tenemos que establecer un punto de inflexión en el método void Pass::preparePassManager(PMStack &) en Pass.cpp. Este es probablemente el primer (o uno de los primeros) métodos involucrados en cargar el pase. Puede hacerlo escribiendo break llvm::Pass::preparePassManager en la terminal.

  3. Ejecutando el pase. Tengo un archivo de código binario llamado trial.bc y el mismo pase LLVMHello.so así que corro con

    run -load ~/llvm/build/lib/LLVMHello.so -hello < ~/llvmexamples/trial.bc > /dev/null 
    

    GDB ahora no se detendrá ante Pass::preparePassManager ya partir de aquí podemos utilizar paso y junto a trazar la ejecución.

+0

Hola, creo que no agregué símbolos de depuración al compilar LLVM. ¿Todavía puedo usar gdb para la depuración? ¿Eso tendrá alguna limitación en la depuración? – algoProg

+0

No debería haber ningún problema. –

Cuestiones relacionadas