summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMed Ismail Bennani <medismail.bennani@gmail.com>2022-03-08 16:34:31 -0800
committerMed Ismail Bennani <medismail.bennani@gmail.com>2022-03-10 11:06:59 -0800
commit8d097a6b932c8eb0ee114282aa5456f1d0242d01 (patch)
tree53c18281b133b6f987f48a58d5d6955b052cbd66
parentd538ad53c36b1e152f0feeacf9cdd1ae1cb85963 (diff)
[lldb/crashlog] Make interactive mode display more user-friendly
This patch makes the crashlog interactive mode show the scripted process status with the crashed scripted thread backtrace after launching it. rdar://89634338 Differential Revision: https://reviews.llvm.org/D121038 Signed-off-by: Med Ismail Bennani <medismail.bennani@gmail.com>
-rwxr-xr-xlldb/examples/python/crashlog.py28
-rw-r--r--lldb/test/Shell/ScriptInterpreter/Python/Crashlog/scripted_crashlog_json.test16
2 files changed, 39 insertions, 5 deletions
diff --git a/lldb/examples/python/crashlog.py b/lldb/examples/python/crashlog.py
index 9a669b50d252..50e1ebf625e3 100755
--- a/lldb/examples/python/crashlog.py
+++ b/lldb/examples/python/crashlog.py
@@ -28,8 +28,10 @@
from __future__ import print_function
import cmd
+import contextlib
import datetime
import glob
+import json
import optparse
import os
import platform
@@ -41,7 +43,6 @@ import subprocess
import sys
import time
import uuid
-import json
try:
# First try for LLDB in case PYTHONPATH is already correctly setup.
@@ -1017,6 +1018,31 @@ def load_crashlog_in_scripted_process(debugger, crash_log_file):
error = lldb.SBError()
process = target.Launch(launch_info, error)
+ if not process or error.Fail():
+ return
+
+ @contextlib.contextmanager
+ def synchronous(debugger):
+ async_state = debugger.GetAsync()
+ debugger.SetAsync(False)
+ try:
+ yield
+ finally:
+ debugger.SetAsync(async_state)
+
+ with synchronous(debugger):
+ run_options = lldb.SBCommandInterpreterRunOptions()
+ run_options.SetStopOnError(True)
+ run_options.SetStopOnCrash(True)
+ run_options.SetEchoCommands(True)
+
+ commands_stream = lldb.SBStream()
+ commands_stream.Print("process status\n")
+ commands_stream.Print("thread backtrace\n")
+ error = debugger.SetInputString(commands_stream.GetData())
+ if error.Success():
+ debugger.RunCommandInterpreter(True, False, run_options, 0, False, True)
+
def CreateSymbolicateCrashLogOptions(
command_name,
description,
diff --git a/lldb/test/Shell/ScriptInterpreter/Python/Crashlog/scripted_crashlog_json.test b/lldb/test/Shell/ScriptInterpreter/Python/Crashlog/scripted_crashlog_json.test
index c82c183378d3..10ceb362a6ce 100644
--- a/lldb/test/Shell/ScriptInterpreter/Python/Crashlog/scripted_crashlog_json.test
+++ b/lldb/test/Shell/ScriptInterpreter/Python/Crashlog/scripted_crashlog_json.test
@@ -4,9 +4,17 @@
# RUN: cp %S/Inputs/scripted_crashlog.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 -i %t.crash' -o 'process status' 2>&1 | FileCheck %s
+# RUN: %lldb %t.out -o 'command script import lldb.macosx.crashlog' -o 'crashlog -i %t.crash' 2>&1 | FileCheck %s
# CHECK: "crashlog" {{.*}} commands have been installed, use the "--help" options on these commands
-# CHECK: Process 92190 stopped
-# CHECK: * thread #1, name = 'CrashLogScriptedThread.thread-0', stop reason = EXC_BAD_ACCESS
-# CHECK: frame #0: 0x0000000104a23f68 scripted_crashlog_json.test.tmp.out`foo at test.c:3:6 [artificial]
+# CHECK: (lldb) process status
+# CHECK-NEXT: Process 92190 stopped
+# CHECK-NEXT: * thread #1, name = 'CrashLogScriptedThread.thread-0', stop reason = EXC_BAD_ACCESS
+# CHECK-NEXT: frame #0: 0x0000000104a23f68 scripted_crashlog_json.test.tmp.out`foo at test.c:3:6 [artificial]
+
+# CHECK: (lldb) thread backtrace
+# CHECK-NEXT: * thread #1, name = 'CrashLogScriptedThread.thread-0', stop reason = EXC_BAD_ACCESS
+# CHECK-NEXT: * frame #0: 0x0000000104a23f68 scripted_crashlog_json.test.tmp.out`foo at test.c:3:6 [artificial]
+# CHECK-NEXT: frame #1: 0x0000000104a23f80 scripted_crashlog_json.test.tmp.out`bar at test.c:6:21 [artificial]
+# CHECK-NEXT: frame #2: 0x0000000104a23fa0 scripted_crashlog_json.test.tmp.out`main(argc=<no summary available>, argv=<unavailable>) at test.c:8:35 [artificial]
+# CHECK-NEXT: frame #3: 0x0000000104a6108c dyld`start(kernArgs=<no summary available>) at dyldMain.cpp:879:18 [opt] [artificial]