2017-05-28 446 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