2017-05-28 230 views
9

我试图使用Chrome扩展控件调试器。使用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文件中添加一个断点,以便它可以在动作时触发,然后停止调试器,以便我可以更改值等?

+1

你试过在你的javascript中使用单词“调试器”吗? –

+0

此功能取自扩展文件夹。就像我说的,我试图用chrome扩展添加一个断点 – AlwaysConfused

+0

首先你需要连接调试器。至于该命令,请参阅在文档中嗅探协议部分。你也可以检查使用chrome.debugger的扩展。 – wOxxOm

回答

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

演示

debugger extension demo

+0

这个假设会发生什么?我测试过了,这与我原来的脚本完全一样 - 没有结果。我查了控制台等,没有任何反应。即使这个解决方案是工作,js文件不是来源选项卡..顺便说一句,我用原来的js调试,而不是格式化版本,但非常感谢您的努力 – AlwaysConfused

+0

更新我的答案和代码,请检查 – uingtea

+0

它将在你的示例工作,但它不会在我的情况下,js从应用程序内部资源加载,甚至当我有js的url,它将不会触发休息(我不能检测是否休息是甚至可以添加),或者它不会添加一个..在你的示例中,js被加载到扩展名下的源文件中,而由于某种原因它不会加载我的文件。那可能是因为js url已经在资源内部了..? – AlwaysConfused

0

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

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 
} 
+0

我在询问有关chrome的信息,在调试器停止该过程之前,我无法修改任何内容。我需要找到一种方法来将js加载到扩展中,或者通过url或通过源选项卡访问某种参考。我会检查你的信息只是为了看看我的问题是否可以使用firefox排序 – AlwaysConfused

+0

哦不,这没什么像我可以使用..你必须修改代码,但我不能这样做,因为我必须访问加载资源在网络应用程序启动后 – AlwaysConfused

1

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


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

像这样:

你甚至可以启用或在同一条线上的几个不同的呼叫禁止断点。

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

+1

但他想从扩展中完成此操作。没有DevTools。 –

+0

是的,但OP也表示他已经在Sources选项卡中加载了JS文件,因此他们*使用开发工具。无论如何,我刚刚看到OP的评论,他说这是为了让他们在_external_资源中设置断点而写的扩展名 - 当然,上述情况在这种情况下无济于事。但我想很多人都会遇到这个问题,寻找在Chrome中设置断点的方法,所以现在我会留下答案。 – walen

0
function breakhere() { 
    debugger; 
} 
+0

您可以在现有源js中注入“调试器”行吗? – AlwaysConfused

0

确定,为启动你必须sendCommand 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,这将帮助你漂亮的做很多你想要的东西..我不能让你完全扩展,你是在你自己的人,

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

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

+0

正如我所说,调试器已启用,这只是从已经设置了调试器的整个示例中删除。你想要解释的是为我复杂的方式。所以你所说的只是通过使用调试器api setBreakpointByUrl在这种情况下不起作用? – AlwaysConfused

+0

不,我不是说它不起作用,恰恰相反,我认为它应该起作用,文档是这样说的,我知道你可以调试所有你想要的东西,但只要用户打开'检查器'你会失去你的实例,用户在这里负责,所以从可用性,我不会建议去发展它 –

+0

嗯,我的意思是我面临的主要问题,为什么它不工作,我猜,它是因为js是巨大的当我设置休息时,文件没有在后台加载?我不想做任何复杂的调试与扩展..我需要的是停止过程中的所有断点 – AlwaysConfused