Как отлаживать javascript во встроенной версии 8?

#javascript #v8 #embedded-v8

#javascript #версия 8 #встроенный-v8

Вопрос:

Я пытаюсь узнать, как использовать объект Debug в версии 8 для отладки javascript во встроенном приложении javascript на c .

Я вызвал v8::Debug::SetDebugEventListener и установил обратный вызов. Затем я вызываю v8::Debug::GetDebugContext , чтобы получить контекст отладки, а затем запускаю что-то вроде: Debug.scripts()

Если я напечатаю результаты этого вызова из C , я получу:

  [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]
  

Что я на самом деле хочу сделать, так это установить точку останова для заданного номера строки в скрипте, но не могу заставить работать даже самые элементарные вещи.

Я получаю обратные вызовы к моему прослушивателю событий отладки, но данные входного параметра обратного вызова (не предоставленные пользователем) также не имеют для меня никакого смысла.

 {script_: {context_: {data_: undefined, handle_: 0, type_: "context"}, handle_: 1, script_: {}, type_: "script"}, type_: 4}
{break_id: 2, selected_frame: 0}
  

Спасибо.

Комментарии:

1. Одна вещь, которую я не знал, когда публиковал это, заключалась в том, что куча информации о v8::Script хранится в v8 ::UnboundScript, которую можно получить из скрипта с v8::Script::GetUnboundScript() помощью , даже если вы сначала явно не создали его с помощью v8::ScriptCompiler.

2. Вы когда-нибудь находили ответ?

3. @Qwertman Я задал себе ответ с тем, что я узнал. Отладка javascript в версии 8 кажется ОЧЕНЬ сложной и крайне плохо (даже для версии 8) документированной.

Ответ №1:

(Примечание: это может быть или не быть правильным способом делать что-то, но это работает для меня в некоторых простых случаях)

 v8::DebugEvent debug_event_type = event_details.GetEvent();
  

затем включите результаты:

 if (debug_event_type == v8::DebugEvent::Break) {
  

Вот переданные данные для попадания в довольно тривиальную точку останова:

  /* GetEventData() when a breakpoint is hit returns:
     * {
     *      break_points_hit_: [{active_: true, actual_location: {column: 4, line: 13, script_id: 55}, condition_: null,
     *      script_break_point_: {
     *          active_: true,
     *          break_points_: [],
     *          column_: undefined,
     *          condition_: undefined,
     *          groupId_: undefined,
     *          line_: 13,
     *          number_: 1, <== breakpoint number - v8-assigned
     *          position_alignment_: 0,
     *          script_id_: 55, <== script id passed in from v8::ScriptOrigin when compiled
     *          type_: 0
 *          },
 *          source_position_: 175}], frame_: {break_id_: 8, details_: {break_id_: 8, details_: [392424216, {}, function a(){
    println("Beginning of a()");
    let some_var = 5;
    some_var  = 5;
    b(some_var);
    println("End of a()");
}, {sourceColumnStart_: [undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, 4, undefined, undefined, undefined, undefined, undefined, undefined, undefined]}, 0, 1, 175, false, false, 0, "some_var", 5]}, index_: 0, type_: "frame"}}
  

shameless self promotion : Вы можете увидеть прогресс, которого я добился в отладке версии 8 в моей библиотеке упрощения интеграции v8 v8toolkit здесь: https://github.com/xaxxon/v8toolkit/blob/master/src/debugger.cpp