File: CommandObjectHealthcheck.cpp

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (71 lines) | stat: -rw-r--r-- 2,748 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//===-- CommandObjectHealthcheck.cpp --------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "CommandObjectHealthcheck.h"

#include "lldb/Host/FileSystem.h"
#include "lldb/Host/Host.h"
#include "lldb/Host/HostInfo.h"
#include "lldb/Interpreter/CommandReturnObject.h"
#include "lldb/Utility/Log.h"
#include "lldb/lldb-private.h"

#include "Plugins/Language/Swift/LogChannelSwift.h"

using namespace lldb;
using namespace lldb_private;

CommandObjectHealthcheck::CommandObjectHealthcheck(
    CommandInterpreter &interpreter)
    : CommandObjectParsed(
          interpreter, "swift-healthcheck",
          "Provides logging related to the Swift expression evaluator, "
          "including Swift compiler diagnostics. This makes it easier to "
          "identify project misconfigurations that result in module import "
          "failures in the debugger. The command is meant to be run after a "
          "expression evaluator failure has occurred.") {}

void CommandObjectHealthcheck::DoExecute(Args &args,
                                         CommandReturnObject &result) {
  std::error_code err;
  llvm::SmallString<128> temp_path;
  int temp_fd = -1;
  if (FileSpec temp_file_spec = HostInfo::GetProcessTempDir()) {
    temp_file_spec.AppendPathComponent("lldb-healthcheck-%%%%%%.log");
    err = llvm::sys::fs::createUniqueFile(temp_file_spec.GetPath(), temp_fd,
                                          temp_path);
  } else {
    err = llvm::sys::fs::createTemporaryFile("lldb-healthcheck", "log", temp_fd,
                                             temp_path);
  }

  if (temp_fd == -1) {
    result.AppendErrorWithFormat("could not write to temp file %s",
                                 err.message().c_str());
    return;
  }

  llvm::raw_fd_ostream temp_stream(temp_fd, true, true);
  llvm::StringRef data = GetSwiftHealthLogData();
  temp_stream << data;

  result.AppendMessageWithFormat("Health check written to %s\n",
                                 temp_path.c_str());
#if defined(__APPLE__)
  // When in an interactive graphical session and not, for example,
  // running LLDB running over ssh, open the log file straight away in
  // the user's configured editor or the default Console.app otherwise.
  if (llvm::StringRef(getprogname()).starts_with("lldb") &&
      Host::IsInteractiveGraphicSession()) {
    if (llvm::Error err =
            Host::OpenFileInExternalEditor("", FileSpec(temp_path), 0))
      return;
  }
#endif

}