【问题标题】:Debugging source files using chrome extension使用 chrome 扩展调试源文件
【发布时间】:2023-04-03 23:05:01
【问题描述】:

我正在尝试使用 Chrome 扩展程序控制调试器。

我正在使用devtools-protocolchrome extension 文档,但我不知道如何实现它们,因为我没有看到任何正在使用的方法示例。我使用了来自here 的示例扩展,它只显示了如何暂停和恢复调试器,但这对我来说绝对没有用。我尝试在示例中实现一些方法,但没有任何反应。

function onDebuggerEnabled(debuggeeId) {
  chrome.debugger.sendCommand(debuggeeId, "Debugger.setBreakpointByUrl", {
        lineNumber: 45825,
        url: 'full https link to the js file from source tab'
  });
}

问题是我尝试调试的 js 文件是从源选项卡内的网站加载的,它很大,我们在格式化后谈论 150k+ 行,并且需要一些时间来加载。

现在谁能告诉我如何简单地从源代码(使用 CHROME EXTENSION)在 js 文件中添加一个断点,以便在操作时触发它,然后停止调试器以便我可以更改值等?

【问题讨论】:

  • 您是否尝试在您的 javascript 中使用“调试器”一词?
  • 此功能取自扩展文件夹。就像我说的,我正在尝试使用 chrome 扩展添加断点
  • 首先你需要附加调试器。至于命令,请参阅文档中的嗅探协议部分。您还可以检查使用 chrome.debugger 的扩展。
  • 附加了调试器,这个函数只是取自整个js文件。我只是不知道如何将断点设置为由网站加载到源内部的 js 文件..
  • 你能提供更多的上下文吗?您是否尝试调试内容脚本文件?在源选项卡中加载是什么意思?它只是定期加载的 js 文件还是某种动态获取的脚本?如果可能的话,如果不在保密协议下,你能给出源文件的 url 吗?

标签: javascript google-chrome-extension


【解决方案1】:

也许您放置了错误的断点位置(格式化源),尝试使用原始源并添加columnNumber: integer

这里是工作版本JavaScript pause/resume -> background.js:

代码:

// 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"
  });
}

演示

【讨论】:

  • 这个会发生什么?我已经对其进行了测试,结果与我的原始脚本完全相同 - 没有结果。我检查了控制台等,根本没有任何反应。即使此解决方案有效,js 文件也不是来自源选项卡。顺便说一句,我使用原始 js 进行调试,而不是格式化版本,但非常感谢您的努力
  • 它将适用于您的示例,但在我从资源中的应用程序加载 js 的情况下它不起作用,即使我有 js 的 url,它也不会触发中断(我无法检测到是否添加了中断)或者它根本不会添加一个。使用您的示例,js 加载在扩展名下的源代码中,而由于某种原因它没有加载我的。那可能是因为 js url 已经在资源里面了..?
  • 好吧,这些答案实际上都没有让我更接近我想要做的事情,但我认为你的答案非常清楚并且有效,唯一的问题是我需要弄清楚如何在 blob js 上附加中断..
【解决方案2】:

编辑:刚刚看到您对此的评论是针对您正在编写的自定义扩展。我的回答对你没有帮助(对不起!),但它可能会帮助那些来这里寻找在 Chrome 中设置正常断点的方法的人。


也许您已经这样做了,但是...您是否尝试过仅单击要设置断点的行的行号?

像这样:

您甚至可以在同一行的多个不同调用中启用或禁用断点。

页面加载完毕后,使用 F12 打开 Dev Tools,然后导航到 Sources 面板中的 JS 文件,并添加所需的断点。然后,刷新页面以再次加载它——Chrome 会记住您设置断点的位置并停止。

【讨论】:

  • 但他想通过扩展来执行此操作。没有 DevTools。
  • 是的,但是 OP 还说他在 Sources 选项卡中加载了 JS 文件,所以他们正在使用开发工具。无论如何,我刚刚看到 OP 说这是为了让人们在 external 资源中设置断点而编写的扩展的评论——当然,在这种情况下,上述内容无济于事。但我想很多人会遇到这个问题,寻找在 Chrome 中设置断点的方法,所以现在我将保留答案。
【解决方案3】:

如果您可以修改要调试的文件的源代码,我会使用调试器语句。

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
}

【讨论】:

  • 我在询问 chrome,在调试器停止进程之前我无法修改任何内容。我需要找到一种方法来将 js 加载到扩展或通过 url 或通过带有某种引用的源选项卡访问。我会检查你的信息,看看我的问题是否可以使用 firefox 进行排序
  • 哦,不,这不像我可以使用的那样......你必须修改代码,但我不能这样做,因为我必须在网络应用程序启动后访问加载到资源中的那个
【解决方案4】:
function breakhere() {
    debugger;
}

【讨论】:

  • 你能在现有的源 js 中注入“调试器”行吗?
【解决方案5】:

好的,首先你必须发送命令Debugger.enable .. 像这样:

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/,因为我能够看到通过 WS 协议返回的 json,这将帮助您做几乎任何您想做的事情.. 我可以' t构建你的完整扩展,你是你自己的人,

我想您需要添加某种 DOM elemnet 以及您将从 Network.getResponseBody 解析的脚本列表,然后使用某种 UX 工具来选择该脚本并让用户进行调试,该过程可能会花费您一些时间时间:(

希望我已经把你引向了正确的方向,祝你好运!

【讨论】:

  • 正如我所说,调试器已启用,这只是从已设置调试器的整个示例中截取的。你试图解释的是对我来说复杂的方式。所以你的意思是在这种情况下,简单地使用调试器 api setBreakpointByUrl 不起作用?
  • 不,我不是说它不起作用,恰恰相反,我认为它应该起作用,文档说它,我知道你可以调试你想要的所有东西,但是只要用户打开“检查器”,你就会失去你的实例,用户在这里负责,所以从可用性来看,我不建议去开发它
  • 嗯,我的意思是我面临的主要问题,为什么它不起作用,我猜,是因为 js 很大,当我设置中断时,文件还没有在后台加载?我不想对扩展进行任何复杂的调试。我只需要在断点处停止进程即可
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
  • 2015-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多