[Lldb-commits] [lldb] Logging setup for lldb-dap extension (PR #146884)
via lldb-commits
lldb-commits at lists.llvm.org
Fri Aug 1 10:53:36 PDT 2025
https://github.com/award999 updated https://github.com/llvm/llvm-project/pull/146884
>From ba55b877b38f9668250caa15b89f0416f802b9cb Mon Sep 17 00:00:00 2001
From: Adam Ward <award999 at apple.com>
Date: Thu, 3 Jul 2025 09:13:41 -0400
Subject: [PATCH 01/12] Logging setup for lldb-dap extension
- Add `winston` dependency (MIT license) to handle logging setup
- Have an `OutputChannel` to log user facing information, errors, warnings
- Write a verose log under the provided `logUri` to capture further diagnostics
- Introduce `verboseLogging` setting to increase `OutputChannel` verbosity and write DAP session logs
Issue: #146880
---
lldb/tools/lldb-dap/package-lock.json | 242 +++++++++++++++++-
lldb/tools/lldb-dap/package.json | 9 +-
.../lldb-dap/src-ts/debug-adapter-factory.ts | 37 ++-
.../src-ts/debug-configuration-provider.ts | 11 +-
.../lldb-dap/src-ts/debug-session-tracker.ts | 13 +-
lldb/tools/lldb-dap/src-ts/extension.ts | 21 +-
lldb/tools/lldb-dap/src-ts/logger.ts | 88 +++++++
7 files changed, 404 insertions(+), 17 deletions(-)
create mode 100644 lldb/tools/lldb-dap/src-ts/logger.ts
diff --git a/lldb/tools/lldb-dap/package-lock.json b/lldb/tools/lldb-dap/package-lock.json
index af90a9573aee6..f9f071ae7e41a 100644
--- a/lldb/tools/lldb-dap/package-lock.json
+++ b/lldb/tools/lldb-dap/package-lock.json
@@ -15,7 +15,9 @@
"@vscode/vsce": "^3.2.2",
"prettier": "^3.4.2",
"prettier-plugin-curly": "^0.3.1",
- "typescript": "^5.7.3"
+ "typescript": "^5.7.3",
+ "winston": "^3.17.0",
+ "winston-transport": "^4.9.0"
},
"engines": {
"vscode": "^1.75.0"
@@ -318,6 +320,28 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@colors/colors": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz",
+ "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/@dabh/diagnostics": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
+ "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "colorspace": "1.1.x",
+ "enabled": "2.0.x",
+ "kuler": "^2.0.0"
+ }
+ },
"node_modules/@isaacs/cliui": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
@@ -399,6 +423,13 @@
"undici-types": "~5.26.4"
}
},
+ "node_modules/@types/triple-beam": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz",
+ "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/vscode": {
"version": "1.75.0",
"resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.75.0.tgz",
@@ -642,6 +673,13 @@
"dev": true,
"license": "Python-2.0"
},
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -858,6 +896,17 @@
"node": ">=16"
}
},
+ "node_modules/color": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
+ "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.3",
+ "color-string": "^1.6.0"
+ }
+ },
"node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
@@ -873,6 +922,28 @@
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"dev": true
},
+ "node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "node_modules/colorspace": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
+ "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color": "^3.1.3",
+ "text-hex": "1.0.x"
+ }
+ },
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -1114,6 +1185,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/enabled": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
+ "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/end-of-stream": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
@@ -1207,6 +1285,20 @@
"pend": "~1.2.0"
}
},
+ "node_modules/fecha": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
+ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fn.name": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
+ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/foreground-child": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
@@ -1494,8 +1586,7 @@
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true,
- "optional": true
+ "dev": true
},
"node_modules/ini": {
"version": "1.3.8",
@@ -1504,6 +1595,13 @@
"dev": true,
"optional": true
},
+ "node_modules/is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/is-docker": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
@@ -1530,6 +1628,19 @@
"node": ">=8"
}
},
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/is-wsl": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
@@ -1673,6 +1784,13 @@
"prebuild-install": "^7.0.1"
}
},
+ "node_modules/kuler": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
+ "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/leven": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@@ -1741,6 +1859,24 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/logform": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz",
+ "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@colors/colors": "1.6.0",
+ "@types/triple-beam": "^1.3.2",
+ "fecha": "^4.2.0",
+ "ms": "^2.1.1",
+ "safe-stable-stringify": "^2.3.1",
+ "triple-beam": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
"node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -1951,6 +2087,16 @@
"wrappy": "1"
}
},
+ "node_modules/one-time": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
+ "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fn.name": "1.x.x"
+ }
+ },
"node_modules/open": {
"version": "8.4.2",
"resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
@@ -2200,7 +2346,6 @@
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"dev": true,
- "optional": true,
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -2230,6 +2375,16 @@
}
]
},
+ "node_modules/safe-stable-stringify": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz",
+ "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/sax": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz",
@@ -2410,6 +2565,26 @@
"simple-concat": "^1.0.0"
}
},
+ "node_modules/simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "node_modules/stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/stoppable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz",
@@ -2426,7 +2601,6 @@
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"dev": true,
- "optional": true,
"dependencies": {
"safe-buffer": "~5.2.0"
}
@@ -2587,6 +2761,13 @@
"node": ">=6"
}
},
+ "node_modules/text-hex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
+ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/tmp": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
@@ -2597,6 +2778,16 @@
"node": ">=14.14"
}
},
+ "node_modules/triple-beam": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz",
+ "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
@@ -2683,8 +2874,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true,
- "optional": true
+ "dev": true
},
"node_modules/uuid": {
"version": "8.3.2",
@@ -2712,6 +2902,44 @@
"node": ">= 8"
}
},
+ "node_modules/winston": {
+ "version": "3.17.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz",
+ "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@colors/colors": "^1.6.0",
+ "@dabh/diagnostics": "^2.0.2",
+ "async": "^3.2.3",
+ "is-stream": "^2.0.0",
+ "logform": "^2.7.0",
+ "one-time": "^1.0.0",
+ "readable-stream": "^3.4.0",
+ "safe-stable-stringify": "^2.3.1",
+ "stack-trace": "0.0.x",
+ "triple-beam": "^1.3.0",
+ "winston-transport": "^4.9.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/winston-transport": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz",
+ "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "logform": "^2.7.0",
+ "readable-stream": "^3.6.2",
+ "triple-beam": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
"node_modules/wrap-ansi": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
diff --git a/lldb/tools/lldb-dap/package.json b/lldb/tools/lldb-dap/package.json
index 801abe73edd7d..fb49b430554e2 100644
--- a/lldb/tools/lldb-dap/package.json
+++ b/lldb/tools/lldb-dap/package.json
@@ -34,7 +34,9 @@
"@vscode/vsce": "^3.2.2",
"prettier": "^3.4.2",
"prettier-plugin-curly": "^0.3.1",
- "typescript": "^5.7.3"
+ "typescript": "^5.7.3",
+ "winston": "^3.17.0",
+ "winston-transport": "^4.9.0"
},
"activationEvents": [
"onDebug",
@@ -110,6 +112,11 @@
"additionalProperties": {
"type": "string"
}
+ },
+ "lldb-dap.verboseLogging": {
+ "type": "boolean",
+ "description": "Enable verbose logging to the \"LLDB-DAP\" output channel for the running debug session. Also will write LLDB-DAP session logs to the Extension's log folder if the `lldb-dap.log-path` setting is not explicitly set.",
+ "default": false
}
}
},
diff --git a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
index b5db45b56d6a6..81460da8a2323 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
@@ -5,6 +5,7 @@ import * as child_process from "child_process";
import * as fs from "node:fs/promises";
import { ConfigureButton, OpenSettingsButton } from "./ui/show-error-message";
import { ErrorWithNotification } from "./ui/error-with-notification";
+import { Logger } from "./logger";
const exec = util.promisify(child_process.execFile);
@@ -156,16 +157,34 @@ async function getDAPArguments(
.get<string[]>("arguments", []);
}
+/**
+ * Formats the given date as a string in the form "YYYYMMdd".
+ *
+ * @param date The date to format as a string.
+ * @returns The formatted date.
+ */
+function formatDate(date: Date): string {
+ const year = date.getFullYear().toString().padStart(4, "0");
+ const month = (date.getMonth() + 1).toString().padStart(2, "0");
+ const day = date.getDate().toString().padStart(2, "0");
+ const hour = date.getHours().toString().padStart(2, "0");
+ const minute = date.getMinutes().toString().padStart(2, "0");
+ const seconds = date.getSeconds().toString().padStart(2, "0");
+ return year + month + day + hour + minute + seconds;
+}
+
/**
* Creates a new {@link vscode.DebugAdapterExecutable} based on the provided workspace folder and
* debug configuration. Assumes that the given debug configuration is for a local launch of lldb-dap.
*
+ * @param logger The {@link Logger} to get default session log location
* @param workspaceFolder The {@link vscode.WorkspaceFolder} that the debug session will be launched within
* @param configuration The {@link vscode.DebugConfiguration} that will be launched
* @throws An {@link ErrorWithNotification} if something went wrong
* @returns The {@link vscode.DebugAdapterExecutable} that can be used to launch lldb-dap
*/
export async function createDebugAdapterExecutable(
+ logger: Logger,
workspaceFolder: vscode.WorkspaceFolder | undefined,
configuration: vscode.DebugConfiguration,
): Promise<vscode.DebugAdapterExecutable> {
@@ -174,6 +193,8 @@ export async function createDebugAdapterExecutable(
let env: { [key: string]: string } = {};
if (log_path) {
env["LLDBDAP_LOG"] = log_path;
+ } else if (vscode.workspace.getConfiguration("lldb-dap").get("verboseLogging", false)) {
+ env["LLDBDAP_LOG"] = logger.logFilePath(`lldb-dap-session-${formatDate(new Date())}.log`);
}
const configEnvironment =
config.get<{ [key: string]: string }>("environment") || {};
@@ -188,6 +209,11 @@ export async function createDebugAdapterExecutable(
};
const dbgArgs = await getDAPArguments(workspaceFolder, configuration);
+ logger.info(`lldb-dap path: ${dapPath}`);
+ logger.info(`lldb-dap args: ${dbgArgs}`);
+ logger.info(`cwd: ${dbgOptions.cwd}`);
+ logger.info(`env: ${JSON.stringify(configEnvironment)}`);
+
return new vscode.DebugAdapterExecutable(dapPath, dbgArgs, dbgOptions);
}
@@ -198,18 +224,26 @@ export async function createDebugAdapterExecutable(
export class LLDBDapDescriptorFactory
implements vscode.DebugAdapterDescriptorFactory
{
+ constructor(private readonly logger: Logger) {}
+
async createDebugAdapterDescriptor(
session: vscode.DebugSession,
executable: vscode.DebugAdapterExecutable | undefined,
): Promise<vscode.DebugAdapterDescriptor | undefined> {
+ this.logger.info(`Creating debug adapter for session "${session.name}"`);
+ this.logger.debug(`Session "${session.name}" debug configuration:`);
+ this.logger.debug(JSON.stringify(session.configuration, undefined, 2));
if (executable) {
- throw new Error(
+ const error = new Error(
"Setting the debug adapter executable in the package.json is not supported.",
);
+ this.logger.error(error);
+ throw error;
}
// Use a server connection if the debugAdapterPort is provided
if (session.configuration.debugAdapterPort) {
+ this.logger.info(`Spawning debug adapter server on port ${session.configuration.debugAdapterPort}`);
return new vscode.DebugAdapterServer(
session.configuration.debugAdapterPort,
session.configuration.debugAdapterHostname,
@@ -217,6 +251,7 @@ export class LLDBDapDescriptorFactory
}
return createDebugAdapterExecutable(
+ this.logger,
session.workspaceFolder,
session.configuration,
);
diff --git a/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts b/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts
index 316ffaf47c3d2..65a63a85c9036 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts
@@ -5,6 +5,7 @@ import { LLDBDapServer } from "./lldb-dap-server";
import { createDebugAdapterExecutable } from "./debug-adapter-factory";
import { ConfigureButton, showErrorMessage } from "./ui/show-error-message";
import { ErrorWithNotification } from "./ui/error-with-notification";
+import { Logger } from "./logger";
const exec = util.promisify(child_process.execFile);
@@ -71,13 +72,16 @@ const configurations: Record<string, DefaultConfig> = {
export class LLDBDapConfigurationProvider
implements vscode.DebugConfigurationProvider
{
- constructor(private readonly server: LLDBDapServer) {}
+ constructor(private readonly server: LLDBDapServer, private readonly logger: Logger) {}
async resolveDebugConfiguration(
folder: vscode.WorkspaceFolder | undefined,
debugConfiguration: vscode.DebugConfiguration,
token?: vscode.CancellationToken,
): Promise<vscode.DebugConfiguration> {
+ this.logger.info(`Resolving debug configuration for "${debugConfiguration.name}"`);
+ this.logger.debug("Initial debug configuration:");
+ this.logger.debug(JSON.stringify(debugConfiguration, undefined, 2));
let config = vscode.workspace.getConfiguration("lldb-dap");
for (const [key, cfg] of Object.entries(configurations)) {
if (Reflect.has(debugConfiguration, key)) {
@@ -152,6 +156,7 @@ export class LLDBDapConfigurationProvider
// Always try to create the debug adapter executable as this will show the user errors
// if there are any.
const executable = await createDebugAdapterExecutable(
+ this.logger,
folder,
debugConfiguration,
);
@@ -184,8 +189,12 @@ export class LLDBDapConfigurationProvider
}
}
+ this.logger.debug("Resolved debug configuration:");
+ this.logger.debug(JSON.stringify(debugConfiguration, undefined, 2));
+
return debugConfiguration;
} catch (error) {
+ this.logger.error(error);
// Show a better error message to the user if possible
if (!(error instanceof ErrorWithNotification)) {
throw error;
diff --git a/lldb/tools/lldb-dap/src-ts/debug-session-tracker.ts b/lldb/tools/lldb-dap/src-ts/debug-session-tracker.ts
index 50db1e1c3a7b0..a5424b6ce4ae8 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-session-tracker.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-session-tracker.ts
@@ -1,10 +1,12 @@
import { DebugProtocol } from "@vscode/debugprotocol";
import * as vscode from "vscode";
+import { Logger } from "./logger";
/** A helper type for mapping event types to their corresponding data type. */
// prettier-ignore
interface EventMap {
"module": DebugProtocol.ModuleEvent;
+ "exited": DebugProtocol.ExitedEvent;
}
/** A type assertion to check if a ProtocolMessage is an event or if it is a specific event. */
@@ -47,7 +49,7 @@ export class DebugSessionTracker
onDidChangeModules: vscode.Event<vscode.DebugSession | undefined> =
this.modulesChanged.event;
- constructor() {
+ constructor(private logger: Logger) {
this.onDidChangeModules(this.moduleChangedListener, this);
vscode.debug.onDidChangeActiveDebugSession((session) =>
this.modulesChanged.fire(session),
@@ -62,8 +64,12 @@ export class DebugSessionTracker
createDebugAdapterTracker(
session: vscode.DebugSession,
): vscode.ProviderResult<vscode.DebugAdapterTracker> {
+ this.logger.info(`Starting debug session "${session.name}"`);
+ let stopping = false;
return {
+ onError: (error) => !stopping && this.logger.error(error), // Can throw benign read errors when shutting down
onDidSendMessage: (message) => this.onDidSendMessage(session, message),
+ onWillStopSession: () => stopping = true,
onExit: () => this.onExit(session),
};
}
@@ -134,6 +140,11 @@ export class DebugSessionTracker
}
this.modules.set(session, modules);
this.modulesChanged.fire(session);
+ } else if (isEvent(message, "exited")) {
+ // The vscode.DebugAdapterTracker#onExit event is sometimes called with
+ // exitCode = undefined but the exit event from LLDB-DAP always has the "exitCode"
+ const { exitCode } = message.body;
+ this.logger.info(`Session "${session.name}" exited with code ${exitCode}`);
}
}
}
diff --git a/lldb/tools/lldb-dap/src-ts/extension.ts b/lldb/tools/lldb-dap/src-ts/extension.ts
index c8e5146e29cea..fe5f3a0100907 100644
--- a/lldb/tools/lldb-dap/src-ts/extension.ts
+++ b/lldb/tools/lldb-dap/src-ts/extension.ts
@@ -1,3 +1,4 @@
+import * as path from "path";
import * as vscode from "vscode";
import { LLDBDapDescriptorFactory } from "./debug-adapter-factory";
@@ -10,28 +11,31 @@ import {
ModulesDataProvider,
ModuleProperty,
} from "./ui/modules-data-provider";
+import { Logger } from "./logger";
/**
* This class represents the extension and manages its life cycle. Other extensions
* using it as as library should use this class as the main entry point.
*/
export class LLDBDapExtension extends DisposableContext {
- constructor() {
+ constructor(logger: Logger, outputChannel: vscode.OutputChannel) {
super();
const lldbDapServer = new LLDBDapServer();
- const sessionTracker = new DebugSessionTracker();
+ const sessionTracker = new DebugSessionTracker(logger);
this.pushSubscription(
+ logger,
+ outputChannel,
lldbDapServer,
sessionTracker,
vscode.debug.registerDebugConfigurationProvider(
"lldb-dap",
- new LLDBDapConfigurationProvider(lldbDapServer),
+ new LLDBDapConfigurationProvider(lldbDapServer, logger),
),
vscode.debug.registerDebugAdapterDescriptorFactory(
"lldb-dap",
- new LLDBDapDescriptorFactory(),
+ new LLDBDapDescriptorFactory(logger),
),
vscode.debug.registerDebugAdapterTrackerFactory(
"lldb-dap",
@@ -54,6 +58,11 @@ export class LLDBDapExtension extends DisposableContext {
/**
* This is the entry point when initialized by VS Code.
*/
-export function activate(context: vscode.ExtensionContext) {
- context.subscriptions.push(new LLDBDapExtension());
+export async function activate(context: vscode.ExtensionContext) {
+ await vscode.workspace.fs.createDirectory(context.logUri);
+ const outputChannel = vscode.window.createOutputChannel("LLDB-DAP");
+ const logger = new Logger((name) => path.join(context.logUri.fsPath, name), outputChannel);
+ logger.info("LLDB-Dap extension activating...");
+ context.subscriptions.push(new LLDBDapExtension(logger, outputChannel));
+ logger.info("LLDB-Dap extension activated");
}
diff --git a/lldb/tools/lldb-dap/src-ts/logger.ts b/lldb/tools/lldb-dap/src-ts/logger.ts
new file mode 100644
index 0000000000000..15da25ff0e28d
--- /dev/null
+++ b/lldb/tools/lldb-dap/src-ts/logger.ts
@@ -0,0 +1,88 @@
+import * as vscode from "vscode";
+import * as winston from "winston";
+import * as Transport from "winston-transport";
+
+class OutputChannelTransport extends Transport {
+ constructor(private readonly ouptutChannel: vscode.OutputChannel) {
+ super();
+ }
+
+ public log(info: any, next: () => void): void {
+ this.ouptutChannel.appendLine(info[Symbol.for('message')]);
+ next();
+ }
+}
+
+export class Logger implements vscode.Disposable {
+ private disposables: vscode.Disposable[] = [];
+ private logger: winston.Logger;
+
+ constructor(public readonly logFilePath: (name: string) => string, ouptutChannel: vscode.OutputChannel) {
+ const ouptutChannelTransport = new OutputChannelTransport(ouptutChannel);
+ ouptutChannelTransport.level = this.outputChannelLevel();
+ this.logger = winston.createLogger({
+ transports: [
+ new winston.transports.File({ filename: logFilePath("lldb-dap-extension.log"), level: "debug" }), // File logging at the 'debug' level
+ ouptutChannelTransport
+ ],
+ format: winston.format.combine(
+ winston.format.errors({ stack: true }),
+ winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }),
+ winston.format.printf(msg => `[${msg.timestamp}][${msg.level}] ${msg.message} ${msg.stack ? msg.stack : ''}`),
+ ),
+ });
+ if (process.env.NODE_ENV !== 'production') {
+ this.logger.add(new winston.transports.Console({
+ level: "error"
+ }));
+ }
+ this.disposables.push(
+ {
+ dispose: () => this.logger.close()
+ },
+ vscode.workspace.onDidChangeConfiguration(e => {
+ if (e.affectsConfiguration("lldb-dap.verboseLogging")) {
+ ouptutChannelTransport.level = this.outputChannelLevel();
+ }
+ })
+ );
+ }
+
+ debug(message: any) {
+ this.logger.debug(this.normalizeMessage(message));
+ }
+
+ info(message: any) {
+ this.logger.info(this.normalizeMessage(message));
+ }
+
+ warn(message: any) {
+ this.logger.warn(this.normalizeMessage(message));
+ }
+
+ error(message: any) {
+ if (message instanceof Error) {
+ this.logger.error(message);
+ return;
+ }
+ this.logger.error(this.normalizeMessage(message));
+ }
+
+ private normalizeMessage(message: any) {
+ if (typeof message === "string") {
+ return message;
+ } else if (typeof message === "object") {
+ return JSON.stringify(message);
+ }
+ return `${message}`;
+ }
+
+ private outputChannelLevel(): string {
+ return vscode.workspace.getConfiguration("lldb-dap").get("verboseLogging", false) ?
+ "debug" : "info";
+ }
+
+ dispose() {
+ this.disposables.forEach(d => d.dispose());
+ }
+}
\ No newline at end of file
>From 6d423f1c14037770fbc05caf534c9a172ba5a486 Mon Sep 17 00:00:00 2001
From: Adam Ward <award999 at apple.com>
Date: Tue, 22 Jul 2025 11:32:31 -0400
Subject: [PATCH 02/12] Use same timestamp format as `LogOutputChannel`
---
lldb/tools/lldb-dap/src-ts/logger.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/lldb/tools/lldb-dap/src-ts/logger.ts b/lldb/tools/lldb-dap/src-ts/logger.ts
index 15da25ff0e28d..de533456da624 100644
--- a/lldb/tools/lldb-dap/src-ts/logger.ts
+++ b/lldb/tools/lldb-dap/src-ts/logger.ts
@@ -27,8 +27,8 @@ export class Logger implements vscode.Disposable {
],
format: winston.format.combine(
winston.format.errors({ stack: true }),
- winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }),
- winston.format.printf(msg => `[${msg.timestamp}][${msg.level}] ${msg.message} ${msg.stack ? msg.stack : ''}`),
+ winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss.SSS" }), // This is the format of `vscode.LogOutputChannel`
+ winston.format.printf(msg => `${msg.timestamp} [${msg.level}] ${msg.message} ${msg.stack ? msg.stack : ''}`),
),
});
if (process.env.NODE_ENV !== 'production') {
>From 913edeb63e050a7d0fb3863cf69206648ede867f Mon Sep 17 00:00:00 2001
From: Adam Ward <award999 at apple.com>
Date: Tue, 22 Jul 2025 11:39:11 -0400
Subject: [PATCH 03/12] Address review comment
---
lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
index 81460da8a2323..c2b91c8b98a2a 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
@@ -170,7 +170,7 @@ function formatDate(date: Date): string {
const hour = date.getHours().toString().padStart(2, "0");
const minute = date.getMinutes().toString().padStart(2, "0");
const seconds = date.getSeconds().toString().padStart(2, "0");
- return year + month + day + hour + minute + seconds;
+ return `${year}${month}${day}T${hour}${minute}${seconds}`;
}
/**
>From 606c3354eb9b7d1375175d253717f067439c294d Mon Sep 17 00:00:00 2001
From: Adam Ward <award999 at apple.com>
Date: Tue, 22 Jul 2025 13:25:24 -0400
Subject: [PATCH 04/12] Some more cleanup
---
lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts | 3 +--
lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts | 6 ++----
lldb/tools/lldb-dap/src-ts/logger.ts | 6 ++++--
3 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
index c2b91c8b98a2a..4c34fad817e9e 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
@@ -231,8 +231,7 @@ export class LLDBDapDescriptorFactory
executable: vscode.DebugAdapterExecutable | undefined,
): Promise<vscode.DebugAdapterDescriptor | undefined> {
this.logger.info(`Creating debug adapter for session "${session.name}"`);
- this.logger.debug(`Session "${session.name}" debug configuration:`);
- this.logger.debug(JSON.stringify(session.configuration, undefined, 2));
+ this.logger.debug(`Session "${session.name}" debug configuration:\n` + JSON.stringify(session.configuration, undefined, 2));
if (executable) {
const error = new Error(
"Setting the debug adapter executable in the package.json is not supported.",
diff --git a/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts b/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts
index 65a63a85c9036..19012443ca06d 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts
@@ -80,8 +80,7 @@ export class LLDBDapConfigurationProvider
token?: vscode.CancellationToken,
): Promise<vscode.DebugConfiguration> {
this.logger.info(`Resolving debug configuration for "${debugConfiguration.name}"`);
- this.logger.debug("Initial debug configuration:");
- this.logger.debug(JSON.stringify(debugConfiguration, undefined, 2));
+ this.logger.debug("Initial debug configuration:\n" + JSON.stringify(debugConfiguration, undefined, 2));
let config = vscode.workspace.getConfiguration("lldb-dap");
for (const [key, cfg] of Object.entries(configurations)) {
if (Reflect.has(debugConfiguration, key)) {
@@ -189,8 +188,7 @@ export class LLDBDapConfigurationProvider
}
}
- this.logger.debug("Resolved debug configuration:");
- this.logger.debug(JSON.stringify(debugConfiguration, undefined, 2));
+ this.logger.debug("Resolved debug configuration:\n" + JSON.stringify(debugConfiguration, undefined, 2));
return debugConfiguration;
} catch (error) {
diff --git a/lldb/tools/lldb-dap/src-ts/logger.ts b/lldb/tools/lldb-dap/src-ts/logger.ts
index de533456da624..971c63fa6610c 100644
--- a/lldb/tools/lldb-dap/src-ts/logger.ts
+++ b/lldb/tools/lldb-dap/src-ts/logger.ts
@@ -71,10 +71,12 @@ export class Logger implements vscode.Disposable {
private normalizeMessage(message: any) {
if (typeof message === "string") {
return message;
- } else if (typeof message === "object") {
+ }
+ try {
return JSON.stringify(message);
+ } catch (e) {
+ return `${message}`;
}
- return `${message}`;
}
private outputChannelLevel(): string {
>From 0387965de08f859bb19cd61b5a72ae7cf0ee2f8d Mon Sep 17 00:00:00 2001
From: Adam Ward <award999 at apple.com>
Date: Tue, 22 Jul 2025 14:45:25 -0400
Subject: [PATCH 05/12] Fix comment code
---
lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
index 4c34fad817e9e..96e1b75789f2c 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
@@ -158,7 +158,7 @@ async function getDAPArguments(
}
/**
- * Formats the given date as a string in the form "YYYYMMdd".
+ * Formats the given date as a string in the form "YYYYMMddTHHMMSS".
*
* @param date The date to format as a string.
* @returns The formatted date.
>From c42d534e1d84f64afb9ac9afc57cbe4d44b13c86 Mon Sep 17 00:00:00 2001
From: Adam Ward <award999 at apple.com>
Date: Tue, 29 Jul 2025 10:08:54 -0400
Subject: [PATCH 06/12] Extract `logger` as an interface
---
.../lldb-dap/src-ts/debug-adapter-factory.ts | 9 ++++--
.../src-ts/debug-configuration-provider.ts | 7 ++--
lldb/tools/lldb-dap/src-ts/extension.ts | 13 ++++----
lldb/tools/lldb-dap/src-ts/logger.ts | 32 ++++++++++++-------
4 files changed, 38 insertions(+), 23 deletions(-)
diff --git a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
index 96e1b75789f2c..8cc0340e9ef80 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
@@ -5,7 +5,7 @@ import * as child_process from "child_process";
import * as fs from "node:fs/promises";
import { ConfigureButton, OpenSettingsButton } from "./ui/show-error-message";
import { ErrorWithNotification } from "./ui/error-with-notification";
-import { Logger } from "./logger";
+import { LogFilePathProvider, Logger } from "./logger";
const exec = util.promisify(child_process.execFile);
@@ -178,6 +178,7 @@ function formatDate(date: Date): string {
* debug configuration. Assumes that the given debug configuration is for a local launch of lldb-dap.
*
* @param logger The {@link Logger} to get default session log location
+ * @param logFilePath The {@link LogFilePathProvider} for determining where to put session logs
* @param workspaceFolder The {@link vscode.WorkspaceFolder} that the debug session will be launched within
* @param configuration The {@link vscode.DebugConfiguration} that will be launched
* @throws An {@link ErrorWithNotification} if something went wrong
@@ -185,6 +186,7 @@ function formatDate(date: Date): string {
*/
export async function createDebugAdapterExecutable(
logger: Logger,
+ logFilePath: LogFilePathProvider,
workspaceFolder: vscode.WorkspaceFolder | undefined,
configuration: vscode.DebugConfiguration,
): Promise<vscode.DebugAdapterExecutable> {
@@ -194,7 +196,7 @@ export async function createDebugAdapterExecutable(
if (log_path) {
env["LLDBDAP_LOG"] = log_path;
} else if (vscode.workspace.getConfiguration("lldb-dap").get("verboseLogging", false)) {
- env["LLDBDAP_LOG"] = logger.logFilePath(`lldb-dap-session-${formatDate(new Date())}.log`);
+ env["LLDBDAP_LOG"] = logFilePath(`lldb-dap-session-${formatDate(new Date())}.log`);
}
const configEnvironment =
config.get<{ [key: string]: string }>("environment") || {};
@@ -224,7 +226,7 @@ export async function createDebugAdapterExecutable(
export class LLDBDapDescriptorFactory
implements vscode.DebugAdapterDescriptorFactory
{
- constructor(private readonly logger: Logger) {}
+ constructor(private readonly logger: Logger, private logFilePath: LogFilePathProvider) {}
async createDebugAdapterDescriptor(
session: vscode.DebugSession,
@@ -251,6 +253,7 @@ export class LLDBDapDescriptorFactory
return createDebugAdapterExecutable(
this.logger,
+ this.logFilePath,
session.workspaceFolder,
session.configuration,
);
diff --git a/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts b/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts
index 19012443ca06d..46ce5aefc45ed 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts
@@ -5,7 +5,7 @@ import { LLDBDapServer } from "./lldb-dap-server";
import { createDebugAdapterExecutable } from "./debug-adapter-factory";
import { ConfigureButton, showErrorMessage } from "./ui/show-error-message";
import { ErrorWithNotification } from "./ui/error-with-notification";
-import { Logger } from "./logger";
+import { LogFilePathProvider, Logger } from "./logger";
const exec = util.promisify(child_process.execFile);
@@ -72,7 +72,7 @@ const configurations: Record<string, DefaultConfig> = {
export class LLDBDapConfigurationProvider
implements vscode.DebugConfigurationProvider
{
- constructor(private readonly server: LLDBDapServer, private readonly logger: Logger) {}
+ constructor(private readonly server: LLDBDapServer, private readonly logger: Logger, private readonly logFilePath: LogFilePathProvider) {}
async resolveDebugConfiguration(
folder: vscode.WorkspaceFolder | undefined,
@@ -156,6 +156,7 @@ export class LLDBDapConfigurationProvider
// if there are any.
const executable = await createDebugAdapterExecutable(
this.logger,
+ this.logFilePath,
folder,
debugConfiguration,
);
@@ -192,7 +193,7 @@ export class LLDBDapConfigurationProvider
return debugConfiguration;
} catch (error) {
- this.logger.error(error);
+ this.logger.error(error as Error);
// Show a better error message to the user if possible
if (!(error instanceof ErrorWithNotification)) {
throw error;
diff --git a/lldb/tools/lldb-dap/src-ts/extension.ts b/lldb/tools/lldb-dap/src-ts/extension.ts
index fe5f3a0100907..b30f86d770cf6 100644
--- a/lldb/tools/lldb-dap/src-ts/extension.ts
+++ b/lldb/tools/lldb-dap/src-ts/extension.ts
@@ -11,14 +11,14 @@ import {
ModulesDataProvider,
ModuleProperty,
} from "./ui/modules-data-provider";
-import { Logger } from "./logger";
+import { LLDBDAPLogger, LogFilePathProvider } from "./logger";
/**
* This class represents the extension and manages its life cycle. Other extensions
* using it as as library should use this class as the main entry point.
*/
export class LLDBDapExtension extends DisposableContext {
- constructor(logger: Logger, outputChannel: vscode.OutputChannel) {
+ constructor(logger: LLDBDAPLogger, logFilePath: LogFilePathProvider, outputChannel: vscode.OutputChannel) {
super();
const lldbDapServer = new LLDBDapServer();
@@ -31,11 +31,11 @@ export class LLDBDapExtension extends DisposableContext {
sessionTracker,
vscode.debug.registerDebugConfigurationProvider(
"lldb-dap",
- new LLDBDapConfigurationProvider(lldbDapServer, logger),
+ new LLDBDapConfigurationProvider(lldbDapServer, logger, logFilePath),
),
vscode.debug.registerDebugAdapterDescriptorFactory(
"lldb-dap",
- new LLDBDapDescriptorFactory(logger),
+ new LLDBDapDescriptorFactory(logger, logFilePath),
),
vscode.debug.registerDebugAdapterTrackerFactory(
"lldb-dap",
@@ -61,8 +61,9 @@ export class LLDBDapExtension extends DisposableContext {
export async function activate(context: vscode.ExtensionContext) {
await vscode.workspace.fs.createDirectory(context.logUri);
const outputChannel = vscode.window.createOutputChannel("LLDB-DAP");
- const logger = new Logger((name) => path.join(context.logUri.fsPath, name), outputChannel);
+ const logFilePath: LogFilePathProvider = (name) => path.join(context.logUri.fsPath, name);
+ const logger = new LLDBDAPLogger(logFilePath("lldb-dap-extension.log"), outputChannel);
logger.info("LLDB-Dap extension activating...");
- context.subscriptions.push(new LLDBDapExtension(logger, outputChannel));
+ context.subscriptions.push(new LLDBDapExtension(logger, logFilePath, outputChannel));
logger.info("LLDB-Dap extension activated");
}
diff --git a/lldb/tools/lldb-dap/src-ts/logger.ts b/lldb/tools/lldb-dap/src-ts/logger.ts
index 971c63fa6610c..f15172dd84e5f 100644
--- a/lldb/tools/lldb-dap/src-ts/logger.ts
+++ b/lldb/tools/lldb-dap/src-ts/logger.ts
@@ -13,16 +13,25 @@ class OutputChannelTransport extends Transport {
}
}
-export class Logger implements vscode.Disposable {
+export type LogFilePathProvider = (name: string) => string;
+
+export interface Logger {
+ debug(message: string, ...args: any[]): void
+ error(error: string | Error, ...args: any[]): void
+ info(message: string, ...args: any[]): void
+ warn(message: string, ...args: any[]): void
+}
+
+export class LLDBDAPLogger implements vscode.Disposable {
private disposables: vscode.Disposable[] = [];
private logger: winston.Logger;
- constructor(public readonly logFilePath: (name: string) => string, ouptutChannel: vscode.OutputChannel) {
+ constructor(public readonly logFilePath: string, ouptutChannel: vscode.OutputChannel) {
const ouptutChannelTransport = new OutputChannelTransport(ouptutChannel);
ouptutChannelTransport.level = this.outputChannelLevel();
this.logger = winston.createLogger({
transports: [
- new winston.transports.File({ filename: logFilePath("lldb-dap-extension.log"), level: "debug" }), // File logging at the 'debug' level
+ new winston.transports.File({ filename: logFilePath, level: "debug" }), // File logging at the 'debug' level
ouptutChannelTransport
],
format: winston.format.combine(
@@ -48,24 +57,25 @@ export class Logger implements vscode.Disposable {
);
}
- debug(message: any) {
- this.logger.debug(this.normalizeMessage(message));
+ debug(message: string, ...args: any[]) {
+ this.logger.debug([message, ...args].map(m => this.normalizeMessage(m)).join(" "));
}
- info(message: any) {
- this.logger.info(this.normalizeMessage(message));
+ info(message: string, ...args: any[]) {
+ this.logger.info([message, ...args].map(m => this.normalizeMessage(m)).join(" "));
}
- warn(message: any) {
- this.logger.warn(this.normalizeMessage(message));
+ warn(message: string, ...args: any[]) {
+ this.logger.warn([message, ...args].map(m => this.normalizeMessage(m)).join(" "));
}
- error(message: any) {
+ error(message: Error | string, ...args: any[]) {
if (message instanceof Error) {
this.logger.error(message);
+ this.logger.error([...args].map(m => this.normalizeMessage(m)).join(" "));
return;
}
- this.logger.error(this.normalizeMessage(message));
+ this.logger.error([message, ...args].map(m => this.normalizeMessage(m)).join(" "));
}
private normalizeMessage(message: any) {
>From 0dc70d08d0882ec4ffbb5df7737f1a88bc8030d8 Mon Sep 17 00:00:00 2001
From: Adam Ward <award999 at apple.com>
Date: Tue, 29 Jul 2025 11:17:05 -0400
Subject: [PATCH 07/12] Fix issues when bundling
---
lldb/tools/lldb-dap/package-lock.json | 489 +++++++++++++++++++++++++-
lldb/tools/lldb-dap/package.json | 3 +-
lldb/tools/lldb-dap/src-ts/logger.ts | 5 +-
3 files changed, 493 insertions(+), 4 deletions(-)
diff --git a/lldb/tools/lldb-dap/package-lock.json b/lldb/tools/lldb-dap/package-lock.json
index f9f071ae7e41a..dbf94f372be89 100644
--- a/lldb/tools/lldb-dap/package-lock.json
+++ b/lldb/tools/lldb-dap/package-lock.json
@@ -1,18 +1,19 @@
{
"name": "lldb-dap",
- "version": "0.2.14",
+ "version": "0.2.15",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "lldb-dap",
- "version": "0.2.14",
+ "version": "0.2.15",
"license": "Apache 2.0 License with LLVM exceptions",
"devDependencies": {
"@types/node": "^18.19.41",
"@types/vscode": "1.75.0",
"@vscode/debugprotocol": "^1.68.0",
"@vscode/vsce": "^3.2.2",
+ "esbuild": "^0.25.8",
"prettier": "^3.4.2",
"prettier-plugin-curly": "^0.3.1",
"typescript": "^5.7.3",
@@ -342,6 +343,448 @@
"kuler": "^2.0.0"
}
},
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz",
+ "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.8.tgz",
+ "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz",
+ "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.8.tgz",
+ "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz",
+ "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz",
+ "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz",
+ "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz",
+ "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz",
+ "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz",
+ "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz",
+ "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz",
+ "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz",
+ "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz",
+ "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz",
+ "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz",
+ "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz",
+ "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz",
+ "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz",
+ "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz",
+ "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz",
+ "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz",
+ "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz",
+ "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz",
+ "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz",
+ "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz",
+ "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/@isaacs/cliui": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
@@ -1247,6 +1690,48 @@
"node": ">= 0.4"
}
},
+ "node_modules/esbuild": {
+ "version": "0.25.8",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz",
+ "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.8",
+ "@esbuild/android-arm": "0.25.8",
+ "@esbuild/android-arm64": "0.25.8",
+ "@esbuild/android-x64": "0.25.8",
+ "@esbuild/darwin-arm64": "0.25.8",
+ "@esbuild/darwin-x64": "0.25.8",
+ "@esbuild/freebsd-arm64": "0.25.8",
+ "@esbuild/freebsd-x64": "0.25.8",
+ "@esbuild/linux-arm": "0.25.8",
+ "@esbuild/linux-arm64": "0.25.8",
+ "@esbuild/linux-ia32": "0.25.8",
+ "@esbuild/linux-loong64": "0.25.8",
+ "@esbuild/linux-mips64el": "0.25.8",
+ "@esbuild/linux-ppc64": "0.25.8",
+ "@esbuild/linux-riscv64": "0.25.8",
+ "@esbuild/linux-s390x": "0.25.8",
+ "@esbuild/linux-x64": "0.25.8",
+ "@esbuild/netbsd-arm64": "0.25.8",
+ "@esbuild/netbsd-x64": "0.25.8",
+ "@esbuild/openbsd-arm64": "0.25.8",
+ "@esbuild/openbsd-x64": "0.25.8",
+ "@esbuild/openharmony-arm64": "0.25.8",
+ "@esbuild/sunos-x64": "0.25.8",
+ "@esbuild/win32-arm64": "0.25.8",
+ "@esbuild/win32-ia32": "0.25.8",
+ "@esbuild/win32-x64": "0.25.8"
+ }
+ },
"node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
diff --git a/lldb/tools/lldb-dap/package.json b/lldb/tools/lldb-dap/package.json
index fb49b430554e2..7c1ceca4b8f15 100644
--- a/lldb/tools/lldb-dap/package.json
+++ b/lldb/tools/lldb-dap/package.json
@@ -32,6 +32,7 @@
"@types/vscode": "1.75.0",
"@vscode/debugprotocol": "^1.68.0",
"@vscode/vsce": "^3.2.2",
+ "esbuild": "^0.25.8",
"prettier": "^3.4.2",
"prettier-plugin-curly": "^0.3.1",
"typescript": "^5.7.3",
@@ -44,7 +45,7 @@
],
"main": "./out/extension",
"scripts": {
- "vscode:prepublish": "tsc -p ./",
+ "vscode:prepublish": "esbuild src-ts/extension.ts --bundle --platform=node --external:vscode --minify --outfile=out/extension.js",
"watch": "tsc -watch -p ./",
"format": "npx prettier './src-ts/' --write",
"package": "vsce package --out ./out/lldb-dap.vsix",
diff --git a/lldb/tools/lldb-dap/src-ts/logger.ts b/lldb/tools/lldb-dap/src-ts/logger.ts
index f15172dd84e5f..39a8ebdd23e55 100644
--- a/lldb/tools/lldb-dap/src-ts/logger.ts
+++ b/lldb/tools/lldb-dap/src-ts/logger.ts
@@ -1,6 +1,9 @@
import * as vscode from "vscode";
import * as winston from "winston";
-import * as Transport from "winston-transport";
+import * as TransportType from "winston-transport";
+
+// Runtime error if don't use "require"
+const Transport: typeof TransportType = require("winston-transport");
class OutputChannelTransport extends Transport {
constructor(private readonly ouptutChannel: vscode.OutputChannel) {
>From ed7310a1316a7f6c65dd637fa3d69533f87eca26 Mon Sep 17 00:00:00 2001
From: Adam Ward <award999 at apple.com>
Date: Tue, 29 Jul 2025 11:34:35 -0400
Subject: [PATCH 08/12] Apply formatting
---
.../lldb-dap/src-ts/debug-adapter-factory.ts | 40 ++--
.../src-ts/debug-configuration-provider.ts | 20 +-
.../lldb-dap/src-ts/debug-session-tracker.ts | 6 +-
lldb/tools/lldb-dap/src-ts/extension.ts | 18 +-
lldb/tools/lldb-dap/src-ts/lldb-dap-server.ts | 2 +-
lldb/tools/lldb-dap/src-ts/logger.ts | 171 ++++++++++--------
6 files changed, 158 insertions(+), 99 deletions(-)
diff --git a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
index 8cc0340e9ef80..d974af157932a 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
@@ -164,13 +164,13 @@ async function getDAPArguments(
* @returns The formatted date.
*/
function formatDate(date: Date): string {
- const year = date.getFullYear().toString().padStart(4, "0");
- const month = (date.getMonth() + 1).toString().padStart(2, "0");
- const day = date.getDate().toString().padStart(2, "0");
- const hour = date.getHours().toString().padStart(2, "0");
- const minute = date.getMinutes().toString().padStart(2, "0");
- const seconds = date.getSeconds().toString().padStart(2, "0");
- return `${year}${month}${day}T${hour}${minute}${seconds}`;
+ const year = date.getFullYear().toString().padStart(4, "0");
+ const month = (date.getMonth() + 1).toString().padStart(2, "0");
+ const day = date.getDate().toString().padStart(2, "0");
+ const hour = date.getHours().toString().padStart(2, "0");
+ const minute = date.getMinutes().toString().padStart(2, "0");
+ const seconds = date.getSeconds().toString().padStart(2, "0");
+ return `${year}${month}${day}T${hour}${minute}${seconds}`;
}
/**
@@ -190,13 +190,19 @@ export async function createDebugAdapterExecutable(
workspaceFolder: vscode.WorkspaceFolder | undefined,
configuration: vscode.DebugConfiguration,
): Promise<vscode.DebugAdapterExecutable> {
- const config = vscode.workspace.workspaceFile ? vscode.workspace.getConfiguration("lldb-dap") : vscode.workspace.getConfiguration("lldb-dap", workspaceFolder);
+ const config = vscode.workspace.workspaceFile
+ ? vscode.workspace.getConfiguration("lldb-dap")
+ : vscode.workspace.getConfiguration("lldb-dap", workspaceFolder);
const log_path = config.get<string>("log-path");
let env: { [key: string]: string } = {};
if (log_path) {
env["LLDBDAP_LOG"] = log_path;
- } else if (vscode.workspace.getConfiguration("lldb-dap").get("verboseLogging", false)) {
- env["LLDBDAP_LOG"] = logFilePath(`lldb-dap-session-${formatDate(new Date())}.log`);
+ } else if (
+ vscode.workspace.getConfiguration("lldb-dap").get("verboseLogging", false)
+ ) {
+ env["LLDBDAP_LOG"] = logFilePath(
+ `lldb-dap-session-${formatDate(new Date())}.log`,
+ );
}
const configEnvironment =
config.get<{ [key: string]: string }>("environment") || {};
@@ -226,14 +232,20 @@ export async function createDebugAdapterExecutable(
export class LLDBDapDescriptorFactory
implements vscode.DebugAdapterDescriptorFactory
{
- constructor(private readonly logger: Logger, private logFilePath: LogFilePathProvider) {}
+ constructor(
+ private readonly logger: Logger,
+ private logFilePath: LogFilePathProvider,
+ ) {}
async createDebugAdapterDescriptor(
session: vscode.DebugSession,
executable: vscode.DebugAdapterExecutable | undefined,
): Promise<vscode.DebugAdapterDescriptor | undefined> {
this.logger.info(`Creating debug adapter for session "${session.name}"`);
- this.logger.debug(`Session "${session.name}" debug configuration:\n` + JSON.stringify(session.configuration, undefined, 2));
+ this.logger.debug(
+ `Session "${session.name}" debug configuration:\n` +
+ JSON.stringify(session.configuration, undefined, 2),
+ );
if (executable) {
const error = new Error(
"Setting the debug adapter executable in the package.json is not supported.",
@@ -244,7 +256,9 @@ export class LLDBDapDescriptorFactory
// Use a server connection if the debugAdapterPort is provided
if (session.configuration.debugAdapterPort) {
- this.logger.info(`Spawning debug adapter server on port ${session.configuration.debugAdapterPort}`);
+ this.logger.info(
+ `Spawning debug adapter server on port ${session.configuration.debugAdapterPort}`,
+ );
return new vscode.DebugAdapterServer(
session.configuration.debugAdapterPort,
session.configuration.debugAdapterHostname,
diff --git a/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts b/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts
index 46ce5aefc45ed..3eba4e0b08cef 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts
@@ -72,15 +72,24 @@ const configurations: Record<string, DefaultConfig> = {
export class LLDBDapConfigurationProvider
implements vscode.DebugConfigurationProvider
{
- constructor(private readonly server: LLDBDapServer, private readonly logger: Logger, private readonly logFilePath: LogFilePathProvider) {}
+ constructor(
+ private readonly server: LLDBDapServer,
+ private readonly logger: Logger,
+ private readonly logFilePath: LogFilePathProvider,
+ ) {}
async resolveDebugConfiguration(
folder: vscode.WorkspaceFolder | undefined,
debugConfiguration: vscode.DebugConfiguration,
token?: vscode.CancellationToken,
): Promise<vscode.DebugConfiguration> {
- this.logger.info(`Resolving debug configuration for "${debugConfiguration.name}"`);
- this.logger.debug("Initial debug configuration:\n" + JSON.stringify(debugConfiguration, undefined, 2));
+ this.logger.info(
+ `Resolving debug configuration for "${debugConfiguration.name}"`,
+ );
+ this.logger.debug(
+ "Initial debug configuration:\n" +
+ JSON.stringify(debugConfiguration, undefined, 2),
+ );
let config = vscode.workspace.getConfiguration("lldb-dap");
for (const [key, cfg] of Object.entries(configurations)) {
if (Reflect.has(debugConfiguration, key)) {
@@ -189,7 +198,10 @@ export class LLDBDapConfigurationProvider
}
}
- this.logger.debug("Resolved debug configuration:\n" + JSON.stringify(debugConfiguration, undefined, 2));
+ this.logger.debug(
+ "Resolved debug configuration:\n" +
+ JSON.stringify(debugConfiguration, undefined, 2),
+ );
return debugConfiguration;
} catch (error) {
diff --git a/lldb/tools/lldb-dap/src-ts/debug-session-tracker.ts b/lldb/tools/lldb-dap/src-ts/debug-session-tracker.ts
index a5424b6ce4ae8..67dd5c14e26a2 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-session-tracker.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-session-tracker.ts
@@ -69,7 +69,7 @@ export class DebugSessionTracker
return {
onError: (error) => !stopping && this.logger.error(error), // Can throw benign read errors when shutting down
onDidSendMessage: (message) => this.onDidSendMessage(session, message),
- onWillStopSession: () => stopping = true,
+ onWillStopSession: () => (stopping = true),
onExit: () => this.onExit(session),
};
}
@@ -144,7 +144,9 @@ export class DebugSessionTracker
// The vscode.DebugAdapterTracker#onExit event is sometimes called with
// exitCode = undefined but the exit event from LLDB-DAP always has the "exitCode"
const { exitCode } = message.body;
- this.logger.info(`Session "${session.name}" exited with code ${exitCode}`);
+ this.logger.info(
+ `Session "${session.name}" exited with code ${exitCode}`,
+ );
}
}
}
diff --git a/lldb/tools/lldb-dap/src-ts/extension.ts b/lldb/tools/lldb-dap/src-ts/extension.ts
index b30f86d770cf6..81f654596c614 100644
--- a/lldb/tools/lldb-dap/src-ts/extension.ts
+++ b/lldb/tools/lldb-dap/src-ts/extension.ts
@@ -18,7 +18,11 @@ import { LLDBDAPLogger, LogFilePathProvider } from "./logger";
* using it as as library should use this class as the main entry point.
*/
export class LLDBDapExtension extends DisposableContext {
- constructor(logger: LLDBDAPLogger, logFilePath: LogFilePathProvider, outputChannel: vscode.OutputChannel) {
+ constructor(
+ logger: LLDBDAPLogger,
+ logFilePath: LogFilePathProvider,
+ outputChannel: vscode.OutputChannel,
+ ) {
super();
const lldbDapServer = new LLDBDapServer();
@@ -61,9 +65,15 @@ export class LLDBDapExtension extends DisposableContext {
export async function activate(context: vscode.ExtensionContext) {
await vscode.workspace.fs.createDirectory(context.logUri);
const outputChannel = vscode.window.createOutputChannel("LLDB-DAP");
- const logFilePath: LogFilePathProvider = (name) => path.join(context.logUri.fsPath, name);
- const logger = new LLDBDAPLogger(logFilePath("lldb-dap-extension.log"), outputChannel);
+ const logFilePath: LogFilePathProvider = (name) =>
+ path.join(context.logUri.fsPath, name);
+ const logger = new LLDBDAPLogger(
+ logFilePath("lldb-dap-extension.log"),
+ outputChannel,
+ );
logger.info("LLDB-Dap extension activating...");
- context.subscriptions.push(new LLDBDapExtension(logger, logFilePath, outputChannel));
+ context.subscriptions.push(
+ new LLDBDapExtension(logger, logFilePath, outputChannel),
+ );
logger.info("LLDB-Dap extension activated");
}
diff --git a/lldb/tools/lldb-dap/src-ts/lldb-dap-server.ts b/lldb/tools/lldb-dap/src-ts/lldb-dap-server.ts
index 79573ec7342b1..03a0fc9d0fef3 100644
--- a/lldb/tools/lldb-dap/src-ts/lldb-dap-server.ts
+++ b/lldb/tools/lldb-dap/src-ts/lldb-dap-server.ts
@@ -26,7 +26,7 @@ export class LLDBDapServer implements vscode.Disposable {
args: string[],
options?: child_process.SpawnOptionsWithoutStdio,
): Promise<{ host: string; port: number } | undefined> {
- const dapArgs = [...args, "--connection", "listen://localhost:0" ];
+ const dapArgs = [...args, "--connection", "listen://localhost:0"];
if (!(await this.shouldContinueStartup(dapPath, dapArgs))) {
return undefined;
}
diff --git a/lldb/tools/lldb-dap/src-ts/logger.ts b/lldb/tools/lldb-dap/src-ts/logger.ts
index 39a8ebdd23e55..9b3624ecc6b43 100644
--- a/lldb/tools/lldb-dap/src-ts/logger.ts
+++ b/lldb/tools/lldb-dap/src-ts/logger.ts
@@ -6,98 +6,119 @@ import * as TransportType from "winston-transport";
const Transport: typeof TransportType = require("winston-transport");
class OutputChannelTransport extends Transport {
- constructor(private readonly ouptutChannel: vscode.OutputChannel) {
- super();
- }
+ constructor(private readonly ouptutChannel: vscode.OutputChannel) {
+ super();
+ }
- public log(info: any, next: () => void): void {
- this.ouptutChannel.appendLine(info[Symbol.for('message')]);
- next();
- }
+ public log(info: any, next: () => void): void {
+ this.ouptutChannel.appendLine(info[Symbol.for("message")]);
+ next();
+ }
}
export type LogFilePathProvider = (name: string) => string;
export interface Logger {
- debug(message: string, ...args: any[]): void
- error(error: string | Error, ...args: any[]): void
- info(message: string, ...args: any[]): void
- warn(message: string, ...args: any[]): void
+ debug(message: string, ...args: any[]): void;
+ error(error: string | Error, ...args: any[]): void;
+ info(message: string, ...args: any[]): void;
+ warn(message: string, ...args: any[]): void;
}
export class LLDBDAPLogger implements vscode.Disposable {
- private disposables: vscode.Disposable[] = [];
- private logger: winston.Logger;
+ private disposables: vscode.Disposable[] = [];
+ private logger: winston.Logger;
- constructor(public readonly logFilePath: string, ouptutChannel: vscode.OutputChannel) {
- const ouptutChannelTransport = new OutputChannelTransport(ouptutChannel);
- ouptutChannelTransport.level = this.outputChannelLevel();
- this.logger = winston.createLogger({
- transports: [
- new winston.transports.File({ filename: logFilePath, level: "debug" }), // File logging at the 'debug' level
- ouptutChannelTransport
- ],
- format: winston.format.combine(
- winston.format.errors({ stack: true }),
- winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss.SSS" }), // This is the format of `vscode.LogOutputChannel`
- winston.format.printf(msg => `${msg.timestamp} [${msg.level}] ${msg.message} ${msg.stack ? msg.stack : ''}`),
- ),
- });
- if (process.env.NODE_ENV !== 'production') {
- this.logger.add(new winston.transports.Console({
- level: "error"
- }));
- }
- this.disposables.push(
- {
- dispose: () => this.logger.close()
- },
- vscode.workspace.onDidChangeConfiguration(e => {
- if (e.affectsConfiguration("lldb-dap.verboseLogging")) {
- ouptutChannelTransport.level = this.outputChannelLevel();
- }
- })
- );
+ constructor(
+ public readonly logFilePath: string,
+ ouptutChannel: vscode.OutputChannel,
+ ) {
+ const ouptutChannelTransport = new OutputChannelTransport(ouptutChannel);
+ ouptutChannelTransport.level = this.outputChannelLevel();
+ this.logger = winston.createLogger({
+ transports: [
+ new winston.transports.File({ filename: logFilePath, level: "debug" }), // File logging at the 'debug' level
+ ouptutChannelTransport,
+ ],
+ format: winston.format.combine(
+ winston.format.errors({ stack: true }),
+ winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss.SSS" }), // This is the format of `vscode.LogOutputChannel`
+ winston.format.printf(
+ (msg) =>
+ `${msg.timestamp} [${msg.level}] ${msg.message} ${msg.stack ? msg.stack : ""}`,
+ ),
+ ),
+ });
+ if (process.env.NODE_ENV !== "production") {
+ this.logger.add(
+ new winston.transports.Console({
+ level: "error",
+ }),
+ );
}
+ this.disposables.push(
+ {
+ dispose: () => this.logger.close(),
+ },
+ vscode.workspace.onDidChangeConfiguration((e) => {
+ if (e.affectsConfiguration("lldb-dap.verboseLogging")) {
+ ouptutChannelTransport.level = this.outputChannelLevel();
+ }
+ }),
+ );
+ }
- debug(message: string, ...args: any[]) {
- this.logger.debug([message, ...args].map(m => this.normalizeMessage(m)).join(" "));
- }
+ debug(message: string, ...args: any[]) {
+ this.logger.debug(
+ [message, ...args].map((m) => this.normalizeMessage(m)).join(" "),
+ );
+ }
- info(message: string, ...args: any[]) {
- this.logger.info([message, ...args].map(m => this.normalizeMessage(m)).join(" "));
- }
+ info(message: string, ...args: any[]) {
+ this.logger.info(
+ [message, ...args].map((m) => this.normalizeMessage(m)).join(" "),
+ );
+ }
- warn(message: string, ...args: any[]) {
- this.logger.warn([message, ...args].map(m => this.normalizeMessage(m)).join(" "));
- }
+ warn(message: string, ...args: any[]) {
+ this.logger.warn(
+ [message, ...args].map((m) => this.normalizeMessage(m)).join(" "),
+ );
+ }
- error(message: Error | string, ...args: any[]) {
- if (message instanceof Error) {
- this.logger.error(message);
- this.logger.error([...args].map(m => this.normalizeMessage(m)).join(" "));
- return;
- }
- this.logger.error([message, ...args].map(m => this.normalizeMessage(m)).join(" "));
+ error(message: Error | string, ...args: any[]) {
+ if (message instanceof Error) {
+ this.logger.error(message);
+ this.logger.error(
+ [...args].map((m) => this.normalizeMessage(m)).join(" "),
+ );
+ return;
}
+ this.logger.error(
+ [message, ...args].map((m) => this.normalizeMessage(m)).join(" "),
+ );
+ }
- private normalizeMessage(message: any) {
- if (typeof message === "string") {
- return message;
- }
- try {
- return JSON.stringify(message);
- } catch (e) {
- return `${message}`;
- }
+ private normalizeMessage(message: any) {
+ if (typeof message === "string") {
+ return message;
}
-
- private outputChannelLevel(): string {
- return vscode.workspace.getConfiguration("lldb-dap").get("verboseLogging", false) ?
- "debug" : "info";
+ try {
+ return JSON.stringify(message);
+ } catch (e) {
+ return `${message}`;
}
+ }
- dispose() {
- this.disposables.forEach(d => d.dispose());
- }
-}
\ No newline at end of file
+ private outputChannelLevel(): string {
+ return vscode.workspace
+ .getConfiguration("lldb-dap")
+ .get("verboseLogging", false)
+ ? "debug"
+ : "info";
+ }
+
+ dispose() {
+ this.disposables.forEach((d) => d.dispose());
+ }
+}
>From e709ee19029344afd6f092db084b355bfa75c9de Mon Sep 17 00:00:00 2001
From: Adam Ward <award999 at apple.com>
Date: Thu, 31 Jul 2025 08:18:32 -0400
Subject: [PATCH 09/12] Use minimal LogOutputChannel approach instead
---
lldb/tools/lldb-dap/package-lock.json | 727 +-----------------
lldb/tools/lldb-dap/package.json | 7 +-
.../lldb-dap/src-ts/debug-adapter-factory.ts | 10 +-
.../src-ts/debug-configuration-provider.ts | 6 +-
.../lldb-dap/src-ts/debug-session-tracker.ts | 3 +-
lldb/tools/lldb-dap/src-ts/extension.ts | 19 +-
lldb/tools/lldb-dap/src-ts/logger.ts | 124 ---
lldb/tools/lldb-dap/src-ts/types.ts | 1 +
8 files changed, 26 insertions(+), 871 deletions(-)
delete mode 100644 lldb/tools/lldb-dap/src-ts/logger.ts
create mode 100644 lldb/tools/lldb-dap/src-ts/types.ts
diff --git a/lldb/tools/lldb-dap/package-lock.json b/lldb/tools/lldb-dap/package-lock.json
index dbf94f372be89..1969b196accc6 100644
--- a/lldb/tools/lldb-dap/package-lock.json
+++ b/lldb/tools/lldb-dap/package-lock.json
@@ -13,12 +13,9 @@
"@types/vscode": "1.75.0",
"@vscode/debugprotocol": "^1.68.0",
"@vscode/vsce": "^3.2.2",
- "esbuild": "^0.25.8",
"prettier": "^3.4.2",
"prettier-plugin-curly": "^0.3.1",
- "typescript": "^5.7.3",
- "winston": "^3.17.0",
- "winston-transport": "^4.9.0"
+ "typescript": "^5.7.3"
},
"engines": {
"vscode": "^1.75.0"
@@ -321,470 +318,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@colors/colors": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz",
- "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.1.90"
- }
- },
- "node_modules/@dabh/diagnostics": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
- "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "colorspace": "1.1.x",
- "enabled": "2.0.x",
- "kuler": "^2.0.0"
- }
- },
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz",
- "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "aix"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-arm": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.8.tgz",
- "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-arm64": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz",
- "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-x64": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.8.tgz",
- "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz",
- "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz",
- "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz",
- "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz",
- "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-arm": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz",
- "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz",
- "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz",
- "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz",
- "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz",
- "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==",
- "cpu": [
- "mips64el"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz",
- "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz",
- "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz",
- "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-x64": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz",
- "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-arm64": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz",
- "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz",
- "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openbsd-arm64": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz",
- "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz",
- "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openharmony-arm64": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz",
- "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz",
- "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz",
- "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz",
- "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-x64": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz",
- "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/@isaacs/cliui": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
@@ -866,13 +399,6 @@
"undici-types": "~5.26.4"
}
},
- "node_modules/@types/triple-beam": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz",
- "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@types/vscode": {
"version": "1.75.0",
"resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.75.0.tgz",
@@ -1116,13 +642,6 @@
"dev": true,
"license": "Python-2.0"
},
- "node_modules/async": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
- "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -1339,17 +858,6 @@
"node": ">=16"
}
},
- "node_modules/color": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
- "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^1.9.3",
- "color-string": "^1.6.0"
- }
- },
"node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
@@ -1365,28 +873,6 @@
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"dev": true
},
- "node_modules/color-string": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
- "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-name": "^1.0.0",
- "simple-swizzle": "^0.2.2"
- }
- },
- "node_modules/colorspace": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
- "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color": "^3.1.3",
- "text-hex": "1.0.x"
- }
- },
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -1628,13 +1114,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/enabled": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
- "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/end-of-stream": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
@@ -1690,48 +1169,6 @@
"node": ">= 0.4"
}
},
- "node_modules/esbuild": {
- "version": "0.25.8",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz",
- "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=18"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.25.8",
- "@esbuild/android-arm": "0.25.8",
- "@esbuild/android-arm64": "0.25.8",
- "@esbuild/android-x64": "0.25.8",
- "@esbuild/darwin-arm64": "0.25.8",
- "@esbuild/darwin-x64": "0.25.8",
- "@esbuild/freebsd-arm64": "0.25.8",
- "@esbuild/freebsd-x64": "0.25.8",
- "@esbuild/linux-arm": "0.25.8",
- "@esbuild/linux-arm64": "0.25.8",
- "@esbuild/linux-ia32": "0.25.8",
- "@esbuild/linux-loong64": "0.25.8",
- "@esbuild/linux-mips64el": "0.25.8",
- "@esbuild/linux-ppc64": "0.25.8",
- "@esbuild/linux-riscv64": "0.25.8",
- "@esbuild/linux-s390x": "0.25.8",
- "@esbuild/linux-x64": "0.25.8",
- "@esbuild/netbsd-arm64": "0.25.8",
- "@esbuild/netbsd-x64": "0.25.8",
- "@esbuild/openbsd-arm64": "0.25.8",
- "@esbuild/openbsd-x64": "0.25.8",
- "@esbuild/openharmony-arm64": "0.25.8",
- "@esbuild/sunos-x64": "0.25.8",
- "@esbuild/win32-arm64": "0.25.8",
- "@esbuild/win32-ia32": "0.25.8",
- "@esbuild/win32-x64": "0.25.8"
- }
- },
"node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -1770,20 +1207,6 @@
"pend": "~1.2.0"
}
},
- "node_modules/fecha": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
- "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fn.name": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
- "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/foreground-child": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
@@ -2071,7 +1494,8 @@
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
+ "dev": true,
+ "optional": true
},
"node_modules/ini": {
"version": "1.3.8",
@@ -2080,13 +1504,6 @@
"dev": true,
"optional": true
},
- "node_modules/is-arrayish": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
- "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/is-docker": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
@@ -2113,19 +1530,6 @@
"node": ">=8"
}
},
- "node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/is-wsl": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
@@ -2269,13 +1673,6 @@
"prebuild-install": "^7.0.1"
}
},
- "node_modules/kuler": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
- "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/leven": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@@ -2344,24 +1741,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/logform": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz",
- "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@colors/colors": "1.6.0",
- "@types/triple-beam": "^1.3.2",
- "fecha": "^4.2.0",
- "ms": "^2.1.1",
- "safe-stable-stringify": "^2.3.1",
- "triple-beam": "^1.3.0"
- },
- "engines": {
- "node": ">= 12.0.0"
- }
- },
"node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -2572,16 +1951,6 @@
"wrappy": "1"
}
},
- "node_modules/one-time": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
- "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fn.name": "1.x.x"
- }
- },
"node_modules/open": {
"version": "8.4.2",
"resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
@@ -2831,6 +2200,7 @@
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"dev": true,
+ "optional": true,
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -2860,16 +2230,6 @@
}
]
},
- "node_modules/safe-stable-stringify": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz",
- "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/sax": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz",
@@ -3050,26 +2410,6 @@
"simple-concat": "^1.0.0"
}
},
- "node_modules/simple-swizzle": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
- "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-arrayish": "^0.3.1"
- }
- },
- "node_modules/stack-trace": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
- "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "*"
- }
- },
"node_modules/stoppable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz",
@@ -3086,6 +2426,7 @@
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"dev": true,
+ "optional": true,
"dependencies": {
"safe-buffer": "~5.2.0"
}
@@ -3246,13 +2587,6 @@
"node": ">=6"
}
},
- "node_modules/text-hex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
- "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/tmp": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
@@ -3263,16 +2597,6 @@
"node": ">=14.14"
}
},
- "node_modules/triple-beam": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz",
- "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 14.0.0"
- }
- },
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
@@ -3359,7 +2683,8 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true
+ "dev": true,
+ "optional": true
},
"node_modules/uuid": {
"version": "8.3.2",
@@ -3387,44 +2712,6 @@
"node": ">= 8"
}
},
- "node_modules/winston": {
- "version": "3.17.0",
- "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz",
- "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@colors/colors": "^1.6.0",
- "@dabh/diagnostics": "^2.0.2",
- "async": "^3.2.3",
- "is-stream": "^2.0.0",
- "logform": "^2.7.0",
- "one-time": "^1.0.0",
- "readable-stream": "^3.4.0",
- "safe-stable-stringify": "^2.3.1",
- "stack-trace": "0.0.x",
- "triple-beam": "^1.3.0",
- "winston-transport": "^4.9.0"
- },
- "engines": {
- "node": ">= 12.0.0"
- }
- },
- "node_modules/winston-transport": {
- "version": "4.9.0",
- "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz",
- "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "logform": "^2.7.0",
- "readable-stream": "^3.6.2",
- "triple-beam": "^1.3.0"
- },
- "engines": {
- "node": ">= 12.0.0"
- }
- },
"node_modules/wrap-ansi": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
diff --git a/lldb/tools/lldb-dap/package.json b/lldb/tools/lldb-dap/package.json
index 7c1ceca4b8f15..a11694fb89cb4 100644
--- a/lldb/tools/lldb-dap/package.json
+++ b/lldb/tools/lldb-dap/package.json
@@ -32,12 +32,9 @@
"@types/vscode": "1.75.0",
"@vscode/debugprotocol": "^1.68.0",
"@vscode/vsce": "^3.2.2",
- "esbuild": "^0.25.8",
"prettier": "^3.4.2",
"prettier-plugin-curly": "^0.3.1",
- "typescript": "^5.7.3",
- "winston": "^3.17.0",
- "winston-transport": "^4.9.0"
+ "typescript": "^5.7.3"
},
"activationEvents": [
"onDebug",
@@ -45,7 +42,7 @@
],
"main": "./out/extension",
"scripts": {
- "vscode:prepublish": "esbuild src-ts/extension.ts --bundle --platform=node --external:vscode --minify --outfile=out/extension.js",
+ "vscode:prepublish": "tsc -p ./",
"watch": "tsc -watch -p ./",
"format": "npx prettier './src-ts/' --write",
"package": "vsce package --out ./out/lldb-dap.vsix",
diff --git a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
index d974af157932a..cc09073bf5c15 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
@@ -5,7 +5,7 @@ import * as child_process from "child_process";
import * as fs from "node:fs/promises";
import { ConfigureButton, OpenSettingsButton } from "./ui/show-error-message";
import { ErrorWithNotification } from "./ui/error-with-notification";
-import { LogFilePathProvider, Logger } from "./logger";
+import { LogFilePathProvider } from "./types";
const exec = util.promisify(child_process.execFile);
@@ -177,7 +177,7 @@ function formatDate(date: Date): string {
* Creates a new {@link vscode.DebugAdapterExecutable} based on the provided workspace folder and
* debug configuration. Assumes that the given debug configuration is for a local launch of lldb-dap.
*
- * @param logger The {@link Logger} to get default session log location
+ * @param logger The {@link vscode.LogOutputChannel} to log setup diagnostics
* @param logFilePath The {@link LogFilePathProvider} for determining where to put session logs
* @param workspaceFolder The {@link vscode.WorkspaceFolder} that the debug session will be launched within
* @param configuration The {@link vscode.DebugConfiguration} that will be launched
@@ -185,7 +185,7 @@ function formatDate(date: Date): string {
* @returns The {@link vscode.DebugAdapterExecutable} that can be used to launch lldb-dap
*/
export async function createDebugAdapterExecutable(
- logger: Logger,
+ logger: vscode.LogOutputChannel,
logFilePath: LogFilePathProvider,
workspaceFolder: vscode.WorkspaceFolder | undefined,
configuration: vscode.DebugConfiguration,
@@ -233,7 +233,7 @@ export class LLDBDapDescriptorFactory
implements vscode.DebugAdapterDescriptorFactory
{
constructor(
- private readonly logger: Logger,
+ private readonly logger: vscode.LogOutputChannel,
private logFilePath: LogFilePathProvider,
) {}
@@ -242,7 +242,7 @@ export class LLDBDapDescriptorFactory
executable: vscode.DebugAdapterExecutable | undefined,
): Promise<vscode.DebugAdapterDescriptor | undefined> {
this.logger.info(`Creating debug adapter for session "${session.name}"`);
- this.logger.debug(
+ this.logger.info(
`Session "${session.name}" debug configuration:\n` +
JSON.stringify(session.configuration, undefined, 2),
);
diff --git a/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts b/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts
index 3eba4e0b08cef..5ba205ada6fc9 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts
@@ -5,7 +5,7 @@ import { LLDBDapServer } from "./lldb-dap-server";
import { createDebugAdapterExecutable } from "./debug-adapter-factory";
import { ConfigureButton, showErrorMessage } from "./ui/show-error-message";
import { ErrorWithNotification } from "./ui/error-with-notification";
-import { LogFilePathProvider, Logger } from "./logger";
+import { LogFilePathProvider } from "./types";
const exec = util.promisify(child_process.execFile);
@@ -74,7 +74,7 @@ export class LLDBDapConfigurationProvider
{
constructor(
private readonly server: LLDBDapServer,
- private readonly logger: Logger,
+ private readonly logger: vscode.LogOutputChannel,
private readonly logFilePath: LogFilePathProvider,
) {}
@@ -198,7 +198,7 @@ export class LLDBDapConfigurationProvider
}
}
- this.logger.debug(
+ this.logger.info(
"Resolved debug configuration:\n" +
JSON.stringify(debugConfiguration, undefined, 2),
);
diff --git a/lldb/tools/lldb-dap/src-ts/debug-session-tracker.ts b/lldb/tools/lldb-dap/src-ts/debug-session-tracker.ts
index 67dd5c14e26a2..4cffaef41e811 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-session-tracker.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-session-tracker.ts
@@ -1,6 +1,5 @@
import { DebugProtocol } from "@vscode/debugprotocol";
import * as vscode from "vscode";
-import { Logger } from "./logger";
/** A helper type for mapping event types to their corresponding data type. */
// prettier-ignore
@@ -49,7 +48,7 @@ export class DebugSessionTracker
onDidChangeModules: vscode.Event<vscode.DebugSession | undefined> =
this.modulesChanged.event;
- constructor(private logger: Logger) {
+ constructor(private logger: vscode.LogOutputChannel) {
this.onDidChangeModules(this.moduleChangedListener, this);
vscode.debug.onDidChangeActiveDebugSession((session) =>
this.modulesChanged.fire(session),
diff --git a/lldb/tools/lldb-dap/src-ts/extension.ts b/lldb/tools/lldb-dap/src-ts/extension.ts
index 81f654596c614..84c17a43ee28f 100644
--- a/lldb/tools/lldb-dap/src-ts/extension.ts
+++ b/lldb/tools/lldb-dap/src-ts/extension.ts
@@ -11,7 +11,7 @@ import {
ModulesDataProvider,
ModuleProperty,
} from "./ui/modules-data-provider";
-import { LLDBDAPLogger, LogFilePathProvider } from "./logger";
+import { LogFilePathProvider } from "./types";
/**
* This class represents the extension and manages its life cycle. Other extensions
@@ -19,7 +19,7 @@ import { LLDBDAPLogger, LogFilePathProvider } from "./logger";
*/
export class LLDBDapExtension extends DisposableContext {
constructor(
- logger: LLDBDAPLogger,
+ logger: vscode.LogOutputChannel,
logFilePath: LogFilePathProvider,
outputChannel: vscode.OutputChannel,
) {
@@ -63,17 +63,12 @@ export class LLDBDapExtension extends DisposableContext {
* This is the entry point when initialized by VS Code.
*/
export async function activate(context: vscode.ExtensionContext) {
- await vscode.workspace.fs.createDirectory(context.logUri);
- const outputChannel = vscode.window.createOutputChannel("LLDB-DAP");
- const logFilePath: LogFilePathProvider = (name) =>
+ const outputChannel = vscode.window.createOutputChannel("LLDB-DAP", { log: true });
+ const logFilePath: LogFilePathProvider = (name: string) =>
path.join(context.logUri.fsPath, name);
- const logger = new LLDBDAPLogger(
- logFilePath("lldb-dap-extension.log"),
- outputChannel,
- );
- logger.info("LLDB-Dap extension activating...");
+ outputChannel.info("LLDB-Dap extension activating...");
context.subscriptions.push(
- new LLDBDapExtension(logger, logFilePath, outputChannel),
+ new LLDBDapExtension(outputChannel, logFilePath, outputChannel),
);
- logger.info("LLDB-Dap extension activated");
+ outputChannel.info("LLDB-Dap extension activated");
}
diff --git a/lldb/tools/lldb-dap/src-ts/logger.ts b/lldb/tools/lldb-dap/src-ts/logger.ts
deleted file mode 100644
index 9b3624ecc6b43..0000000000000
--- a/lldb/tools/lldb-dap/src-ts/logger.ts
+++ /dev/null
@@ -1,124 +0,0 @@
-import * as vscode from "vscode";
-import * as winston from "winston";
-import * as TransportType from "winston-transport";
-
-// Runtime error if don't use "require"
-const Transport: typeof TransportType = require("winston-transport");
-
-class OutputChannelTransport extends Transport {
- constructor(private readonly ouptutChannel: vscode.OutputChannel) {
- super();
- }
-
- public log(info: any, next: () => void): void {
- this.ouptutChannel.appendLine(info[Symbol.for("message")]);
- next();
- }
-}
-
-export type LogFilePathProvider = (name: string) => string;
-
-export interface Logger {
- debug(message: string, ...args: any[]): void;
- error(error: string | Error, ...args: any[]): void;
- info(message: string, ...args: any[]): void;
- warn(message: string, ...args: any[]): void;
-}
-
-export class LLDBDAPLogger implements vscode.Disposable {
- private disposables: vscode.Disposable[] = [];
- private logger: winston.Logger;
-
- constructor(
- public readonly logFilePath: string,
- ouptutChannel: vscode.OutputChannel,
- ) {
- const ouptutChannelTransport = new OutputChannelTransport(ouptutChannel);
- ouptutChannelTransport.level = this.outputChannelLevel();
- this.logger = winston.createLogger({
- transports: [
- new winston.transports.File({ filename: logFilePath, level: "debug" }), // File logging at the 'debug' level
- ouptutChannelTransport,
- ],
- format: winston.format.combine(
- winston.format.errors({ stack: true }),
- winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss.SSS" }), // This is the format of `vscode.LogOutputChannel`
- winston.format.printf(
- (msg) =>
- `${msg.timestamp} [${msg.level}] ${msg.message} ${msg.stack ? msg.stack : ""}`,
- ),
- ),
- });
- if (process.env.NODE_ENV !== "production") {
- this.logger.add(
- new winston.transports.Console({
- level: "error",
- }),
- );
- }
- this.disposables.push(
- {
- dispose: () => this.logger.close(),
- },
- vscode.workspace.onDidChangeConfiguration((e) => {
- if (e.affectsConfiguration("lldb-dap.verboseLogging")) {
- ouptutChannelTransport.level = this.outputChannelLevel();
- }
- }),
- );
- }
-
- debug(message: string, ...args: any[]) {
- this.logger.debug(
- [message, ...args].map((m) => this.normalizeMessage(m)).join(" "),
- );
- }
-
- info(message: string, ...args: any[]) {
- this.logger.info(
- [message, ...args].map((m) => this.normalizeMessage(m)).join(" "),
- );
- }
-
- warn(message: string, ...args: any[]) {
- this.logger.warn(
- [message, ...args].map((m) => this.normalizeMessage(m)).join(" "),
- );
- }
-
- error(message: Error | string, ...args: any[]) {
- if (message instanceof Error) {
- this.logger.error(message);
- this.logger.error(
- [...args].map((m) => this.normalizeMessage(m)).join(" "),
- );
- return;
- }
- this.logger.error(
- [message, ...args].map((m) => this.normalizeMessage(m)).join(" "),
- );
- }
-
- private normalizeMessage(message: any) {
- if (typeof message === "string") {
- return message;
- }
- try {
- return JSON.stringify(message);
- } catch (e) {
- return `${message}`;
- }
- }
-
- private outputChannelLevel(): string {
- return vscode.workspace
- .getConfiguration("lldb-dap")
- .get("verboseLogging", false)
- ? "debug"
- : "info";
- }
-
- dispose() {
- this.disposables.forEach((d) => d.dispose());
- }
-}
diff --git a/lldb/tools/lldb-dap/src-ts/types.ts b/lldb/tools/lldb-dap/src-ts/types.ts
new file mode 100644
index 0000000000000..e070a7e0e3eb4
--- /dev/null
+++ b/lldb/tools/lldb-dap/src-ts/types.ts
@@ -0,0 +1 @@
+export type LogFilePathProvider = (name: string) => string;
\ No newline at end of file
>From ca7fd1014fedf061e7187b5f1b215386e50858ea Mon Sep 17 00:00:00 2001
From: Adam Ward <award999 at apple.com>
Date: Thu, 31 Jul 2025 08:36:19 -0400
Subject: [PATCH 10/12] Rename "verboseLogging" setting to "captureSessionLogs"
---
lldb/tools/lldb-dap/package.json | 4 ++--
lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts | 2 +-
lldb/tools/lldb-dap/src-ts/types.ts | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/lldb/tools/lldb-dap/package.json b/lldb/tools/lldb-dap/package.json
index a11694fb89cb4..f367f4d73f3c9 100644
--- a/lldb/tools/lldb-dap/package.json
+++ b/lldb/tools/lldb-dap/package.json
@@ -111,9 +111,9 @@
"type": "string"
}
},
- "lldb-dap.verboseLogging": {
+ "lldb-dap.captureSessionLogs": {
"type": "boolean",
- "description": "Enable verbose logging to the \"LLDB-DAP\" output channel for the running debug session. Also will write LLDB-DAP session logs to the Extension's log folder if the `lldb-dap.log-path` setting is not explicitly set.",
+ "description": "When enabled, LLDB-DAP session logs will be written to the Extension's log folder if the `lldb-dap.log-path` setting is not explicitly set.",
"default": false
}
}
diff --git a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
index cc09073bf5c15..5e317e5b63043 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
@@ -198,7 +198,7 @@ export async function createDebugAdapterExecutable(
if (log_path) {
env["LLDBDAP_LOG"] = log_path;
} else if (
- vscode.workspace.getConfiguration("lldb-dap").get("verboseLogging", false)
+ vscode.workspace.getConfiguration("lldb-dap").get("captureSessionLogs", false)
) {
env["LLDBDAP_LOG"] = logFilePath(
`lldb-dap-session-${formatDate(new Date())}.log`,
diff --git a/lldb/tools/lldb-dap/src-ts/types.ts b/lldb/tools/lldb-dap/src-ts/types.ts
index e070a7e0e3eb4..0e3fde6f70dcd 100644
--- a/lldb/tools/lldb-dap/src-ts/types.ts
+++ b/lldb/tools/lldb-dap/src-ts/types.ts
@@ -1 +1 @@
-export type LogFilePathProvider = (name: string) => string;
\ No newline at end of file
+export type LogFilePathProvider = (name: string) => string;
>From d0b9ec732b6e1d53bdb5b0a31dce25325683758f Mon Sep 17 00:00:00 2001
From: Adam Ward <award999 at apple.com>
Date: Fri, 1 Aug 2025 09:53:17 -0400
Subject: [PATCH 11/12] Deprecate `lldb-dap.log-path` setting in favour of
`lldb-dap.logFolder`
---
lldb/tools/lldb-dap/package.json | 8 ++-
.../lldb-dap/src-ts/debug-adapter-factory.ts | 24 +------
.../src-ts/debug-configuration-provider.ts | 2 +-
lldb/tools/lldb-dap/src-ts/extension.ts | 9 ++-
lldb/tools/lldb-dap/src-ts/logging.ts | 67 +++++++++++++++++++
lldb/tools/lldb-dap/src-ts/types.ts | 1 -
6 files changed, 82 insertions(+), 29 deletions(-)
create mode 100644 lldb/tools/lldb-dap/src-ts/logging.ts
delete mode 100644 lldb/tools/lldb-dap/src-ts/types.ts
diff --git a/lldb/tools/lldb-dap/package.json b/lldb/tools/lldb-dap/package.json
index f367f4d73f3c9..fa2d4daffaf27 100644
--- a/lldb/tools/lldb-dap/package.json
+++ b/lldb/tools/lldb-dap/package.json
@@ -81,10 +81,16 @@
"description": "The path to the lldb-dap binary, e.g. /usr/local/bin/lldb-dap"
},
"lldb-dap.log-path": {
+ "scope": "machine-overridable",
+ "type": "string",
+ "description": "The log path for lldb-dap (if any)",
+ "markdownDeprecationMessage": "Use the `#lldb-dap.logFolder#` setting instead"
+ },
+ "lldb-dap.logFolder": {
"order": 0,
"scope": "machine-overridable",
"type": "string",
- "description": "The log path for lldb-dap (if any)"
+ "markdownDescription": "The folder to persist lldb-dap logs. If no value is provided, logs will be persisted in the [Extension Logs Folder](command:workbench.action.openExtensionLogsFolder)."
},
"lldb-dap.serverMode": {
"order": 0,
diff --git a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
index 5e317e5b63043..6e94400b09155 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts
@@ -5,7 +5,7 @@ import * as child_process from "child_process";
import * as fs from "node:fs/promises";
import { ConfigureButton, OpenSettingsButton } from "./ui/show-error-message";
import { ErrorWithNotification } from "./ui/error-with-notification";
-import { LogFilePathProvider } from "./types";
+import { LogFilePathProvider, LogType } from "./logging";
const exec = util.promisify(child_process.execFile);
@@ -157,22 +157,6 @@ async function getDAPArguments(
.get<string[]>("arguments", []);
}
-/**
- * Formats the given date as a string in the form "YYYYMMddTHHMMSS".
- *
- * @param date The date to format as a string.
- * @returns The formatted date.
- */
-function formatDate(date: Date): string {
- const year = date.getFullYear().toString().padStart(4, "0");
- const month = (date.getMonth() + 1).toString().padStart(2, "0");
- const day = date.getDate().toString().padStart(2, "0");
- const hour = date.getHours().toString().padStart(2, "0");
- const minute = date.getMinutes().toString().padStart(2, "0");
- const seconds = date.getSeconds().toString().padStart(2, "0");
- return `${year}${month}${day}T${hour}${minute}${seconds}`;
-}
-
/**
* Creates a new {@link vscode.DebugAdapterExecutable} based on the provided workspace folder and
* debug configuration. Assumes that the given debug configuration is for a local launch of lldb-dap.
@@ -200,9 +184,7 @@ export async function createDebugAdapterExecutable(
} else if (
vscode.workspace.getConfiguration("lldb-dap").get("captureSessionLogs", false)
) {
- env["LLDBDAP_LOG"] = logFilePath(
- `lldb-dap-session-${formatDate(new Date())}.log`,
- );
+ env["LLDBDAP_LOG"] = logFilePath.get(LogType.DEBUG_SESSION);
}
const configEnvironment =
config.get<{ [key: string]: string }>("environment") || {};
@@ -220,7 +202,7 @@ export async function createDebugAdapterExecutable(
logger.info(`lldb-dap path: ${dapPath}`);
logger.info(`lldb-dap args: ${dbgArgs}`);
logger.info(`cwd: ${dbgOptions.cwd}`);
- logger.info(`env: ${JSON.stringify(configEnvironment)}`);
+ logger.info(`env: ${JSON.stringify(dbgOptions.env)}`);
return new vscode.DebugAdapterExecutable(dapPath, dbgArgs, dbgOptions);
}
diff --git a/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts b/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts
index 5ba205ada6fc9..8c04ec2bdc9d3 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-configuration-provider.ts
@@ -5,7 +5,7 @@ import { LLDBDapServer } from "./lldb-dap-server";
import { createDebugAdapterExecutable } from "./debug-adapter-factory";
import { ConfigureButton, showErrorMessage } from "./ui/show-error-message";
import { ErrorWithNotification } from "./ui/error-with-notification";
-import { LogFilePathProvider } from "./types";
+import { LogFilePathProvider } from "./logging";
const exec = util.promisify(child_process.execFile);
diff --git a/lldb/tools/lldb-dap/src-ts/extension.ts b/lldb/tools/lldb-dap/src-ts/extension.ts
index 84c17a43ee28f..4b7a35e6944c6 100644
--- a/lldb/tools/lldb-dap/src-ts/extension.ts
+++ b/lldb/tools/lldb-dap/src-ts/extension.ts
@@ -11,7 +11,7 @@ import {
ModulesDataProvider,
ModuleProperty,
} from "./ui/modules-data-provider";
-import { LogFilePathProvider } from "./types";
+import { LogFilePathProvider } from "./logging";
/**
* This class represents the extension and manages its life cycle. Other extensions
@@ -64,11 +64,10 @@ export class LLDBDapExtension extends DisposableContext {
*/
export async function activate(context: vscode.ExtensionContext) {
const outputChannel = vscode.window.createOutputChannel("LLDB-DAP", { log: true });
- const logFilePath: LogFilePathProvider = (name: string) =>
- path.join(context.logUri.fsPath, name);
- outputChannel.info("LLDB-Dap extension activating...");
+ outputChannel.info("LLDB-DAP extension activating...");
+ const logFilePath = new LogFilePathProvider(context, outputChannel);
context.subscriptions.push(
new LLDBDapExtension(outputChannel, logFilePath, outputChannel),
);
- outputChannel.info("LLDB-Dap extension activated");
+ outputChannel.info("LLDB-DAP extension activated");
}
diff --git a/lldb/tools/lldb-dap/src-ts/logging.ts b/lldb/tools/lldb-dap/src-ts/logging.ts
new file mode 100644
index 0000000000000..3b1c3c37ce1ce
--- /dev/null
+++ b/lldb/tools/lldb-dap/src-ts/logging.ts
@@ -0,0 +1,67 @@
+import * as path from "path";
+import * as vscode from "vscode";
+
+/**
+ * Formats the given date as a string in the form "YYYYMMddTHHMMSS".
+ *
+ * @param date The date to format as a string.
+ * @returns The formatted date.
+ */
+function formatDate(date: Date): string {
+ const year = date.getFullYear().toString().padStart(4, "0");
+ const month = (date.getMonth() + 1).toString().padStart(2, "0");
+ const day = date.getDate().toString().padStart(2, "0");
+ const hour = date.getHours().toString().padStart(2, "0");
+ const minute = date.getMinutes().toString().padStart(2, "0");
+ const seconds = date.getSeconds().toString().padStart(2, "0");
+ return `${year}${month}${day}T${hour}${minute}${seconds}`;
+}
+
+export enum LogType {
+ DEBUG_SESSION,
+}
+
+export class LogFilePathProvider {
+ private logFolder: string = "";
+
+ constructor(
+ private context: vscode.ExtensionContext,
+ private logger: vscode.LogOutputChannel,
+ ) {
+ this.updateLogFolder();
+ context.subscriptions.push(
+ vscode.workspace.onDidChangeConfiguration(e => {
+ if (
+ e.affectsConfiguration("lldb-dap.logFolder")
+ ) {
+ this.updateLogFolder();
+ }
+ })
+ );
+ }
+
+ get(type: LogType): string {
+ const logFolder = this.logFolder || this.context.logUri.fsPath;
+ switch(type) {
+ case LogType.DEBUG_SESSION:
+ return path.join(logFolder, `lldb-dap-session-${formatDate(new Date())}.log`);
+ break;
+ }
+ }
+
+ private updateLogFolder() {
+ const config = vscode.workspace.getConfiguration("lldb-dap");
+ let logFolder =
+ config.get<string>("logFolder") || this.context.logUri.fsPath;
+ vscode.workspace.fs
+ .createDirectory(vscode.Uri.file(logFolder))
+ .then(undefined, (error) => {
+ this.logger.error(`Failed to create log folder ${logFolder}: ${error}`);
+ logFolder = this.context.logUri.fsPath;
+ })
+ .then(() => {
+ this.logFolder = logFolder;
+ this.logger.info(`Persisting lldb-dap logs to ${logFolder}`);
+ });
+ }
+}
diff --git a/lldb/tools/lldb-dap/src-ts/types.ts b/lldb/tools/lldb-dap/src-ts/types.ts
deleted file mode 100644
index 0e3fde6f70dcd..0000000000000
--- a/lldb/tools/lldb-dap/src-ts/types.ts
+++ /dev/null
@@ -1 +0,0 @@
-export type LogFilePathProvider = (name: string) => string;
>From 968b5820a12eb60ae61e17e429403b6cd4982efe Mon Sep 17 00:00:00 2001
From: award999 <award999 at apple.com>
Date: Fri, 1 Aug 2025 13:53:22 -0400
Subject: [PATCH 12/12] Update
lldb/tools/lldb-dap/src-ts/debug-session-tracker.ts
Co-authored-by: Jonas Devlieghere <jonas at devlieghere.com>
---
lldb/tools/lldb-dap/src-ts/debug-session-tracker.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lldb/tools/lldb-dap/src-ts/debug-session-tracker.ts b/lldb/tools/lldb-dap/src-ts/debug-session-tracker.ts
index 4cffaef41e811..7d7f73dbff92d 100644
--- a/lldb/tools/lldb-dap/src-ts/debug-session-tracker.ts
+++ b/lldb/tools/lldb-dap/src-ts/debug-session-tracker.ts
@@ -66,7 +66,7 @@ export class DebugSessionTracker
this.logger.info(`Starting debug session "${session.name}"`);
let stopping = false;
return {
- onError: (error) => !stopping && this.logger.error(error), // Can throw benign read errors when shutting down
+ onError: (error) => !stopping && this.logger.error(error), // Can throw benign read errors when shutting down.
onDidSendMessage: (message) => this.onDidSendMessage(session, message),
onWillStopSession: () => (stopping = true),
onExit: () => this.onExit(session),
More information about the lldb-commits
mailing list