Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@
npm-debug.log
bin
.yarn/install-state.gz
.DS_Store
1 change: 1 addition & 0 deletions .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
yarn lint-staged
9 changes: 9 additions & 0 deletions .oxfmtrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"$schema": "./node_modules/oxfmt/configuration_schema.json",
"trailingComma": "all",
"tabWidth": 2,
"singleQuote": true,
"printWidth": 100,
"sortPackageJson": false,
"ignorePatterns": ["*.md", "*.yml", "*.yaml"]
}
5 changes: 5 additions & 0 deletions .oxlintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"$schema": "./node_modules/oxlint/configuration_schema.json",
"plugins": ["eslint", "unicorn", "oxc", "import"],
"categories": { "correctness": "warn" }
}
3 changes: 1 addition & 2 deletions .releaserc.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,5 @@
"@semantic-release/npm",
"@semantic-release/github"
],
"branches": [ "main" ]
"branches": ["main"]
}

158 changes: 101 additions & 57 deletions build.js
Original file line number Diff line number Diff line change
@@ -1,102 +1,146 @@
import fs from 'node:fs'
import os from 'node:os'
import path from 'node:path'
import childProcess from 'node:child_process'
import fs from 'node:fs';
import os from 'node:os';
import path from 'node:path';
import childProcess from 'node:child_process';

import { getEffectiveArch } from './lib/arch.js'
import { getEffectiveArch } from './lib/arch.js';

const exe = process.platform === 'win32' ? '.exe' : ''
const binDir = path.join(import.meta.dirname, 'bin', `${process.platform}-${getEffectiveArch()}`)
const exe = process.platform === 'win32' ? '.exe' : '';
const binDir = path.join(import.meta.dirname, 'bin', `${process.platform}-${getEffectiveArch()}`);

const minidumpStackwalkDest = path.join(binDir, 'minidump_stackwalk') + exe
const minidumpDumpDest = path.join(binDir, 'minidump_dump') + exe
const dumpSymsDest = path.join(binDir, 'dump_syms') + exe
const minidumpStackwalkDest = path.join(binDir, 'minidump_stackwalk') + exe;
const minidumpDumpDest = path.join(binDir, 'minidump_dump') + exe;
const dumpSymsDest = path.join(binDir, 'dump_syms') + exe;

// do not build if executables already exist
if (
fs.existsSync(minidumpStackwalkDest) &&
fs.existsSync(minidumpDumpDest) &&
fs.existsSync(dumpSymsDest)
) {
process.exit(0)
process.exit(0);
}

function spawnSync (...args) {
const result = childProcess.spawnSync(...args)
if (result.error) throw result.error
function spawnSync(...args) {
const result = childProcess.spawnSync(...args);
if (result.error) throw result.error;
if (result.status !== 0) {
process.exit(result.status)
process.exit(result.status);
}
}

const buildDir = path.join(import.meta.dirname, 'build', getEffectiveArch())
const buildDir = path.join(import.meta.dirname, 'build', getEffectiveArch());
if (!fs.existsSync(buildDir)) {
fs.mkdirSync(buildDir, { recursive: true })
fs.mkdirSync(buildDir, { recursive: true });
}

let overrideArch = ''
let crossCompileHost = ''
let overrideArch = '';
let crossCompileHost = '';
if (getEffectiveArch() !== process.arch && process.platform === 'darwin') {
overrideArch = getEffectiveArch() === 'arm64' ? 'arm64' : 'x86_64'
crossCompileHost = 'x86_64-apple-darwin20.6.0'
overrideArch = getEffectiveArch() === 'arm64' ? 'arm64' : 'x86_64';
crossCompileHost = 'x86_64-apple-darwin20.6.0';
}

spawnSync(path.join(import.meta.dirname, 'deps', 'breakpad', 'configure'), crossCompileHost ? [`--host=${crossCompileHost}`] : [], {
cwd: buildDir,
env: {
...process.env,
CPPFLAGS: [`-I${path.relative(buildDir, path.join(import.meta.dirname, 'deps'))}`, ...(overrideArch ? [`-arch ${overrideArch}`] : [])].join(' '),
LDFLAGS: overrideArch ? `-arch ${overrideArch}` : undefined
spawnSync(
path.join(import.meta.dirname, 'deps', 'breakpad', 'configure'),
crossCompileHost ? [`--host=${crossCompileHost}`] : [],
{
cwd: buildDir,
env: {
...process.env,
CPPFLAGS: [
`-I${path.relative(buildDir, path.join(import.meta.dirname, 'deps'))}`,
...(overrideArch ? [`-arch ${overrideArch}`] : []),
].join(' '),
LDFLAGS: overrideArch ? `-arch ${overrideArch}` : undefined,
},
stdio: 'inherit',
},
stdio: 'inherit'
})
const targets = ['src/processor/minidump_stackwalk', 'src/processor/minidump_dump']
);
const targets = ['src/processor/minidump_stackwalk', 'src/processor/minidump_dump'];
if (process.platform === 'linux') {
targets.push('src/tools/linux/dump_syms/dump_syms')
targets.push('src/tools/linux/dump_syms/dump_syms');
}

spawnSync('make', ['-C', buildDir, '-j', os.cpus().length, ...targets], {
stdio: 'inherit'
})
stdio: 'inherit',
});

if (process.platform === 'darwin') {
spawnSync('xcodebuild', ['-project', path.join(import.meta.dirname, 'deps', 'breakpad', 'src', 'tools', 'mac', 'dump_syms', 'dump_syms.xcodeproj'), 'build'], {
stdio: 'inherit'
})
spawnSync(
'xcodebuild',
[
'-project',
path.join(
import.meta.dirname,
'deps',
'breakpad',
'src',
'tools',
'mac',
'dump_syms',
'dump_syms.xcodeproj',
),
'build',
],
{
stdio: 'inherit',
},
);
}

// copy to bin folder
if (!fs.existsSync(binDir)) {
fs.mkdirSync(binDir, { recursive: true })
fs.mkdirSync(binDir, { recursive: true });
}

const minidumpStackwalk = path.resolve(buildDir, 'src', 'processor', 'minidump_stackwalk') + exe
fs.copyFileSync(minidumpStackwalk, minidumpStackwalkDest)
const minidumpStackwalk = path.resolve(buildDir, 'src', 'processor', 'minidump_stackwalk') + exe;
fs.copyFileSync(minidumpStackwalk, minidumpStackwalkDest);

const minidumpDump = path.resolve(buildDir, 'src', 'processor', 'minidump_dump') + exe
fs.copyFileSync(minidumpDump, minidumpDumpDest)
const minidumpDump = path.resolve(buildDir, 'src', 'processor', 'minidump_dump') + exe;
fs.copyFileSync(minidumpDump, minidumpDumpDest);

const dumpSyms = (() => {
if (process.platform === 'darwin') {
return path.resolve(import.meta.dirname, 'deps', 'breakpad', 'src', 'tools', 'mac', 'dump_syms', 'build', 'Release', 'dump_syms')
return path.resolve(
import.meta.dirname,
'deps',
'breakpad',
'src',
'tools',
'mac',
'dump_syms',
'build',
'Release',
'dump_syms',
);
} else if (process.platform === 'linux') {
return path.resolve(buildDir, 'src', 'tools', 'linux', 'dump_syms', 'dump_syms')
return path.resolve(buildDir, 'src', 'tools', 'linux', 'dump_syms', 'dump_syms');
}
})()
fs.copyFileSync(dumpSyms, dumpSymsDest)

fs.readdirSync(binDir).forEach(file => {
const absFile = path.join(binDir, file)
stripBin(absFile)
maybeSignBin(absFile)
})

function stripBin (file) {
return childProcess.execFileSync(process.env.STRIP || 'strip', [file, process.platform === 'darwin' ? '-Sx' : '--strip-all'])
})();
fs.copyFileSync(dumpSyms, dumpSymsDest);

fs.readdirSync(binDir).forEach((file) => {
const absFile = path.join(binDir, file);
stripBin(absFile);
maybeSignBin(absFile);
});

function stripBin(file) {
return childProcess.execFileSync(process.env.STRIP || 'strip', [
file,
process.platform === 'darwin' ? '-Sx' : '--strip-all',
]);
}

function maybeSignBin (file) {
if (process.platform !== 'darwin') return
function maybeSignBin(file) {
if (process.platform !== 'darwin') return;

return childProcess.execFileSync('codesign', ['--sign', '-', '--force', '--preserve-metadata=entitlements,requirements,flags,runtime', file])
return childProcess.execFileSync('codesign', [
'--sign',
'-',
'--force',
'--preserve-metadata=entitlements,requirements,flags,runtime',
file,
]);
}
30 changes: 15 additions & 15 deletions index.d.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/**
* Add search paths for looking up symbol files.
*/
export function addSymbolPath(...paths: string[]): void
export function addSymbolPath(...paths: string[]): void;

/**
* Get the stack trace from `minidumpFilePath`
Expand All @@ -10,14 +10,14 @@ export function addSymbolPath(...paths: string[]): void
export function walkStack(
minidump: string,
callback: (err: Error, result: Buffer) => void,
commandArgs?: string[]
): void
commandArgs?: string[],
): void;
export function walkStack(
minidump: string,
symbolPaths: string[],
callback: (err: Error, result: Buffer) => void,
commandArgs?: string[]
): void
commandArgs?: string[],
): void;

/**
* Get the contents of the minidump file in somewhat readable text(not yet symbolicated).
Expand All @@ -27,25 +27,25 @@ export function dump(
minidump: string,
callback: (err: Error, result: Buffer) => void,
commandArgs?: string[],
): void
): void;

/**
* Dump debug symbols in minidump format from `binaryPath`
* The `callback` would be called with `callback(error, minidump)` upon completion.
*/
export function dumpSymbol(
binaryPath: string,
callback: (err: Error, result: string) => void
): void
callback: (err: Error, result: string) => void,
): void;

type ModuleInfo = {
version: string
name: string
pdb_file_name?: string
debug_identifier?: string
}
version: string;
name: string;
pdb_file_name?: string;
debug_identifier?: string;
};

export function moduleList(
minidump: string,
callback: (err: Error, result: ModuleInfo[]) => void
): void
callback: (err: Error, result: ModuleInfo[]) => void,
): void;
4 changes: 2 additions & 2 deletions lib/arch.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
export const getEffectiveArch = () => {
return process.env.MINIDUMP_BUILD_ARCH || process.arch
}
return process.env.MINIDUMP_BUILD_ARCH || process.arch;
};
Loading