【问题标题】:My Chrome Extension makes chrome inspect window shut down by itself silently我的 Chrome 扩展程序使 chrome 检查窗口自行关闭
【发布时间】:2019-08-27 01:38:11
【问题描述】:

我正在编写一个 chrome 扩展程序,它基本上将响应传输到我的本地服务器。

要运行这段代码,我只需要打开检查窗口(这样我就可以使用 devtools)。

它完美地运行了几个小时,但我发现它最终关闭了检查窗口,没有任何错误或生成任何日志。受监控的站点每小时给出一个响应,我刚刚在 Chrome 检查控制台中记录了“OK”。我会看到 OK 的计数在几个小时内增长到超过 15k,但它会使检查窗口关闭。 Chrome 和目标网站将永远存在。

此外,如果我再次打开检查窗口,我的代码将继续工作几个小时。

所以也许我的内存用完了。如何防止检查窗口关闭?或者至少我怎样才能得到它正在关闭的消息。反正有没有不用人工操作就可以重新打开?

实际上,检查窗口在发送 10k 响应之前不会关闭。因此,如果扩展程序可以关闭并重新打开检查窗口,也应该使我的代码永久运行。

顺便说一句,清除控制台日志并不能阻止意外关闭。

以下是我正在运行的代码。

chrome.devtools.network.onRequestFinished.addListener(request => {
    request.getContent((body) => {
        if (request.request && request.request.url) {
            if (body.includes('SomeTag')) {

                var http = new XMLHttpRequest();
                var url = 'http://localhost:13345/testing';
                http.open('POST', url, true);

                http.setRequestHeader('Content-type', 'plain/text; charset="UTF-8');

                http.onreadystatechange = function () {
                    if (http.readyState == 4 && http.status == 200) {
                        chrome.devtools.inspectedWindow.eval('console.log("' + http.responseText + '")');
                    }
                }
                for (var i = 0; i < request.response.headers.length; i++) {
                    if (request.response.headers[i].name == 'Date') {
                        http.send(request.response.headers[i].value + '\n' + body);
                        break;
                    }
                }
            }
        }
    });
});

【问题讨论】:

  • 听起来像是代码中的内存泄漏问题,因此请尝试 debugging it 或 devtools 中的控制台日志溢出问题,因此请尝试完全不使用它(在面板 DOM 中执行输出)或少用它经常。

标签: google-chrome google-chrome-extension google-chrome-devtools


【解决方案1】:

您提到清除日志没有帮助,但您是否尝试过完全不记录?

我怀疑由于使用chrome.devtools.inspectedWindow.eval(…) 作为您的日志记录机制,您可能内存不足。如果禁用日志记录确实解决了问题并且您仍然想要日志记录,您可以通过使用 message passing 将您要登录的消息传递到内容脚本中进行调整,该脚本会将其添加到页面的日志中。

因为我现在正在拖延,我冒昧地将您的示例扩展代码转换为应该工作的东西。我还没有测试过这个端到端,所以你的里程可能会有所不同。

// Copyright 2019 Google LLC.
// SPDX-License-Identifier: Apache-2.0

// manifest.json
{
  …
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "devtools_page": "devtools.html",
  "content_scripts": [{
    "matches": ["<all_urls>"],
    "js": ["content.js"]
  }]
}

// background.js
chrome.runtime.onMessage.addListener(message => {
  if (message.name === "log") {
    chrome.tabs.sendMessage(message.tabId, message.value);
  }
});

// content.js
chrome.runtime.onMessage.addListener(message => {
  console.log(message);
});

// devtools.html
<!DOCTYPE html>
<script src="devtools-loader.js"></script>

// devtools.js
chrome.devtools.network.onRequestFinished.addListener(request => {
  request.getContent(responseBody => {
    if (request.request && request.request.url) {
      if (responseBody.includes('SomeTag')) {

        let body = '';
        for (let header of request.response.headers) {
          if (header.name === "Date") {
            body = `${header.value}\n${responseBody}`;
            break;
          }
        }

        const url = 'http://localhost:13345/testing';
        const config = {
          method: 'POST',
          headers: {
            'Content-Type': 'plain/text; charset="UTF-8"',
          },
          body
        };

        fetch(url, config)
          .then(response => response.text())
          .then(responseText => {
            const message = {
              name: 'log',
              tabId: chrome.devtools.inspectedWindow.tabId,
              value: responseText,
            };

            chrome.runtime.sendMessage(chrome.runtime.id, message)
          });
      }
    }
  });
});

【讨论】:

  • 它确实有助于将运行时间延长几个小时,但即使我关闭所有日志,检查器窗口仍然会关闭。当我监控上面 wOxxOm 提到的内存使用情况时,我看到上升,但 GC 每分钟都会使内存恢复正常。
【解决方案2】:

似乎没有运行扩展的干净chrome,检查窗口最终会泄漏内存。即使我停止录制自动打开的网络选项卡,我也无法停止意外关闭。

网页本身永远存在,taskmanager 显示只有 devtools 选项卡的内存在增长。

这是一个股票监控网站,因此它会在每一次交易时发布/获取一些数据。我相信这是一个 chrome 错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多