Отладка кода CodeStubAssembler (CSA) в V8 - PullRequest
0 голосов
/ 02 июля 2019

В настоящее время я пытаюсь отладить некоторые CodeStubAssembler встроенные функции в V8.

Если я правильно понял, CSA - это просто модный код C ++, который эффективно генерирует инструкции по сборке для разных платформ.

Однако даже в отладочной сборке я не могу установить точки останова с gdb для любого кода в файлах builtins/*-gen.cc.Ни путем установки точки останова в строке файла и источника, ни путем попытки разбить имена функций.Единственное, что работает, чтобы получить разборку, запустив objdump -D в объектном файле.Но я хотел бы видеть это во время работы.

Можно ли как-то установить точки останова на встроенных функциях, генерируемых CSA?

1 Ответ

1 голос
/ 02 июля 2019

V8 разработчик здесь. CSA генерирует код сборки, действительно. Это происходит, когда двоичный файл mksnapshot запускается как часть процесса сборки V8. Сам код CSA не содержится в конечном двоичном файле (d8 или libv8.so), только его вывод. Поэтому время выполнения кода CSA полностью отличается от времени запуска сгенерированных встроенных функций.

Результат таков:

  • Вы можете установить точку останова в коде CSA, как и в любом другом коде C ++, - если вы запускаете двоичный файл mksnapshot в своем отладчике (или если вы компилируете V8 без снимка, но это (1) очень медленно запуск и (2) не рекомендуется). Затем вы можете пройти по коду CSA, поскольку он генерирует ИК-график Turbofan, который серверная часть Turbofan затем преобразует в машинный код.

  • Вы можете установить точку останова в сгенерированных CSA встроенных командах, вставив команду DebugBreak() в код CSA и перекомпилировав. Затем вы можете выполнить сгенерированные инструкции. Обратите внимание, что исходный код (C ++ или другой) не будет доступен, вам придется использовать «layout asm» в GDB.

  • Если вы хотите использовать средства GDB для установки точки останова во встроенной CSA-системе, вам нужно как-то получить ее адрес (это возможно, но громоздко, сделать это с помощью isolate-> builtins) и затем установите точку останова на необработанном адресе, по которому вы хотите разорвать.

  • Иногда «отладка printf» более удобна. Для этого есть CodeStubAssembler::Print(...). (Обратите внимание, что простой printf в CSA будет выполняться во время mksnapshot и не будет влиять на сгенерированную встроенную функцию; тогда как CSA::Print передает код в сгенерированную встроенную функцию, которая будет запускать stdout-print во время выполнения. Это, вероятно, самый иллюстративный способ чтобы продемонстрировать эффекты, которые я пытался описать выше.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...