Firefox 확장 디버깅 - XPI에 포함 된 모든 JS 및 XUL 파일을 보는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com//questions/24054407

문제

Firefox 28.0을 사용하여 Firefox 확장을 디버깅하려고합니다.

나는 https : // 개발자에게 제안 된 것으로 제안 된대로 dev 환경을 설정했습니다.Mozilla.org/En-us/add-ons/setting_up_extension_development_environment (실제로 나는 게으른 방법을 꺼내서 DEVPREFS 확장을 설치하여 모든 필요에 대한 모든 정보를 설정합니다)

i 그런 다음 Firefox를 열고 디버깅 환경 (도구> 웹 개발자> 브라우저 도구 상자)으로 이동합니다.

i 다음 디버거 탭으로 이동합니다.

그러나 소스 창 아래에서 내 확장 (예 : Chrome : // myExtension)에서 내 확장 XPI에 포함 된 JS 및 XUL 파일 만 볼 수 있습니다.

디버거에서 수동으로 "파일로드"를 수동으로 "로드 할 수 있으므로 나의 확장자의 런타임을 추적 할 수 있습니다.

도움이 되었습니까?

해결책

디버거에는 "수동으로"파일을로드 할 수있는 기능이 없으므로 현재 JavaScript 엔진이로드하는 모든 파일이 표시됩니다. 자세한 내용을 파기하면 JavaScript 엔진이 새 스크립트를 컴파일 할 때마다 디버거가 알림을 받고 해당 파일을 해당 파일에 추가합니다. 따라서 일반적으로 해당 스크립트를 사용하는 페이지 나 대화 상자를 열고 디버거에서 볼 수 있습니다. 나는 "정상적으로"라고 말합니다. 이는 안정적으로 작동하지 않는 것처럼 보이지 않았습니다. 디버거가 일부 스크립트를 놓치게 만드는 버그 인 것처럼 보입니다.

이제 디버거가 특정 파일을로드하도록 강제로 알림을 굽는 것을 고려할 수 있습니다. 파일이 실제로로드되기 전에 중단 점을 설정하려면됩니다. 나는 그것을 시도했다. 그리고 그것은 실제로 가능하지만, Firefox 내부를 엉망으로 만드는 것이 필요하며, 미래의 Firefox 버전에서 변경 될 수있는 여러 구현 세부 정보를 사용할 수 있습니다. 특히 디버거와 통신하는 데 사용되는 DebuggerServer 인스턴스를 가져와야합니다. In-Process 디버거가 항상 동일한 인스턴스를 사용하는 것과 동일한 인스턴스를 사용하는 동안 새 인스턴스가 각 원격 디버거에 대해 생성됩니다. 내가 알 수있는 것에서 버그 993029에서 구현 된 변경 사항에서만 해당 인스턴스가 가능합니다. / A> 현재 Firefox 32 (현재 Firefox Aurora 채널에서 사용할 수 있습니다 < / a>) 이상.

문제점은 toolboxprocess.jsm . 버그 993029에 의해 도입 된 변경 사항을 기 전에 BrowserToolboxProcess 객체가 생성되고 IT에 대한 참조가 없으며 사실 이후에 해당 연결이 불가능합니다. Firefox 32부터 생성 된 모든 생성 된 BrowserToolboxProcess 객체는 processes 세트 및 열거 할 수 있습니다.

이 코드는 debugger.onnewscript () 원격 디버거로 전달됩니다.

(function()
{
  // Iterate over existing processes
  const {processes} = Cu.import("resource:///modules/devtools/ToolboxProcess.jsm", null);
  for (var process of processes)
  {
    // Iterate over connections associated with each process
    var debuggerServer = process.debuggerServer;
    for (var connID in debuggerServer._connections)
    {
      if (!debuggerServer._connections.hasOwnProperty(connID))
        continue;
      var conn = debuggerServer._connections[connID];

      // Get ChromeDebuggerActor instance for the connection
      var chromeDebugger = conn._getOrCreateActor(conn.rootActor._extraActors.chromeDebugger.actorID);

      // Fake new script call
      chromeDebugger.onNewScript({
        url: "chrome://myextension/content/script.js", // CHANGE THAT LINE
        source: {text:""},
        getChildScripts: () => []
      });
    }
  }
})();
.

위에서 언급 했듯이이 코드는 Firefox 32에서 시작하여 Firefox 33.0A1에서 테스트했습니다. 스크래치 패드에서 실행할 수 있고 환경을 "브라우저"로 전환하십시오 . 미래의 Firefox 버전에서는 계속해서 작동할지 보장은 없으며 언제든지 변경할 수있는 몇 가지 구현 세부 사항이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top