{"id":"59dc69706213c4cb","repo":"vitest-dev/vitest","slug":"v8-provider-missing-inspector-session","errorCode":null,"errorMessage":"V8 provider missing inspector session.","messagePattern":"V8 provider missing inspector session\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/coverage-v8/src/index.ts","lineNumber":54,"sourceCode":"    }\n\n    this.session ||= new inspector.Session()\n    const session = this.session as inspector.Session\n\n    session.connect()\n    await session.post('Profiler.enable')\n    await session.post('Profiler.startPreciseCoverage', { callCount: true, detailed: true })\n  },\n\n  async takeCoverage(options): Promise<string | undefined> {\n    if (provider === 'stackblitz') {\n      return\n    }\n\n    const session = this.session as inspector.Session\n\n    if (!session) {\n      throw new Error('V8 provider missing inspector session.')\n    }\n\n    const coverage = await session.post('Profiler.takePreciseCoverage')\n    const result: ScriptCoverageWithOffset[] = []\n\n    // Reduce amount of data sent over rpc by doing some early result filtering\n    for (const entry of coverage.result as ScriptCoverageWithOffset[]) {\n      if (filterResult(entry)) {\n        entry.startOffset = options?.moduleExecutionInfo?.get(normalize(fileURLToPath(entry.url)))?.startOffset || 0\n\n        result.push(entry)\n      }\n    }\n\n    if (this.extendedContextCoverageDir && existsSync(this.extendedContextCoverageDir)) {\n      const filenames = await readdir(this.extendedContextCoverageDir)\n      const contents = await Promise.all(\n        filenames","sourceCodeStart":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/vitest-dev/vitest/blob/d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09/packages/coverage-v8/src/index.ts#L36-L72","documentation":"Thrown during takeCoverage() in the V8 node-side coverage module when this.session is null/undefined. Coverage collection relies on a node:inspector Session to call Profiler.takePreciseCoverage; if the session was never created (startCoverage not called or failed) there is nothing to query.","triggerScenarios":"takeCoverage() is invoked before startCoverage() successfully created and connected the inspector session, or this.session was reset to null by a prior stopCoverage().","commonSituations":"Coverage taken in a context where the V8 profiler couldn't start (e.g. incompatible runtime, inspector disabled); calling takeCoverage after stopCoverage in the same process; running under a worker that didn't inherit the session setup.","solutions":["Ensure startCoverage() runs and succeeds before takeCoverage() is called in the same module instance.","Avoid invoking takeCoverage after stopCoverage has disconnected the session.","If the runtime blocks node:inspector, switch to a supported Node version or the istanbul provider."],"exampleFix":"// before\nawait mod.stopCoverage({ isolate: true })\nawait mod.takeCoverage({}) // session is now null\n// after\nawait mod.startCoverage({ isolate: true, reportsDirectory })\nawait mod.takeCoverage({ coverageFilesDirectory })\nawait mod.stopCoverage({ isolate: true })","handlingStrategy":"validation","validationCode":"// guard before taking coverage\nconst session = (mod as any).session\nif (!session) {\n  throw new Error('Call startCoverage() before takeCoverage()')\n}\nawait mod.takeCoverage(opts)","typeGuard":"function hasSession(mod: any): mod is { session: NonNullable<unknown> } {\n  return mod.session != null\n}","tryCatchPattern":"try {\n  await mod.takeCoverage(opts)\n} catch (e) {\n  if (/missing inspector session/i.test(String((e as Error).message))) {\n    await mod.startCoverage(opts)\n    return mod.takeCoverage(opts)\n  }\n  throw e\n}","preventionTips":["Always pair startCoverage with takeCoverage in the same lifecycle.","Never call takeCoverage after stopCoverage in one process.","Verify node:inspector is available in the target runtime before relying on v8 coverage."],"tags":["coverage","v8","inspector","lifecycle"],"analyzedSha":"d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09","analyzedAt":"2026-08-03T20:23:56.861Z","schemaVersion":2}