Отладка встроенных функций с 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).