Compare commits
66
Commits
localization
...
v1.20.5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
03933b0a74 | ||
|
|
fc8eb8632f | ||
|
|
f6722bc8ff | ||
|
|
894db52405 | ||
|
|
abf384619d | ||
|
|
fd482d2169 | ||
|
|
2fafd831e5 | ||
|
|
1ceae9d4ed | ||
|
|
d4d5d4551f | ||
|
|
0ef77b5616 | ||
|
|
efdc8e90f6 | ||
|
|
9f020e9258 | ||
|
|
c058568767 | ||
|
|
8809e69e91 | ||
|
|
7af5c40dd0 | ||
|
|
1d2bd10691 | ||
|
|
dac96fe852 | ||
|
|
a1487e5e79 | ||
|
|
6f19496172 | ||
|
|
ad5d6de4ea | ||
|
|
153e232f2d | ||
|
|
bcd4a7f025 | ||
|
|
3c3d463a81 | ||
|
|
92691929ed | ||
|
|
86a41c9021 | ||
|
|
a71c90c140 | ||
|
|
1d28851ef7 | ||
|
|
1aced54699 | ||
|
|
a8cf39c8b4 | ||
|
|
e037b95926 | ||
|
|
af7f6ce52e | ||
|
|
9a18982440 | ||
|
|
35bf4c8b0f | ||
|
|
23446558cf | ||
|
|
76ccb791ff | ||
|
|
a5a5735089 | ||
|
|
5077edf585 | ||
|
|
f38926f8b1 | ||
|
|
30de9bcc27 | ||
|
|
100e2e0828 | ||
|
|
e3b41771c6 | ||
|
|
3f7f3090f6 | ||
|
|
4149493f2c | ||
|
|
43aad3f65c | ||
|
|
bedcacb0a1 | ||
|
|
a5f8f84b43 | ||
|
|
e53b190380 | ||
|
|
1846fd4001 | ||
|
|
62e09945e3 | ||
|
|
c9b0db02fd | ||
|
|
51da619eec | ||
|
|
3eb50568e9 | ||
|
|
866b145645 | ||
|
|
9762fe5397 | ||
|
|
377896c30a | ||
|
|
98f13a6f11 | ||
|
|
0d85aea687 | ||
|
|
25d2b76514 | ||
|
|
42dfef3f6b | ||
|
|
1ce1e9cd71 | ||
|
|
65163966d5 | ||
|
|
edf8e0a155 | ||
|
|
4083075476 | ||
|
|
b745ebc218 | ||
|
|
b69d17a0f5 | ||
|
|
be8b6fb693 |
+13
-13
@@ -1,38 +1,38 @@
|
||||
# C/C++ for Visual Studio Code Changelog
|
||||
|
||||
## Version 1.20.2: April 17, 2024
|
||||
### Bug Fixes
|
||||
* Fix duplicate URIs in calls to provideConfigurations. [#12177](https://github.com/microsoft/vscode-cpptools/issues/12177)
|
||||
* Fix a crash and deadlock with a high `C_Cpp.loggingLevel`. [#12194](https://github.com/microsoft/vscode-cpptools/issues/12194)
|
||||
* Fix handling of `-iquote` for code analysis and `#include` completions. [#12198](https://github.com/microsoft/vscode-cpptools/issues/12198)
|
||||
|
||||
## Version 1.20.1: April 9, 2024
|
||||
### Bug Fixes
|
||||
* Fix 'Add #include' code actions for code scoped by a namespace or class. [#11541](https://github.com/microsoft/vscode-cpptools/issues/11541)
|
||||
* Fix the IntelliSense server not starting when a completion, signature help, or document highlight occurs from external commands. [#12143](https://github.com/microsoft/vscode-cpptools/issues/12143)
|
||||
* Fix the IntelliSense configuration not falling back to the `c_cpp_properties.json` configuration for a file not handled by a configuration provider. [#12144](https://github.com/microsoft/vscode-cpptools/issues/12144)
|
||||
|
||||
## Version 1.20.0: March 26, 2024
|
||||
## Version 1.20.5: May 6, 2024
|
||||
### Enhancements
|
||||
* Add support for C++ modules IFC version 0.43. [#10843](https://github.com/microsoft/vscode-cpptools/issues/10843)
|
||||
* Add support for `${userHome}` in `c_cpp_properties.json`. [#11756](https://github.com/microsoft/vscode-cpptools/issues/11756)
|
||||
* Reduce the default max workspace symbol search results and add `C_Cpp.maxSymbolSearchResults`. [PR #12131](https://github.com/microsoft/vscode-cpptools/pull/12131)
|
||||
* Update `clang-format`/`clang-tidy` to 18.1.2. [PR #12135](https://github.com/microsoft/vscode-cpptools/pull/12135)
|
||||
* Log `cpptools` and `cpptools-srv` crash call stacks in the 'C/C++ Crash Call Stacks' Output channel for bug reporting (on x64 Linux and x64/arm64 Mac).
|
||||
* Increase the fuzzy symbol character limit from 16 to 28.
|
||||
* Update the IntelliSense engine.
|
||||
|
||||
### Bug Fixes
|
||||
* Fix an IntelliSense parsing issue. [#6183](https://github.com/microsoft/vscode-cpptools/issues/6183)
|
||||
* Fix 'Copy Declaration / Definition' code not being formatted. [#10956](https://github.com/microsoft/vscode-cpptools/issues/10956)
|
||||
* Fix semantic colorization of certain macro arguments. [#11416](https://github.com/microsoft/vscode-cpptools/issues/11416)
|
||||
* Fix 'Add #include' code actions for code scoped by a namespace or class. [#11541](https://github.com/microsoft/vscode-cpptools/issues/11541)
|
||||
* Fix 'Create Declaration / Definition' not working if the cursor isn't on the function name. [#11834](https://github.com/microsoft/vscode-cpptools/issues/11834)
|
||||
* Fix duplicate 'Add #include' code actions. [#11989](https://github.com/microsoft/vscode-cpptools/issues/11989)
|
||||
* Fix directories being incorrectly recursively traversed in certain cases. [#11993](https://github.com/microsoft/vscode-cpptools/issues/11993)
|
||||
* Fix `forcedInclude` resolution for relative paths. [PR #12035](https://github.com/microsoft/vscode-cpptools/pull/12035)
|
||||
* Fix 'Add Configuration...' in `launch.json` when `editor.suggest.showSnippets` is `false`. [#12059](https://github.com/microsoft/vscode-cpptools/issues/12059)
|
||||
* Fix `c_cpp_properties.json` warnings for `includePath`s with `**` wildcard glob patterns. [#12070](https://github.com/microsoft/vscode-cpptools/issues/12070)
|
||||
* Fix non-existent relative path variables not showing a warning in `c_cpp_properties.json` (and other related issues). [#12089](https://github.com/microsoft/vscode-cpptools/issues/12089)
|
||||
* Fix call stacks for `cpptools` and `cpptools-srv` not being available on Linux. [#12091](https://github.com/microsoft/vscode-cpptools/issues/12091)
|
||||
* Fix IntelliSense processes shutting down immediately if not enough memory is detected. [#12126](https://github.com/microsoft/vscode-cpptools/issues/12126)
|
||||
* Fix code analysis aborting after encountering an excluded file (instead of just skipping it). [#12127](https://github.com/microsoft/vscode-cpptools/issues/12127)
|
||||
* Fix `"Cannot open source"` errors on missing includes not appearing if `C_Cpp.errorSquiggles` is `enabled`. [#12134](https://github.com/microsoft/vscode-cpptools/issues/12134)
|
||||
* Fix the IntelliSense server not starting when a completion, signature help, or document highlight occurs from external commands. [#12143](https://github.com/microsoft/vscode-cpptools/issues/12143)
|
||||
* Fix the IntelliSense configuration not falling back to the `c_cpp_properties.json` configuration for a file not handled by a configuration provider. [#12144](https://github.com/microsoft/vscode-cpptools/issues/12144)
|
||||
* Fix duplicate URIs in calls to provideConfigurations. [#12177](https://github.com/microsoft/vscode-cpptools/issues/12177)
|
||||
* Fix a crash and deadlock with a high `C_Cpp.loggingLevel`. [#12194](https://github.com/microsoft/vscode-cpptools/issues/12194)
|
||||
* Fix handling of `-iquote` for code analysis and `#include` completions. [#12198](https://github.com/microsoft/vscode-cpptools/issues/12198)
|
||||
* Fix a crash during startup. [#12237](https://github.com/microsoft/vscode-cpptools/issues/12237)
|
||||
* Fix IntelliSense configuration on Windows ARM64. [#12253](https://github.com/microsoft/vscode-cpptools/issues/12253)
|
||||
* Fix a `cpptools` process crash and deadlock during shutdown.
|
||||
|
||||
## Version 1.19.9: March 20, 2024
|
||||
|
||||
@@ -16,5 +16,7 @@
|
||||
"path.is.not.a.file": "路径不是文件: {0}",
|
||||
"path.is.not.a.directory": "路径不是目录: {0}",
|
||||
"duplicate.name": "{0} 重复。配置名称应是唯一的。",
|
||||
"cannot.find2": "无法找到“{0}”。"
|
||||
"cannot.find2": "无法找到“{0}”。",
|
||||
"multiple.paths.not.allowed": "不允许使用多个路径。",
|
||||
"paths.are.not.directories": "路径不是目录: {0}"
|
||||
}
|
||||
@@ -5,6 +5,8 @@
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"c.cpp.diagnostics": "C/C++ 诊断",
|
||||
"c.cpp.crash.call.stacks.title": "C/C++ 故障调用堆栈",
|
||||
"c.cpp.crash.call.stacks.description": "C/C++ 扩展进程已崩溃。崩溃进程名称、日期/时间、信号和调用堆栈如下 - 将它包含在 {0} 处的 bug 报告中会很有帮助。",
|
||||
"c.cpp.ssh.channel": "{0}: SSH",
|
||||
"c.cpp.debug.protocol": "C/C++ 调试协议",
|
||||
"c.cpp.warnings": "C/C++ 配置警告"
|
||||
|
||||
@@ -16,5 +16,7 @@
|
||||
"path.is.not.a.file": "路徑不是檔案: {0}",
|
||||
"path.is.not.a.directory": "路徑不是目錄: {0}",
|
||||
"duplicate.name": "{0} 重複。組態名稱應該是唯一的。",
|
||||
"cannot.find2": "找不到 \"{0}\"。"
|
||||
"cannot.find2": "找不到 \"{0}\"。",
|
||||
"multiple.paths.not.allowed": "不允許使用多個路徑。",
|
||||
"paths.are.not.directories": "路徑不是目錄: {0}"
|
||||
}
|
||||
@@ -5,6 +5,8 @@
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"c.cpp.diagnostics": "C/C++ 診斷",
|
||||
"c.cpp.crash.call.stacks.title": "C/C++ 損毀呼叫堆疊",
|
||||
"c.cpp.crash.call.stacks.description": "C/C++ 延伸模組程序已損毀。損毀的程序名稱、日期/時間、訊號和呼叫堆疊如下 -- 在 {0} 的錯誤報告中包含該資訊會很有幫助。",
|
||||
"c.cpp.ssh.channel": "{0}: SSH",
|
||||
"c.cpp.debug.protocol": "C/C++ 偵錯通訊協定",
|
||||
"c.cpp.warnings": "C/C++ 設定警告"
|
||||
|
||||
@@ -373,6 +373,11 @@
|
||||
"c_cpp.taskDefinitions.name.description": "Název úlohy.",
|
||||
"c_cpp.taskDefinitions.command.description": "Cesta ke kompilátoru nebo skriptu, který provádí kompilaci.",
|
||||
"c_cpp.taskDefinitions.args.description": "Další argumenty, které se mají předat kompilátoru nebo kompilačnímu skriptu.",
|
||||
"c_cpp.taskDefinitions.args.value.description": "Skutečná hodnota argumentu.",
|
||||
"c_cpp.taskDefinitions.args.quoting.description": "Způsob, jakým by měla být hodnota argumentu uvedena v uvozovkách",
|
||||
"c_cpp.taskDefinitions.args.quoting.escape.description": "Uvodí znaky pomocí řídicího znaku prostředí (například pomocí znaku \\ v Bashi).",
|
||||
"c_cpp.taskDefinitions.args.quoting.strong.description": "Uzavře argument do silných uvozovek prostředí (například ' pomocí znaku Bash).",
|
||||
"c_cpp.taskDefinitions.args.quoting.weak.description": "Uzavře argument do jednoduchých uvozovek prostředí (například \" pomocí znaku Bash).",
|
||||
"c_cpp.taskDefinitions.options.description": "Další možnosti příkazu.",
|
||||
"c_cpp.taskDefinitions.options.cwd.description": "The current working directory of the executed program or script. If omitted Code's current workspace root is used.",
|
||||
"c_cpp.taskDefinitions.detail.description": "Další podrobnosti o úloze.",
|
||||
|
||||
@@ -16,5 +16,7 @@
|
||||
"path.is.not.a.file": "Cesta není soubor: {0}",
|
||||
"path.is.not.a.directory": "Cesta není adresář: {0}",
|
||||
"duplicate.name": "{0} je duplicitní. Název konfigurace by měl být jedinečný.",
|
||||
"cannot.find2": "Nejde najít {0}."
|
||||
"cannot.find2": "Nejde najít {0}.",
|
||||
"multiple.paths.not.allowed": "Více cest není povoleno.",
|
||||
"paths.are.not.directories": "Cesty nejsou adresáře: {0}"
|
||||
}
|
||||
@@ -5,6 +5,8 @@
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"c.cpp.diagnostics": "Diagnostika C/C++",
|
||||
"c.cpp.crash.call.stacks.title": "Zásobníky volání chyb C/C++",
|
||||
"c.cpp.crash.call.stacks.description": "Došlo k chybovému ukončení procesu rozšíření C/C++. Název chybového procesu, datum a čas, signál a zásobník volání jsou níže. Bylo by užitečné je zahrnout do zprávy o chybě na {0}.",
|
||||
"c.cpp.ssh.channel": "{0}: SSH",
|
||||
"c.cpp.debug.protocol": "Protokol ladění C/C++",
|
||||
"c.cpp.warnings": "Upozornění konfigurace C/C++"
|
||||
|
||||
@@ -16,5 +16,7 @@
|
||||
"path.is.not.a.file": "Der Pfad ist keine Datei: {0}",
|
||||
"path.is.not.a.directory": "Der Pfad ist kein Verzeichnis: {0}",
|
||||
"duplicate.name": "\"{0}\" ist ein Duplikat. Der Konfigurationsname muss eindeutig sein.",
|
||||
"cannot.find2": "\"{0}\" wurde nicht gefunden."
|
||||
"cannot.find2": "\"{0}\" wurde nicht gefunden.",
|
||||
"multiple.paths.not.allowed": "Mehrere Pfade sind nicht zulässig.",
|
||||
"paths.are.not.directories": "Pfade sind keine Verzeichnisse: {0}"
|
||||
}
|
||||
@@ -5,6 +5,8 @@
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"c.cpp.diagnostics": "C/C++-Diagnose",
|
||||
"c.cpp.crash.call.stacks.title": "C/C++-Absturzaufruflisten",
|
||||
"c.cpp.crash.call.stacks.description": "Ein C/C++-Erweiterungsprozess ist abgestürzt. Der Name, das Datum/die Uhrzeit, das Signal und die Aufrufliste des abstürzenden Prozesses sind unten aufgeführt. Es wäre hilfreich, dies in einen Fehlerbericht unter {0} aufzunehmen.",
|
||||
"c.cpp.ssh.channel": "{0}: SSH",
|
||||
"c.cpp.debug.protocol": "C/C++-Debugprotokoll",
|
||||
"c.cpp.warnings": "C/C++-Konfigurationswarnungen"
|
||||
|
||||
@@ -16,5 +16,7 @@
|
||||
"path.is.not.a.file": "La ruta de acceso no es un archivo: {0}",
|
||||
"path.is.not.a.directory": "La ruta de acceso no es un directorio: {0}",
|
||||
"duplicate.name": "{0} es un duplicado. El nombre de la configuración debe ser único.",
|
||||
"cannot.find2": "No se encuentra \"{0}\"."
|
||||
"cannot.find2": "No se encuentra \"{0}\".",
|
||||
"multiple.paths.not.allowed": "No se permiten varias rutas de acceso.",
|
||||
"paths.are.not.directories": "Las rutas de acceso no son directorios: {0}"
|
||||
}
|
||||
@@ -5,6 +5,8 @@
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"c.cpp.diagnostics": "Diagnósticos de C/C++",
|
||||
"c.cpp.crash.call.stacks.title": "Pilas de llamadas de bloqueo de C/C++",
|
||||
"c.cpp.crash.call.stacks.description": "Se ha bloqueado un proceso de extensión de C/C++. A continuación se muestran el nombre del proceso de bloqueo, la fecha y hora, la señal y la pila de llamadas; sería útil incluirlo en un informe de errores en {0}.",
|
||||
"c.cpp.ssh.channel": "{0}: SSH",
|
||||
"c.cpp.debug.protocol": "Protocolo de depuración de C/C++",
|
||||
"c.cpp.warnings": "Advertencias de configuración de C/C++"
|
||||
|
||||
@@ -16,5 +16,7 @@
|
||||
"path.is.not.a.file": "Le chemin n'est pas un fichier : {0}",
|
||||
"path.is.not.a.directory": "Le chemin n'est pas un répertoire : {0}",
|
||||
"duplicate.name": "{0} est dupliqué. Le nom de configuration doit être unique.",
|
||||
"cannot.find2": "\"{0}\" est introuvable."
|
||||
"cannot.find2": "\"{0}\" est introuvable.",
|
||||
"multiple.paths.not.allowed": "Il est interdit d’utiliser plusieurs chemin d’accès.",
|
||||
"paths.are.not.directories": "Les chemins d’accès ne sont pas des répertoires : {0}"
|
||||
}
|
||||
@@ -5,6 +5,8 @@
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"c.cpp.diagnostics": "Diagnostics C/C++",
|
||||
"c.cpp.crash.call.stacks.title": "Piles d’appels sur incident C/C++",
|
||||
"c.cpp.crash.call.stacks.description": "Un processus d’extension C/C++ s’est arrêté. Le nom du processus de blocage, la date/l’heure, le signal et la pile des appels sont ci-dessous : il serait utile de l’inclure dans un rapport de bogues à {0}.",
|
||||
"c.cpp.ssh.channel": "{0} : SSH",
|
||||
"c.cpp.debug.protocol": "Protocole de débogage C/C++",
|
||||
"c.cpp.warnings": "Avertissements de configuration C/C++"
|
||||
|
||||
@@ -16,5 +16,7 @@
|
||||
"path.is.not.a.file": "Il percorso non è un file: {0}",
|
||||
"path.is.not.a.directory": "Il percorso non è una directory: {0}",
|
||||
"duplicate.name": "{0} è duplicato. Il nome della configurazione deve essere univoco.",
|
||||
"cannot.find2": "Non è possibile trovare \"{0}\"."
|
||||
"cannot.find2": "Non è possibile trovare \"{0}\".",
|
||||
"multiple.paths.not.allowed": "Più percorsi non sono consentiti.",
|
||||
"paths.are.not.directories": "I percorsi non sono directory: {0}"
|
||||
}
|
||||
@@ -5,6 +5,8 @@
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"c.cpp.diagnostics": "Diagnostica C/C++",
|
||||
"c.cpp.crash.call.stacks.title": "Stack di chiamate di arresto anomalo del sistema in C/C++",
|
||||
"c.cpp.crash.call.stacks.description": "Un processo di estensione C/C++ si è arrestato in modo anomalo. Il nome del processo di arresto anomalo, la data/ora, il segnale e lo stack delle chiamate sono riportati di seguito. Sarebbe utile includerli in un report sui bug in {0}.",
|
||||
"c.cpp.ssh.channel": "{0}: SSH",
|
||||
"c.cpp.debug.protocol": "Protocollo di debug C/C++",
|
||||
"c.cpp.warnings": "Avvisi di configurazione C/C++"
|
||||
|
||||
@@ -16,5 +16,7 @@
|
||||
"path.is.not.a.file": "パスがファイルではありません: {0}",
|
||||
"path.is.not.a.directory": "パスがディレクトリではありません: {0}",
|
||||
"duplicate.name": "{0} が重複しています。構成名は一意である必要があります。",
|
||||
"cannot.find2": "\"{0}\" が見つかりません。"
|
||||
"cannot.find2": "\"{0}\" が見つかりません。",
|
||||
"multiple.paths.not.allowed": "複数のパスは使用できません。",
|
||||
"paths.are.not.directories": "パスはディレクトリではありません: {0}"
|
||||
}
|
||||
@@ -5,6 +5,8 @@
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"c.cpp.diagnostics": "C/C++ 診断",
|
||||
"c.cpp.crash.call.stacks.title": "C/C++ クラッシュ呼び出し履歴",
|
||||
"c.cpp.crash.call.stacks.description": "C/C++ 拡張プロセスがクラッシュしました。クラッシュ プロセス名、日付/時刻、シグナル、および呼び出し履歴は以下のとおりです -- これは、{0} のバグ レポートに含めるのに役立ちます。",
|
||||
"c.cpp.ssh.channel": "{0}: SSH",
|
||||
"c.cpp.debug.protocol": "C/C++ デバッグ プロトコル",
|
||||
"c.cpp.warnings": "C/C++ 構成の警告"
|
||||
|
||||
@@ -16,5 +16,7 @@
|
||||
"path.is.not.a.file": "경로가 파일이 아닙니다. {0}",
|
||||
"path.is.not.a.directory": "경로가 디렉터리가 아닙니다. {0}",
|
||||
"duplicate.name": "{0}은(는) 중복됩니다. 구성 이름은 고유해야 합니다.",
|
||||
"cannot.find2": "\"{0}\"을(를) 찾을 수 없습니다."
|
||||
"cannot.find2": "\"{0}\"을(를) 찾을 수 없습니다.",
|
||||
"multiple.paths.not.allowed": "여러 경로는 허용되지 않습니다.",
|
||||
"paths.are.not.directories": "경로는 디렉터리가 아닙니다. {0}"
|
||||
}
|
||||
@@ -5,6 +5,8 @@
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"c.cpp.diagnostics": "C/C++ 진단",
|
||||
"c.cpp.crash.call.stacks.title": "C/C++ 충돌 호출 스택",
|
||||
"c.cpp.crash.call.stacks.description": "C/C++ 확장 프로세스에 충돌이 발생했습니다. 충돌하는 프로세스 이름, 날짜/시간, 신호, 호출 스택이 아래에 나열되어 있습니다. 이를 버그 보고서({0})에 포함하면 도움이 될 수 있습니다.",
|
||||
"c.cpp.ssh.channel": "{0}: SSH",
|
||||
"c.cpp.debug.protocol": "C/C++ 디버그 프로토콜",
|
||||
"c.cpp.warnings": "C/C++ 구성 경고"
|
||||
|
||||
@@ -16,5 +16,7 @@
|
||||
"path.is.not.a.file": "Ścieżka nie jest plikiem: {0}",
|
||||
"path.is.not.a.directory": "Ścieżka nie jest katalogiem: {0}",
|
||||
"duplicate.name": "Element {0} jest duplikatem. Nazwa konfiguracji musi być unikatowa.",
|
||||
"cannot.find2": "Nie można znaleźć elementu „{0}”."
|
||||
"cannot.find2": "Nie można znaleźć elementu „{0}”.",
|
||||
"multiple.paths.not.allowed": "Wiele ścieżek jest niedozwolonych.",
|
||||
"paths.are.not.directories": "Ścieżki nie są katalogami: {0}"
|
||||
}
|
||||
@@ -5,6 +5,8 @@
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"c.cpp.diagnostics": "Diagnostyka języka C/C++",
|
||||
"c.cpp.crash.call.stacks.title": "Stosy wywołań awaryjnych języka C/C++",
|
||||
"c.cpp.crash.call.stacks.description": "Proces rozszerzenia C/C++ uległ awarii. Nazwa procesu powodującego awarię, data/godzina, sygnał i stos wywołań znajdują się poniżej — pomocne byłoby uwzględnienie jej w raporcie o usterce pod adresem {0}.",
|
||||
"c.cpp.ssh.channel": "{0}: SSH",
|
||||
"c.cpp.debug.protocol": "Protokół debugowania języka C/C++",
|
||||
"c.cpp.warnings": "Ostrzeżenia dotyczące konfiguracji języka C/C++"
|
||||
|
||||
@@ -16,5 +16,7 @@
|
||||
"path.is.not.a.file": "O caminho não é um arquivo: {0}",
|
||||
"path.is.not.a.directory": "O caminho não é um diretório: {0}",
|
||||
"duplicate.name": "{0} é uma duplicata. O nome da configuração deve ser exclusivo.",
|
||||
"cannot.find2": "Não é possível localizar \"{0}\"."
|
||||
"cannot.find2": "Não é possível localizar \"{0}\".",
|
||||
"multiple.paths.not.allowed": "Vários caminhos não são permitidos.",
|
||||
"paths.are.not.directories": "Os caminhos não são diretórios: {0}"
|
||||
}
|
||||
@@ -5,6 +5,8 @@
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"c.cpp.diagnostics": "Diagnóstico de C/C++",
|
||||
"c.cpp.crash.call.stacks.title": "Pilhas de Chamadas de Falha do C/C++",
|
||||
"c.cpp.crash.call.stacks.description": "Um processo de extensão C/C++ falhou. O nome, data/hora, sinal e pilha de chamadas do processo de falha estão abaixo. Seria útil incluí-los em um relatório de bugs em {0}.",
|
||||
"c.cpp.ssh.channel": "{0}: SSH",
|
||||
"c.cpp.debug.protocol": "Protocolo de Depuração de C/C++",
|
||||
"c.cpp.warnings": "Avisos de Configuração de C/C++"
|
||||
|
||||
@@ -16,5 +16,7 @@
|
||||
"path.is.not.a.file": "Путь не является файлом: {0}",
|
||||
"path.is.not.a.directory": "Путь не является каталогом: {0}",
|
||||
"duplicate.name": "{0} является дубликатом. Имя конфигурации должно быть уникальным.",
|
||||
"cannot.find2": "Не удается найти \"{0}\"."
|
||||
"cannot.find2": "Не удается найти \"{0}\".",
|
||||
"multiple.paths.not.allowed": "Запрещено использовать несколько путей.",
|
||||
"paths.are.not.directories": "Пути не являются каталогами: {0}"
|
||||
}
|
||||
@@ -5,6 +5,8 @@
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"c.cpp.diagnostics": "Диагностика C/C++",
|
||||
"c.cpp.crash.call.stacks.title": "Стеки вызовов с аварийным завершением C/C++",
|
||||
"c.cpp.crash.call.stacks.description": "Процесс расширения C/C++ завершился аварийно. Ниже указаны имя, дата и время, сигнал и стек вызовов для процесса с аварийным завершением. Их будет полезно включить в отчет об ошибке на странице {0}.",
|
||||
"c.cpp.ssh.channel": "{0}: SSH",
|
||||
"c.cpp.debug.protocol": "Протокол отладки C/C++",
|
||||
"c.cpp.warnings": "Предупреждения конфигурации C/C++"
|
||||
|
||||
@@ -16,5 +16,7 @@
|
||||
"path.is.not.a.file": "Yol bir dosya değil: {0}",
|
||||
"path.is.not.a.directory": "Yol bir dizin değil: {0}",
|
||||
"duplicate.name": "{0} yineleniyor. Yapılandırma adı benzersiz olmalıdır.",
|
||||
"cannot.find2": "\"{0}\" bulunamıyor."
|
||||
"cannot.find2": "\"{0}\" bulunamıyor.",
|
||||
"multiple.paths.not.allowed": "Birden fazla yola izin verilmez.",
|
||||
"paths.are.not.directories": "Yollar dizin değil: {0}"
|
||||
}
|
||||
@@ -5,6 +5,8 @@
|
||||
// Do not edit this file. It is machine generated.
|
||||
{
|
||||
"c.cpp.diagnostics": "C/C++ Tanılaması",
|
||||
"c.cpp.crash.call.stacks.title": "C/C++ Kilitlenme Çağrısı Yığınları",
|
||||
"c.cpp.crash.call.stacks.description": "C/C++ uzantı işlemi kilitlendi. Kilitlenen işlem adı, tarih/saat, sinyal ve çağrı yığını aşağıdadır; bunu {0} adresindeki bir hata raporuna eklemek işe yarar.",
|
||||
"c.cpp.ssh.channel": "{0}: SSH",
|
||||
"c.cpp.debug.protocol": "C/C++ Hata Ayıklama Protokolü",
|
||||
"c.cpp.warnings": "C/C++ Yapılandırma Uyarıları"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "cpptools",
|
||||
"displayName": "C/C++",
|
||||
"description": "C/C++ IntelliSense, debugging, and code browsing.",
|
||||
"version": "1.20.2-main",
|
||||
"version": "1.20.5-main",
|
||||
"publisher": "ms-vscode",
|
||||
"icon": "LanguageCCPP_color_128x.png",
|
||||
"readme": "README.md",
|
||||
|
||||
@@ -2001,8 +2001,8 @@ export class DefaultClient implements Client {
|
||||
}
|
||||
try {
|
||||
DefaultClient.isStarted.reset();
|
||||
const status = await this.provideCustomConfigurationAsync(docUri, requestFile, replaceExisting, provider);
|
||||
telemetry.logLanguageServerEvent('provideCustomConfiguration', { providerId, status });
|
||||
const resultCode = await this.provideCustomConfigurationAsync(docUri, requestFile, replaceExisting, provider);
|
||||
telemetry.logLanguageServerEvent('provideCustomConfiguration', { providerId, resultCode });
|
||||
} finally {
|
||||
onFinished();
|
||||
DefaultClient.isStarted.resolve();
|
||||
|
||||
@@ -1838,9 +1838,9 @@ export class CppProperties {
|
||||
curText = curText.substring(0, nextNameStart2);
|
||||
}
|
||||
if (this.prevSquiggleMetrics.get(currentConfiguration.name) === undefined) {
|
||||
this.prevSquiggleMetrics.set(currentConfiguration.name, { PathNonExistent: 0, PathNotAFile: 0, PathNotADirectory: 0, CompilerPathMissingQuotes: 0, CompilerModeMismatch: 0 });
|
||||
this.prevSquiggleMetrics.set(currentConfiguration.name, { PathNonExistent: 0, PathNotAFile: 0, PathNotADirectory: 0, CompilerPathMissingQuotes: 0, CompilerModeMismatch: 0, MultiplePathsNotAllowed: 0 });
|
||||
}
|
||||
const newSquiggleMetrics: { [key: string]: number } = { PathNonExistent: 0, PathNotAFile: 0, PathNotADirectory: 0, CompilerPathMissingQuotes: 0, CompilerModeMismatch: 0 };
|
||||
const newSquiggleMetrics: { [key: string]: number } = { PathNonExistent: 0, PathNotAFile: 0, PathNotADirectory: 0, CompilerPathMissingQuotes: 0, CompilerModeMismatch: 0, MultiplePathsNotAllowed: 0 };
|
||||
const isWindows: boolean = os.platform() === 'win32';
|
||||
|
||||
// TODO: Add other squiggles.
|
||||
@@ -1867,7 +1867,7 @@ export class CppProperties {
|
||||
}
|
||||
|
||||
// Check for path-related squiggles.
|
||||
let paths: string[] = [];
|
||||
const paths: string[] = [];
|
||||
let compilerPath: string | undefined;
|
||||
for (const pathArray of [ currentConfiguration.browse ? currentConfiguration.browse.path : undefined,
|
||||
currentConfiguration.includePath, currentConfiguration.macFrameworkPath ]) {
|
||||
@@ -1895,10 +1895,7 @@ export class CppProperties {
|
||||
compilerPath = currentConfiguration.compilerPath;
|
||||
}
|
||||
|
||||
// Resolve and split any environment variables
|
||||
paths = this.resolveAndSplit(paths, undefined, this.ExtendedEnvironment);
|
||||
compilerPath = util.resolveVariables(compilerPath, this.ExtendedEnvironment).trim();
|
||||
compilerPath = this.resolvePath(compilerPath);
|
||||
compilerPath = this.resolvePath(compilerPath).trim();
|
||||
|
||||
// Get the start/end for properties that are file-only.
|
||||
const forcedIncludeStart: number = curText.search(/\s*\"forcedInclude\"\s*:\s*\[/);
|
||||
@@ -1961,8 +1958,7 @@ export class CppProperties {
|
||||
let dotConfigMessage: string | undefined;
|
||||
|
||||
dotConfigPath = currentConfiguration.dotConfig;
|
||||
dotConfigPath = util.resolveVariables(dotConfigPath, this.ExtendedEnvironment).trim();
|
||||
dotConfigPath = this.resolvePath(dotConfigPath);
|
||||
dotConfigPath = this.resolvePath(dotConfigPath).trim();
|
||||
// does not try resolve if the dotConfig property is empty
|
||||
dotConfigPath = dotConfigPath !== '' ? dotConfigPath : undefined;
|
||||
|
||||
@@ -2001,25 +1997,6 @@ export class CppProperties {
|
||||
continue;
|
||||
}
|
||||
|
||||
let resolvedPath: string = this.resolvePath(curPath);
|
||||
if (!resolvedPath) {
|
||||
continue;
|
||||
}
|
||||
let pathExists: boolean = true;
|
||||
if (this.rootUri) {
|
||||
const checkPathExists: any = util.checkPathExistsSync(resolvedPath, this.rootUri.fsPath + path.sep, isWindows, false);
|
||||
pathExists = checkPathExists.pathExists;
|
||||
resolvedPath = checkPathExists.path;
|
||||
}
|
||||
// Normalize path separators.
|
||||
if (path.sep === "/") {
|
||||
resolvedPath = resolvedPath.replace(/\\/g, path.sep);
|
||||
} else {
|
||||
resolvedPath = resolvedPath.replace(/\//g, path.sep);
|
||||
}
|
||||
|
||||
// Iterate through the text and apply squiggles.
|
||||
|
||||
// Escape the path string for literal use in a regular expression
|
||||
// Need to escape any quotes to match the original text
|
||||
let escapedPath: string = curPath.replace(/"/g, '\\"');
|
||||
@@ -2030,6 +2007,42 @@ export class CppProperties {
|
||||
const pattern: RegExp = new RegExp(`"[^"]*?(?<="|;)${escapedPath}(?="|;).*?"`, "g");
|
||||
const configMatches: string[] | null = curText.match(pattern);
|
||||
|
||||
const expandedPaths: string[] = this.resolveAndSplit([curPath], undefined, this.ExtendedEnvironment, true, true);
|
||||
const incorrectExpandedPaths: string[] = [];
|
||||
|
||||
if (expandedPaths.length <= 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (this.rootUri) {
|
||||
for (const [index, expandedPath] of expandedPaths.entries()) {
|
||||
if (expandedPath.includes("${workspaceFolder}")) {
|
||||
expandedPaths[index] = this.resolvePath(expandedPath, false);
|
||||
} else {
|
||||
expandedPaths[index] = this.resolvePath(expandedPath);
|
||||
}
|
||||
|
||||
const checkPathExists: any = util.checkPathExistsSync(expandedPaths[index], this.rootUri.fsPath + path.sep, isWindows, false);
|
||||
if (!checkPathExists.pathExists) {
|
||||
// If there are multiple paths, store any non-existing paths to squiggle later on.
|
||||
incorrectExpandedPaths.push(expandedPaths[index]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const pathExists: boolean = incorrectExpandedPaths.length === 0;
|
||||
|
||||
for (const [index, expandedPath] of expandedPaths.entries()) {
|
||||
// Normalize path separators.
|
||||
if (path.sep === "/") {
|
||||
expandedPaths[index] = expandedPath.replace(/\\/g, path.sep);
|
||||
} else {
|
||||
expandedPaths[index] = expandedPath.replace(/\//g, path.sep);
|
||||
}
|
||||
}
|
||||
|
||||
// Iterate through the text and apply squiggles.
|
||||
|
||||
let globPath: boolean = false;
|
||||
const asteriskPosition = curPath.indexOf("*");
|
||||
if (asteriskPosition !== -1) {
|
||||
@@ -2041,6 +2054,7 @@ export class CppProperties {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (configMatches && !globPath) {
|
||||
let curOffset: number = 0;
|
||||
let endOffset: number = 0;
|
||||
@@ -2050,29 +2064,57 @@ export class CppProperties {
|
||||
if (curOffset >= compilerPathStart && curOffset <= compilerPathEnd) {
|
||||
continue;
|
||||
}
|
||||
let message: string;
|
||||
let message: string = "";
|
||||
if (!pathExists) {
|
||||
if (curOffset >= forcedIncludeStart && curOffset <= forcedeIncludeEnd
|
||||
&& !path.isAbsolute(resolvedPath)) {
|
||||
&& !path.isAbsolute(expandedPaths[0])) {
|
||||
continue; // Skip the error, because it could be resolved recursively.
|
||||
}
|
||||
message = localize('cannot.find2', "Cannot find \"{0}\".", resolvedPath);
|
||||
let badPath = "";
|
||||
if (incorrectExpandedPaths.length > 0) {
|
||||
badPath = incorrectExpandedPaths.map(s => `"${s}"`).join(', ');
|
||||
} else {
|
||||
badPath = `"${expandedPaths[0]}"`;
|
||||
}
|
||||
message = localize('cannot.find2', "Cannot find {0}", badPath);
|
||||
newSquiggleMetrics.PathNonExistent++;
|
||||
} else {
|
||||
// Check for file versus path mismatches.
|
||||
if ((curOffset >= forcedIncludeStart && curOffset <= forcedeIncludeEnd) ||
|
||||
(curOffset >= compileCommandsStart && curOffset <= compileCommandsEnd)) {
|
||||
if (util.checkFileExistsSync(resolvedPath)) {
|
||||
continue;
|
||||
(curOffset >= compileCommandsStart && curOffset <= compileCommandsEnd)) {
|
||||
if (expandedPaths.length > 1) {
|
||||
message = localize("multiple.paths.not.allowed", "Multiple paths are not allowed.");
|
||||
newSquiggleMetrics.MultiplePathsNotAllowed++;
|
||||
} else {
|
||||
const resolvedPath = this.resolvePath(expandedPaths[0]);
|
||||
if (util.checkFileExistsSync(resolvedPath)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
message = localize("path.is.not.a.file", "Path is not a file: {0}", expandedPaths[0]);
|
||||
newSquiggleMetrics.PathNotAFile++;
|
||||
}
|
||||
message = localize("path.is.not.a.file", "Path is not a file: {0}", resolvedPath);
|
||||
newSquiggleMetrics.PathNotAFile++;
|
||||
} else {
|
||||
if (util.checkDirectoryExistsSync(resolvedPath)) {
|
||||
const mismatchedPaths: string[] = [];
|
||||
for (const expandedPath of expandedPaths) {
|
||||
const resolvedPath = this.resolvePath(expandedPath);
|
||||
if (!util.checkDirectoryExistsSync(resolvedPath)) {
|
||||
mismatchedPaths.push(expandedPath);
|
||||
}
|
||||
}
|
||||
|
||||
let badPath = "";
|
||||
if (mismatchedPaths.length > 1) {
|
||||
badPath = mismatchedPaths.map(s => `"${s}"`).join(', ');
|
||||
message = localize('paths.are.not.directories', "Paths are not directories: {0}", badPath);
|
||||
newSquiggleMetrics.PathNotADirectory++;
|
||||
} else if (mismatchedPaths.length === 1) {
|
||||
badPath = `"${mismatchedPaths[0]}"`;
|
||||
message = localize('path.is.not.a.directory', "Path is not a directory: {0}", badPath);
|
||||
newSquiggleMetrics.PathNotADirectory++;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
message = localize("path.is.not.a.directory", "Path is not a directory: {0}", resolvedPath);
|
||||
newSquiggleMetrics.PathNotADirectory++;
|
||||
}
|
||||
}
|
||||
const diagnostic: vscode.Diagnostic = new vscode.Diagnostic(
|
||||
@@ -2092,7 +2134,7 @@ export class CppProperties {
|
||||
endOffset = curOffset + curMatch.length;
|
||||
let message: string;
|
||||
if (!pathExists) {
|
||||
message = localize('cannot.find2', "Cannot find \"{0}\".", resolvedPath);
|
||||
message = localize('cannot.find2', "Cannot find \"{0}\".", expandedPaths[0]);
|
||||
newSquiggleMetrics.PathNonExistent++;
|
||||
const diagnostic: vscode.Diagnostic = new vscode.Diagnostic(
|
||||
new vscode.Range(document.positionAt(envTextStartOffSet + curOffset),
|
||||
@@ -2128,6 +2170,9 @@ export class CppProperties {
|
||||
if (newSquiggleMetrics.CompilerModeMismatch !== this.prevSquiggleMetrics.get(currentConfiguration.name)?.CompilerModeMismatch) {
|
||||
changedSquiggleMetrics.CompilerModeMismatch = newSquiggleMetrics.CompilerModeMismatch;
|
||||
}
|
||||
if (newSquiggleMetrics.MultiplePathsNotAllowed !== this.prevSquiggleMetrics.get(currentConfiguration.name)?.MultiplePathsNotAllowed) {
|
||||
changedSquiggleMetrics.MultiplePathsNotAllowed = newSquiggleMetrics.MultiplePathsNotAllowed;
|
||||
}
|
||||
if (Object.keys(changedSquiggleMetrics).length > 0) {
|
||||
telemetry.logLanguageServerEvent("ConfigSquiggles", undefined, changedSquiggleMetrics);
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ import { TargetPopulation } from 'vscode-tas-client';
|
||||
import * as which from 'which';
|
||||
import { logAndReturn } from '../Utility/Async/returns';
|
||||
import * as util from '../common';
|
||||
import { getCrashCallStacksChannel } from '../logger';
|
||||
import { PlatformInformation } from '../platform';
|
||||
import * as telemetry from '../telemetry';
|
||||
import { Client, DefaultClient, DoxygenCodeActionCommandArguments, openFileVersions } from './client';
|
||||
@@ -36,7 +37,9 @@ const localize: nls.LocalizeFunc = nls.loadMessageBundle();
|
||||
export const CppSourceStr: string = "C/C++";
|
||||
export const configPrefix: string = "C/C++: ";
|
||||
|
||||
let prevCrashFile: string;
|
||||
let prevMacCrashFile: string;
|
||||
let prevCppCrashFile: string;
|
||||
let prevCppCrashCallStackData: string = "";
|
||||
export let clients: ClientCollection;
|
||||
let activeDocument: vscode.TextDocument | undefined;
|
||||
let ui: LanguageStatusUI;
|
||||
@@ -914,7 +917,7 @@ function onShowRefCommand(arg?: TreeNode): void {
|
||||
|
||||
function reportMacCrashes(): void {
|
||||
if (process.platform === "darwin") {
|
||||
prevCrashFile = "";
|
||||
prevMacCrashFile = "";
|
||||
const home: string = os.homedir();
|
||||
const crashFolder: string = path.resolve(home, "Library/Logs/DiagnosticReports");
|
||||
fs.stat(crashFolder, (err) => {
|
||||
@@ -932,10 +935,10 @@ function reportMacCrashes(): void {
|
||||
if (event !== "rename") {
|
||||
return;
|
||||
}
|
||||
if (!filename || filename === prevCrashFile) {
|
||||
if (!filename || filename === prevMacCrashFile) {
|
||||
return;
|
||||
}
|
||||
prevCrashFile = filename;
|
||||
prevMacCrashFile = filename;
|
||||
if (!filename.startsWith("cpptools")) {
|
||||
return;
|
||||
}
|
||||
@@ -959,12 +962,24 @@ function reportMacCrashes(): void {
|
||||
}
|
||||
|
||||
export function usesCrashHandler(): boolean {
|
||||
return process.platform !== "win32" && (process.platform === "darwin" || os.arch() === "x64");
|
||||
if (os.platform() === "darwin") {
|
||||
if (os.arch() === "arm64") {
|
||||
return true;
|
||||
} else {
|
||||
const releaseParts: string[] = os.release().split(".");
|
||||
if (releaseParts.length >= 1) {
|
||||
// Avoid potentially intereferring with the older macOS crash handler.
|
||||
return parseInt(releaseParts[0]) >= 19;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return os.platform() !== "win32" && os.arch() === "x64";
|
||||
}
|
||||
|
||||
export function watchForCrashes(crashDirectory: string): void {
|
||||
if (crashDirectory !== "") {
|
||||
prevCrashFile = "";
|
||||
prevCppCrashFile = "";
|
||||
fs.stat(crashDirectory, (err) => {
|
||||
const crashObject: Record<string, string> = {};
|
||||
if (err?.code) {
|
||||
@@ -980,17 +995,19 @@ export function watchForCrashes(crashDirectory: string): void {
|
||||
if (event !== "rename") {
|
||||
return;
|
||||
}
|
||||
if (!filename || filename === prevCrashFile) {
|
||||
if (!filename || filename === prevCppCrashFile) {
|
||||
return;
|
||||
}
|
||||
prevCrashFile = filename;
|
||||
prevCppCrashFile = filename;
|
||||
if (!filename.startsWith("cpptools")) {
|
||||
return;
|
||||
}
|
||||
const crashDate: Date = new Date();
|
||||
|
||||
// Wait 5 seconds to allow time for the crash log to finish being written.
|
||||
setTimeout(() => {
|
||||
fs.readFile(path.resolve(crashDirectory, filename), 'utf8', (err, data) => {
|
||||
void handleCrashFileRead(crashDirectory, filename, err, data);
|
||||
void handleCrashFileRead(crashDirectory, filename, crashDate, err, data);
|
||||
});
|
||||
}, 5000);
|
||||
});
|
||||
@@ -1115,7 +1132,7 @@ function handleMacCrashFileRead(err: NodeJS.ErrnoException | undefined | null, d
|
||||
logMacCrashTelemetry(data);
|
||||
}
|
||||
|
||||
async function handleCrashFileRead(crashDirectory: string, crashFile: string, err: NodeJS.ErrnoException | undefined | null, data: string): Promise<void> {
|
||||
async function handleCrashFileRead(crashDirectory: string, crashFile: string, crashDate: Date, err: NodeJS.ErrnoException | undefined | null, data: string): Promise<void> {
|
||||
if (err) {
|
||||
if (err.code === "ENOENT") {
|
||||
return; // ignore known issue
|
||||
@@ -1125,23 +1142,23 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, er
|
||||
|
||||
const lines: string[] = data.split("\n");
|
||||
let addressData: string = ".\n.";
|
||||
data = crashFile + "\n";
|
||||
const isCppToolsSrv: boolean = crashFile.startsWith("cpptools-srv");
|
||||
const telemetryHeader: string = (isCppToolsSrv ? "cpptools-srv.txt" : crashFile) + "\n";
|
||||
const filtPath: string | null = which.sync("c++filt", { nothrow: true });
|
||||
const isMac: boolean = process.platform === "darwin";
|
||||
const startStr: string = isMac ? " _" : "<";
|
||||
const offsetStr: string = isMac ? " + " : "+";
|
||||
const endOffsetStr: string = isMac ? " " : " <";
|
||||
const dotStr: string = "…";
|
||||
data += lines[0]; // signal type
|
||||
const signalType: string = lines[0];
|
||||
let crashCallStack: string = "";
|
||||
for (let lineNum: number = 2; lineNum < lines.length - 3; ++lineNum) { // skip first/last lines
|
||||
if (lineNum > 1) {
|
||||
data += "\n";
|
||||
addressData += "\n";
|
||||
}
|
||||
crashCallStack += "\n";
|
||||
addressData += "\n";
|
||||
const line: string = lines[lineNum];
|
||||
const startPos: number = line.indexOf(startStr);
|
||||
if (startPos === -1 || line[startPos + (isMac ? 1 : 4)] === "+") {
|
||||
data += dotStr;
|
||||
crashCallStack += dotStr;
|
||||
const startAddressPos: number = line.indexOf("0x");
|
||||
const endAddressPos: number = line.indexOf(endOffsetStr, startAddressPos + 2);
|
||||
if (startAddressPos === -1 || endAddressPos === -1 || startAddressPos >= endAddressPos) {
|
||||
@@ -1153,7 +1170,7 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, er
|
||||
}
|
||||
const offsetPos: number = line.indexOf(offsetStr, startPos + startStr.length);
|
||||
if (offsetPos === -1) {
|
||||
data += "Missing offsetStr";
|
||||
crashCallStack += "Missing offsetStr";
|
||||
continue; // unexpected
|
||||
}
|
||||
const startPos2: number = startPos + 1;
|
||||
@@ -1173,36 +1190,49 @@ async function handleCrashFileRead(crashDirectory: string, crashFile: string, er
|
||||
funcStr = funcStr.replace(/, std::allocator<std::string>/g, "");
|
||||
}
|
||||
}
|
||||
data += funcStr + offsetStr;
|
||||
crashCallStack += funcStr + offsetStr;
|
||||
const offsetPos2: number = offsetPos + offsetStr.length;
|
||||
if (isMac) {
|
||||
data += line.substring(offsetPos2);
|
||||
crashCallStack += line.substring(offsetPos2);
|
||||
const startAddressPos: number = line.indexOf("0x");
|
||||
if (startAddressPos === -1 || startAddressPos >= startPos) {
|
||||
// unexpected
|
||||
data += "<Missing 0x>";
|
||||
crashCallStack += "<Missing 0x>";
|
||||
continue;
|
||||
}
|
||||
addressData += `${line.substring(startAddressPos, startPos)}`;
|
||||
} else {
|
||||
const endPos: number = line.indexOf(">", offsetPos2);
|
||||
if (endPos === -1) {
|
||||
data += "<Missing > >";
|
||||
crashCallStack += "<Missing > >";
|
||||
continue; // unexpected
|
||||
}
|
||||
data += line.substring(offsetPos2, endPos);
|
||||
crashCallStack += line.substring(offsetPos2, endPos);
|
||||
}
|
||||
}
|
||||
|
||||
if (crashCallStack !== prevCppCrashCallStackData) {
|
||||
prevCppCrashCallStackData = crashCallStack;
|
||||
|
||||
const settings: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp", null);
|
||||
if (lines.length >= 6 && util.getNumericLoggingLevel(settings.get<string>("loggingLevel")) >= 1) {
|
||||
const out: vscode.OutputChannel = getCrashCallStacksChannel();
|
||||
out.appendLine(`\n${isCppToolsSrv ? "cpptools-srv" : "cpptools"}\n${crashDate.toLocaleString()}\n${signalType}${crashCallStack}`);
|
||||
}
|
||||
}
|
||||
|
||||
data = telemetryHeader + signalType + crashCallStack;
|
||||
|
||||
if (data.length > 8192) { // The API has an 8k limit.
|
||||
data = data.substring(0, 8191) + "…";
|
||||
}
|
||||
|
||||
console.log(`Crash call stack:\n${data}`);
|
||||
logCppCrashTelemetry(data, addressData);
|
||||
|
||||
await util.deleteFile(path.resolve(crashDirectory, crashFile)).catch(logAndReturn.undefined);
|
||||
void util.deleteDirectory(crashDirectory).catch(logAndReturn.undefined);
|
||||
if (crashFile === "cpptools.txt") {
|
||||
void util.deleteDirectory(crashDirectory).catch(logAndReturn.undefined);
|
||||
}
|
||||
}
|
||||
|
||||
export function deactivate(): Thenable<void> {
|
||||
|
||||
@@ -74,6 +74,7 @@ export class Logger {
|
||||
|
||||
export let outputChannel: vscode.OutputChannel | undefined;
|
||||
export let diagnosticsChannel: vscode.OutputChannel | undefined;
|
||||
export let crashCallStacksChannel: vscode.OutputChannel | undefined;
|
||||
export let debugChannel: vscode.OutputChannel | undefined;
|
||||
export let warningChannel: vscode.OutputChannel | undefined;
|
||||
export let sshChannel: vscode.OutputChannel | undefined;
|
||||
@@ -98,6 +99,16 @@ export function getDiagnosticsChannel(): vscode.OutputChannel {
|
||||
return diagnosticsChannel;
|
||||
}
|
||||
|
||||
export function getCrashCallStacksChannel(): vscode.OutputChannel {
|
||||
if (!crashCallStacksChannel) {
|
||||
crashCallStacksChannel = vscode.window.createOutputChannel(localize("c.cpp.crash.call.stacks.title", "C/C++ Crash Call Stacks"));
|
||||
crashCallStacksChannel.appendLine(localize({ key: "c.cpp.crash.call.stacks.description", comment: ["{0} is a URL."] },
|
||||
"A C/C++ extension process has crashed. The crashing process name, date/time, signal, and call stack are below -- it would be helpful to include that in a bug report at {0}.",
|
||||
"https://github.com/Microsoft/vscode-cpptools/issues"));
|
||||
}
|
||||
return crashCallStacksChannel;
|
||||
}
|
||||
|
||||
export function getSshChannel(): vscode.OutputChannel {
|
||||
if (!sshChannel) {
|
||||
sshChannel = vscode.window.createOutputChannel(localize("c.cpp.ssh.channel", "{0}: SSH", "Cpptools"));
|
||||
|
||||
Reference in New Issue
Block a user