Saltar al contenido principal

Depuración de funciones incorporadas con GDB

A partir de V8 v6.9, es posible crear puntos de interrupción en GDB (y posiblemente en otros depuradores) para depurar funciones incorporadas de CSA / ASM / Torque.

(gdb) tb i::Isolate::Init
Punto de interrupción temporal 1 en 0x7ffff706742b: i::Isolate::Init. (2 ubicaciones)
(gdb) r
Hilo 1 "d8" alcanzó el punto de interrupción temporal 1, 0x00007ffff7c55bc0 en Isolate::Init
(gdb) br Builtins_RegExpPrototypeExec
Punto de interrupción 2 en 0x7ffff7ac8784
(gdb) c
Hilo 1 "d8" alcanzó el punto de interrupción 2, 0x00007ffff7ac8784 en Builtins_RegExpPrototypeExec ()

Tenga en cuenta que funciona bien utilizar un punto de interrupción temporal (atajo tb en GDB) en lugar de un punto de interrupción normal (br) para esto, ya que solo lo necesita al inicio del proceso.

Las funciones incorporadas también son visibles en los rastreos de pila:

(gdb) bt
#0 0x00007ffff7ac8784 en Builtins_RegExpPrototypeExec ()
#1 0x00007ffff78f5066 en Builtins_ArgumentsAdaptorTrampoline ()
#2 0x000039751d2825b1 en ?? ()
#3 0x000037ef23a0fa59 en ?? ()
#4 0x0000000000000000 en ?? ()

Advertencias:

  • Solo funciona con funciones incorporadas integradas.

  • Los puntos de interrupción solo se pueden establecer al inicio de la función incorporada.

  • El punto de interrupción inicial en Isolate::Init es necesario antes de establecer el punto de interrupción de la función incorporada, ya que GDB modifica el binario y verificamos un hash de la sección de funciones incorporadas en el binario al inicio. De lo contrario, V8 se queja de una discrepancia en el hash:

    # Error fatal en ../../src/isolate.cc, línea 117
    # La verificación falló: d.Hash() == d.CreateHash() (11095509419988753467 frente a 3539781814546519144).