4

I'm working on a testing suite (implemented as a Chrome extension) that programmatically takes and analyzes heap snapshots with Chrome/Chromium's remote debugging protocol. Because Profiler.* doesn't seem to be part of the public protocol, I'm using this page for reference.

Right now, I'm able to take a heap snapshot by calling HeapProfiler.takeHeapSnapshot like in the snippet below. However, when I try calling HeapProfiler.getHeapSnapshot, my callback is completely ignored.

var debuggerId = {tabId: sender.tab.id};
chrome.debugger.attach(debuggerId, "1.0", function() {
    var listener = function(source, method, params) {
        if(source.tabId === debuggerId.tabId) {
            if(method === "HeapProfiler.addProfileHeader") {
                var uid = params.header.uid;
                chrome.debugger.sendCommand(debuggerId, "HeapProfiler.getHeapSnapshot", { uid: uid }, function() {
                    console.log("I never get called!");
                });
                chrome.debugger.onEvent.removeListener(listener);
            }
        }
    };
    chrome.debugger.onEvent.addListener(listener);
    chrome.debugger.sendCommand(debuggerId, "HeapProfiler.takeHeapSnapshot", { reportProgress: false }, function() {
        if(chrome.runtime.lastError) { console.error(chrome.runtime.lastError); }
    });
});
trincot
  • 317,000
  • 35
  • 244
  • 286
soso
  • 181
  • 1
  • 8

1 Answers1

4

It is a bug in DevTools. I've filled an issue in chrome bug tracker.

Fortunately there is a workaround. You have to enable Debugger agent before getting the snapshot.

chrome.debugger.sendCommand(debuggeeId,"Debugger.enable", { }, function() { });

Three other commands were also affected by this bug.

Profiler.start
Profiler.stop
Profiler.getCPUProfile
loislo
  • 14,025
  • 1
  • 28
  • 24