fix(debug): guarded v8.setFlagsFromString call so CPU profiler works on Bun
The CPU profiler called node:v8 setFlagsFromString("--allow-natives-syntax")
unconditionally and crashed on Bun (oven-sh/bun#1702), surfacing as
"Failed to start profiler: node:v8 setFlagsFromString is not yet
implemented in Bun". The flag is only needed for ad-hoc V8 natives such
as %GetOptimizationStatus, not for the CDP Profiler session that actually
collects samples — so swallow the error and let the inspector path run.
Added a Bun-runtime regression test that would have caught the crash:
without the guard, startCpuProfile() throws before returning a session.
Fixes #3897
This commit is contained in:
@@ -2,6 +2,10 @@
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed `omp debug --profile` failing on Bun with "node:v8 setFlagsFromString is not yet implemented in Bun" by treating the optional `--allow-natives-syntax` flag as best-effort, so the CPU profiler proceeds even on runtimes that don't expose `v8.setFlagsFromString`. ([#3897](https://github.com/can1357/oh-my-pi/issues/3897))
|
||||
|
||||
## [16.2.8] - 2026-06-30
|
||||
|
||||
### Added
|
||||
|
||||
@@ -114,7 +114,13 @@ function formatProfileAsMarkdown(profileJson: string): string {
|
||||
*/
|
||||
export async function startCpuProfile(): Promise<ProfilerSession> {
|
||||
const v8 = await import("node:v8");
|
||||
v8.setFlagsFromString("--allow-natives-syntax");
|
||||
try {
|
||||
// Enables `%GetOptimizationStatus` and friends when V8 natives are needed
|
||||
// for ad-hoc profiling. Best-effort: Bun does not implement
|
||||
// `setFlagsFromString` (oven-sh/bun#1702) but the CPU profiler itself
|
||||
// works without it, so swallow the error and continue.
|
||||
v8.setFlagsFromString("--allow-natives-syntax");
|
||||
} catch {}
|
||||
|
||||
const { Session } = await import("node:inspector/promises");
|
||||
const session = new Session();
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
import { describe, expect, it } from "bun:test";
|
||||
import { startCpuProfile } from "@oh-my-pi/pi-coding-agent/debug/profiler";
|
||||
|
||||
describe("startCpuProfile", () => {
|
||||
// Regression: `node:v8` `setFlagsFromString` throws on Bun
|
||||
// (oven-sh/bun#1702). The profiler used to call it unconditionally and
|
||||
// crash before connecting the inspector session. Running this test under
|
||||
// Bun guarantees the guard is in place — without it the call below would
|
||||
// reject with "node:v8 setFlagsFromString is not yet implemented in Bun".
|
||||
it("starts and stops successfully even when v8.setFlagsFromString is unavailable", async () => {
|
||||
const session = await startCpuProfile();
|
||||
// Run a tiny bit of work so the profile has at least one sample.
|
||||
let acc = 0;
|
||||
for (let i = 0; i < 10_000; i++) acc += i;
|
||||
expect(acc).toBeGreaterThan(0);
|
||||
|
||||
const profile = await session.stop();
|
||||
const parsed = JSON.parse(profile.data) as { nodes: unknown[] };
|
||||
expect(Array.isArray(parsed.nodes)).toBe(true);
|
||||
expect(parsed.nodes.length).toBeGreaterThan(0);
|
||||
expect(typeof profile.markdown).toBe("string");
|
||||
expect(profile.markdown.length).toBeGreaterThan(0);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user