#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