Перейти к основному содержимому

Отладка встроенных функций с GDB

Начиная с V8 версии 6.9, возможно создавать точки останова в GDB (и, возможно, в других отладчиках) для отладки CSA / ASM / Torque встроенных функций.

(gdb) tb i::Isolate::Init
Временная точка останова 1 на 0x7ffff706742b: i::Isolate::Init. (2 местоположения)
(gdb) r
Поток 1 "d8" достиг временной точки останова 1, 0x00007ffff7c55bc0 в Isolate::Init
(gdb) br Builtins_RegExpPrototypeExec
Точка останова 2 на 0x7ffff7ac8784
(gdb) c
Поток 1 "d8" достиг точки останова 2, 0x00007ffff7ac8784 в Builtins_RegExpPrototypeExec ()

Обратите внимание, что для этой цели удобнее использовать временную точку останова (сокращение tb в GDB), а не обычную (br), так как она нужна только при запуске процесса.

Встроенные функции также видны в трассировках стека:

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

Предостережения:

  • Работает только с встроенными функциями с внедрением.

  • Точки останова можно устанавливать только в начале встроенной функции.

  • Первая точка останова в Isolate::Init необходима перед установкой точки останова встроенной функции, так как GDB вносит изменения в бинарный файл, а мы проверяем хэш секции встроенных функций в бинарном файле при запуске. В противном случае V8 сообщит об ошибке несоответствия хэша:

    # Фатальная ошибка в ../../src/isolate.cc, строка 117
    # Проверка не удалась: d.Hash() == d.CreateHash() (11095509419988753467 против 3539781814546519144).