Skip to content

Revert "[lldb/crashlog] Make interactive mode the new default" #96263

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 48 additions & 76 deletions lldb/examples/python/crashlog.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
import concurrent.futures
import contextlib
import datetime
import enum
import json
import os
import platform
Expand All @@ -46,6 +45,7 @@
import time
import uuid


print_lock = threading.RLock()

try:
Expand Down Expand Up @@ -1582,12 +1582,9 @@ def synchronous(debugger):
debugger.RunCommandInterpreter(True, False, run_options, 0, False, True)


class CrashLogLoadingMode(str, enum.Enum):
batch = "batch"
interactive = "interactive"


def CreateSymbolicateCrashLogOptions(command_name, description):
def CreateSymbolicateCrashLogOptions(
command_name, description, add_interactive_options
):
usage = "crashlog [options] <FILE> [FILE ...]"
arg_parser = argparse.ArgumentParser(
description=description,
Expand All @@ -1603,12 +1600,6 @@ def CreateSymbolicateCrashLogOptions(command_name, description):
help="crash report(s) to symbolicate",
)

arg_parser.add_argument(
"-m",
"--mode",
choices=[mode.value for mode in CrashLogLoadingMode],
help="change how the symbolicated process and threads are displayed to the user (default: interactive)",
)
arg_parser.add_argument(
"--version",
"-V",
Expand Down Expand Up @@ -1745,35 +1736,36 @@ def CreateSymbolicateCrashLogOptions(command_name, description):
help=argparse.SUPPRESS,
default=False,
)
arg_parser.add_argument(
"--target",
"-t",
dest="target_path",
help="the target binary path that should be used for interactive crashlog (optional)",
default=None,
)
arg_parser.add_argument(
"--skip-status",
"-s",
dest="skip_status",
action="store_true",
help="prevent the interactive crashlog to dump the process status and thread backtrace at launch",
default=False,
)
legacy_group = arg_parser.add_mutually_exclusive_group()
legacy_group.add_argument(
"-i",
"--interactive",
action="store_true",
help=argparse.SUPPRESS,
)
legacy_group.add_argument(
"-b",
"--batch",
action="store_true",
help=argparse.SUPPRESS,
)

if add_interactive_options:
arg_parser.add_argument(
"-i",
"--interactive",
action="store_true",
help="parse a crash log and load it in a ScriptedProcess",
default=False,
)
arg_parser.add_argument(
"-b",
"--batch",
action="store_true",
help="dump symbolicated stackframes without creating a debug session",
default=True,
)
arg_parser.add_argument(
"--target",
"-t",
dest="target_path",
help="the target binary path that should be used for interactive crashlog (optional)",
default=None,
)
arg_parser.add_argument(
"--skip-status",
"-s",
dest="skip_status",
action="store_true",
help="prevent the interactive crashlog to dump the process status and thread backtrace at launch",
default=False,
)
return arg_parser


Expand All @@ -1786,7 +1778,7 @@ def CrashLogOptionParser():
created that has all of the shared libraries loaded at the load addresses found in the crash log file. This allows
you to explore the program as if it were stopped at the locations described in the crash log and functions can
be disassembled and lookups can be performed using the addresses found in the crash log."""
return CreateSymbolicateCrashLogOptions("crashlog", description)
return CreateSymbolicateCrashLogOptions("crashlog", description, True)


def SymbolicateCrashLogs(debugger, command_args, result, is_command):
Expand All @@ -1802,35 +1794,8 @@ def SymbolicateCrashLogs(debugger, command_args, result, is_command):
result.SetError(str(e))
return

# To avoid breaking existing users, we should keep supporting legacy flags
# even if we don't use them / advertise them anymore.
if not options.mode:
if options.batch:
options.mode = CrashLogLoadingMode.batch
else:
options.mode = CrashLogLoadingMode.interactive

if options.mode != CrashLogLoadingMode.interactive and (
options.target_path or options.skip_status
):
print(
"Target path (-t) and skipping process status (-s) options can only used in interactive mode (-m=interactive)."
)
print("Aborting symbolication.")
arg_parser.print_help()
return

if options.version:
print(debugger.GetVersionString())
return

if options.debug:
print("command_args = %s" % command_args)
print("options", options)
print("args", options.reports)

# Interactive mode requires running the crashlog command from inside lldb.
if options.mode == CrashLogLoadingMode.interactive and not is_command:
if options.interactive and not is_command:
lldb_exec = (
subprocess.check_output(["/usr/bin/xcrun", "-f", "lldb"])
.decode("utf-8")
Expand All @@ -1856,24 +1821,31 @@ def SymbolicateCrashLogs(debugger, command_args, result, is_command):
print(debugger.GetVersionString())
return

if options.debug:
print("command_args = %s" % command_args)
print("options", options)
print("args", options.reports)

if options.debug_delay > 0:
print("Waiting %u seconds for debugger to attach..." % options.debug_delay)
time.sleep(options.debug_delay)
error = lldb.SBError()

def should_run_in_interactive_mode(options, ci):
if options.mode == CrashLogLoadingMode.batch:
return False
elif ci and ci.IsInteractive():
if options.interactive:
return True
elif options.batch:
return False
# elif ci and ci.IsInteractive():
# return True
else:
return sys.stdout.isatty()
return False

ci = debugger.GetCommandInterpreter()

if options.reports:
for crashlog_file in options.reports:
crashlog_path = os.path.normpath(os.path.expanduser(crashlog_file))
crashlog_path = os.path.expanduser(crashlog_file)
if not os.path.exists(crashlog_path):
raise FileNotFoundError(
"crashlog file %s does not exist" % crashlog_path
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# RUN: %clang_host -g %S/Inputs/test.c -o %t.out
# RUN: cp %S/Inputs/altered_threadState.crash %t.crash
# RUN: %python %S/patch-crashlog.py --binary %t.out --crashlog %t.crash --offsets '{"main":20, "bar":9, "foo":16}'
# RUN: %lldb %t.out -o 'command script import lldb.macosx.crashlog' -o 'crashlog -b %t.crash' 2>&1 | FileCheck %s
# RUN: %lldb %t.out -o 'command script import lldb.macosx.crashlog' -o 'crashlog %t.crash' 2>&1 | FileCheck %s

# CHECK: "crashlog" {{.*}} commands have been installed, use the "--help" options on these commands

Expand Down
6 changes: 3 additions & 3 deletions lldb/test/Shell/ScriptInterpreter/Python/Crashlog/json.test
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

# RUN: cp %S/Inputs/a.out.ips %t.crash
# RUN: %python %S/patch-crashlog.py --binary %t.out --crashlog %t.crash --offsets '{"main":20, "bar":9, "foo":16}' --json
# RUN: %lldb %t.out -o 'command script import lldb.macosx.crashlog' -o 'crashlog --mode batch %t.crash' 2>&1 | FileCheck %s
# RUN: %lldb %t.out -o 'command script import lldb.macosx.crashlog' -o 'crashlog --mode batch -c %t.crash' 2>&1 | FileCheck %s
# RUN: %lldb %t.out -o 'command script import lldb.macosx.crashlog' -o 'crashlog %t.crash' 2>&1 | FileCheck %s
# RUN: %lldb %t.out -o 'command script import lldb.macosx.crashlog' -o 'crashlog -c %t.crash' 2>&1 | FileCheck %s

# RUN: cp %S/Inputs/a.out.ips %t.nometadata.crash
# RUN: %python %S/patch-crashlog.py --binary %t.out --crashlog %t.nometadata.crash --offsets '{"main":20, "bar":9, "foo":16}' --json --no-metadata
# RUN: %lldb %t.out -o 'command script import lldb.macosx.crashlog' -o 'crashlog --mode batch %t.nometadata.crash' 2>&1 | FileCheck %s
# RUN: %lldb %t.out -o 'command script import lldb.macosx.crashlog' -o 'crashlog %t.nometadata.crash' 2>&1 | FileCheck %s

# CHECK: "crashlog" {{.*}} commands have been installed, use the "--help" options on these commands

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

# RUN: cp %S/Inputs/no_threadState.ips %t.crash
# RUN: %python %S/patch-crashlog.py --binary %t.out --crashlog %t.crash --offsets '{"main":20, "bar":9, "foo":16}' --json
# RUN: %lldb %t.out -o 'command script import lldb.macosx.crashlog' -o 'crashlog --mode batch %t.crash' 2>&1 | FileCheck %s
# RUN: %lldb %t.out -o 'command script import lldb.macosx.crashlog' -o 'crashlog %t.crash' 2>&1 | FileCheck %s

# CHECK: "crashlog" {{.*}} commands have been installed, use the "--help" options on these commands

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# RUN: mkdir -p %t.dir
# RUN: yaml2obj %S/Inputs/interactive_crashlog/multithread-test.yaml > %t.dir/multithread-test
# RUN: %lldb -b -o 'command script import lldb.macosx.crashlog' \
# RUN: -o 'crashlog -a -s -t %t.dir/multithread-test %S/Inputs/interactive_crashlog/multithread-test.ips' \
# RUN: -o 'crashlog -a -i -s -t %t.dir/multithread-test %S/Inputs/interactive_crashlog/multithread-test.ips' \
# RUN: -o 'command source -s 0 %s' 2>&1 | FileCheck %s

# CHECK: "crashlog" {{.*}} commands have been installed, use the "--help" options on these commands
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# RUN: %clang_host -g %S/Inputs/test.c -o %t.out
# RUN: cp %S/Inputs/a.out.crash %t.crash
# RUN: %python %S/patch-crashlog.py --binary %t.out --crashlog %t.crash --offsets '{"main":20, "bar":9, "foo":16}'
# RUN: %lldb %t.out -o 'command script import lldb.macosx.crashlog' -o 'crashlog -b %t.crash' 2>&1 | FileCheck %s
# RUN: %lldb %t.out -o 'command script import lldb.macosx.crashlog' -o 'crashlog %t.crash' 2>&1 | FileCheck %s

# CHECK: "crashlog" {{.*}} commands have been installed, use the "--help" options on these commands

Expand Down
Loading