Skip to content

fix: memory leak in extension features tab #256887

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged

Conversation

SimonSiefke
Copy link
Contributor

Fix an event listener leak in the extensions editor features tab.

Event listeners (before)

One end-to-end test showed an auxclick and keydown event listener leak from markdownRenderer.ts.

{
  "eventListenersWithStackTrace": [
    {
      "type": "auxclick",
      "description": "n=>this.a.fire(n)",
      "objectId": "-6737128020740298089.4.35825",
      "stack": [
        "listener (file:///workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:69:53100)",
        "Object.onWillAddFirstListener (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:70:53162)",
        "u (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:29:1565)",
        "vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:27:6613",
        "Array.map (<anonymous>)",
        "vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:27:6605",
        "b0 (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:384:2706)",
        "Yxe.r (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:2126:72)",
        "Yxe.n (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:2111:336)"
      ],
      "count": 194,
      "originalStack": [
        "file:/Users/cloudtest/vss/_work/1/s/src/vs/base/browser/event.ts:40:14"
      ],
      "originalName": "e"
    },
    {
      "type": "keydown",
      "description": "b=>{const v=new yi(b);!v.equals(10)&&!v.equals(3)||K$t(i,e,v)}",
      "objectId": "-6737128020740298089.4.35827",
      "stack": [
        "listener (file:///workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:383:2826)",
        "new N5i (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:32:8619)",
        "K (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:32:8780)",
        "b0 (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:384:2813)",
        "Yxe.r (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:2126:72)",
        "Yxe.n (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:2111:336)",
        "Yxe.render (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:2109:24451)",
        "Cat.H (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:2126:9844)",
        "Cat.t (vscode-file://vscode-app/workspace/vscode-memory-leak-finder/.vscode-test/vscode-linux-x64-1.102.0/resources/app/out/vs/workbench/workbench.desktop.main.js:2126:8377)"
      ],
      "count": 97,
      "originalStack": [
        "file:/Users/cloudtest/vss/_work/1/s/src/vs/base/browser/markdownRenderer.ts:189:87"
      ],
      "originalName": "e"
    }
  ],
  "isLeak": true
}

After checking where the markdownRenderer connects to the extensionFeatures module, one suspicious disposable from below was discovered. The change registers renderer.render(this.manifest) as a disposable so that it can be properly disposed.

Event listeners (after)

Running the same test again with the fix in place shows no more leaking event listeners

{
  "eventListeners": [],
  "isLeak": false
}

@vs-code-engineering vs-code-engineering bot added this to the July 2025 milestone Jul 22, 2025
@sandy081 sandy081 merged commit 5096b44 into microsoft:main Jul 22, 2025
17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants