Отладка исходных файлов с помощью расширения chrome
Я пытаюсь управлять отладчиком с помощью расширения Chrome.
Я использую devtools-протокол и расширение chrome документация, но я понятия не имею, как их реализовать, поскольку я не видел никаких образцов используемых методов. Я использовал расширение образца из здесь, который показывает, как приостановить и возобновить только отладчик, но это абсолютно бесполезно для меня. Я попытался реализовать некоторые методы в образце, но ничего происходит.
function onDebuggerEnabled(debuggeeId) {
chrome.debugger.sendCommand(debuggeeId, "Debugger.setBreakpointByUrl", {
lineNumber: 45825,
url: 'full https link to the js file from source tab'
});
}
проблема в том, что файл js, который я пытаюсь отладить, загружается с веб-сайта внутри вкладки "источники", и он огромен, мы говорим о 150k+ строках после его форматирования, и для загрузки требуется некоторое время.
теперь кто-нибудь может сказать мне, как просто добавить точку останова внутри файла js из источников (используя расширение CHROME), чтобы он мог быть запущен при действии, которое затем остановит отладчик, чтобы я мог изменить значения и т. д.?
5 ответов
возможно, вы размещаете неправильное местоположение точки останова (отформатированный источник), попробуйте работать с исходным кодом и добавьте columnNumber: integer
и вот рабочая версия JavaScript pause/resume -> background.js
:
- установить это расширение
- открыть https://ewwink.github.io/demo/Debugger.setBreakpointByUrl.html
- отладчик нажмите кнопку паузы
- нажмите кнопку " отладка меня!"
- он ударит точку останова на https://ewwink.github.io/demo/script.js в строке 10
- нажмите кнопку "Продолжить отладчик", вы увидите переменную сообщения " захвачен..."
код:
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// mod by ewwink
var attachedTabs = {};
var version = "1.1";
chrome.debugger.onEvent.addListener(onEvent);
chrome.debugger.onDetach.addListener(onDetach);
chrome.browserAction.onClicked.addListener(function(tab) {
var tabId = tab.id;
var debuggeeId = {
tabId: tabId
};
if (attachedTabs[tabId] == "pausing")
return;
if (!attachedTabs[tabId])
chrome.debugger.attach(debuggeeId, version, onAttach.bind(null, debuggeeId));
else if (attachedTabs[tabId])
chrome.debugger.detach(debuggeeId, onDetach.bind(null, debuggeeId));
});
function onAttach(debuggeeId) {
if (chrome.runtime.lastError) {
alert(chrome.runtime.lastError.message);
return;
}
var tabId = debuggeeId.tabId;
chrome.browserAction.setIcon({
tabId: tabId,
path: "debuggerPausing.png"
});
chrome.browserAction.setTitle({
tabId: tabId,
title: "Pausing JavaScript"
});
attachedTabs[tabId] = "pausing";
chrome.debugger.sendCommand(
debuggeeId, "Debugger.enable", {},
onDebuggerEnabled.bind(null, debuggeeId));
}
function onDebuggerEnabled(debuggeeId) {
chrome.debugger.sendCommand(debuggeeId, "Debugger.setBreakpointByUrl", {
lineNumber: 10,
url: 'https://ewwink.github.io/demo/script.js'
});
}
function onEvent(debuggeeId, method, params) {
var tabId = debuggeeId.tabId;
if (method == "Debugger.paused") {
attachedTabs[tabId] = "paused";
var frameId = params.callFrames[0].callFrameId;
chrome.browserAction.setIcon({
tabId: tabId,
path: "debuggerContinue.png"
});
chrome.browserAction.setTitle({
tabId: tabId,
title: "Resume JavaScript"
});
chrome.debugger.sendCommand(debuggeeId, "Debugger.setVariableValue", {
scopeNumber: 0,
variableName: "changeMe",
newValue: {
value: 'hijacked by Extension'
},
callFrameId: frameId
});
}
}
function onDetach(debuggeeId) {
var tabId = debuggeeId.tabId;
delete attachedTabs[tabId];
chrome.browserAction.setIcon({
tabId: tabId,
path: "debuggerPause.png"
});
chrome.browserAction.setTitle({
tabId: tabId,
title: "Pause JavaScript"
});
}
демо
EDIT: просто увидел ваш комментарий об этом для пользовательского расширения, которое вы пишете. Мой ответ не поможет вам (извините!), но это может помочь людям, которые приходят сюда в поисках пути установления нормального останова в Chrome.
может быть, вы уже сделали, но... Вы пробовали просто щелкнуть номер строки строки, в которой вы хотите установить точку останова?
такой:
вы даже можете включить или отключить точки останова в несколько разных звонков по одной линии.
при загрузке страницы откройте Dev Tools с помощью F12, затем перейдите к файлу JS на панели "источники" и добавьте нужные точки останова. Затем обновите страницу, чтобы загрузить ее снова-Chrome запомнит, где вы установили точки останова, и остановится на них.
Если вы можете изменить исходный код файла, который вы хотите отладить, я бы посмотрел, используйте оператор debugger.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/debugger
function potentiallyBuggyCode() {
debugger; //application will break here as long as chrome developer tools are open
}
ok, для начала вам нужно отправить команду Debugger.enable
.. что-то вроде этого:--5-->
var tabId = parseInt(window.location.search.substring(1));
window.addEventListener("load", function() {
chrome.debugger.sendCommand({tabId:tabId}, "Debugger.enable");
chrome.debugger.attach( tabId, "0.1" );
chrome.debugger.onEvent.addListener(onEvent);
});
тогда внутри вас onEvent вы можете установить точки разрыва
function onEvent(debuggeeId, message, params) {
if (tabId != debuggeeId.tabId) return;
var res = Debugger.setBreakpointByUrl( 2, 'url-of-the-script-file' );
}
я настоятельно рекомендую проверить раздел обнюхивания на этой странице:https://chromedevtools.github.io/devtools-protocol/ потому что я смог увидеть json, который возвращается по протоколу WS, и это поможет вам сделать почти все, что вы хотите.. Я не могу построить тебе полное расширение, ты ... на своего человека,,
Я думаю, что вам нужно добавить somekind DOM elemnet со списком скриптов, которые вы будете анализировать из Network.getResponseBody
а затем somekind инструмента UX, чтобы выбрать эти скрипты и позволить пользователям отлаживать, этот процесс может занять некоторое время : (
надеюсь, что я направил вас в правильном направлении, удачи!