31
31
import concurrent .futures
32
32
import contextlib
33
33
import datetime
34
- import enum
35
34
import json
36
35
import os
37
36
import platform
46
45
import time
47
46
import uuid
48
47
48
+
49
49
print_lock = threading .RLock ()
50
50
51
51
try :
@@ -1582,12 +1582,9 @@ def synchronous(debugger):
1582
1582
debugger .RunCommandInterpreter (True , False , run_options , 0 , False , True )
1583
1583
1584
1584
1585
- class CrashLogLoadingMode (str , enum .Enum ):
1586
- batch = "batch"
1587
- interactive = "interactive"
1588
-
1589
-
1590
- def CreateSymbolicateCrashLogOptions (command_name , description ):
1585
+ def CreateSymbolicateCrashLogOptions (
1586
+ command_name , description , add_interactive_options
1587
+ ):
1591
1588
usage = "crashlog [options] <FILE> [FILE ...]"
1592
1589
arg_parser = argparse .ArgumentParser (
1593
1590
description = description ,
@@ -1603,12 +1600,6 @@ def CreateSymbolicateCrashLogOptions(command_name, description):
1603
1600
help = "crash report(s) to symbolicate" ,
1604
1601
)
1605
1602
1606
- arg_parser .add_argument (
1607
- "-m" ,
1608
- "--mode" ,
1609
- choices = [mode .value for mode in CrashLogLoadingMode ],
1610
- help = "change how the symbolicated process and threads are displayed to the user (default: interactive)" ,
1611
- )
1612
1603
arg_parser .add_argument (
1613
1604
"--version" ,
1614
1605
"-V" ,
@@ -1745,35 +1736,36 @@ def CreateSymbolicateCrashLogOptions(command_name, description):
1745
1736
help = argparse .SUPPRESS ,
1746
1737
default = False ,
1747
1738
)
1748
- arg_parser .add_argument (
1749
- "--target" ,
1750
- "-t" ,
1751
- dest = "target_path" ,
1752
- help = "the target binary path that should be used for interactive crashlog (optional)" ,
1753
- default = None ,
1754
- )
1755
- arg_parser .add_argument (
1756
- "--skip-status" ,
1757
- "-s" ,
1758
- dest = "skip_status" ,
1759
- action = "store_true" ,
1760
- help = "prevent the interactive crashlog to dump the process status and thread backtrace at launch" ,
1761
- default = False ,
1762
- )
1763
- legacy_group = arg_parser .add_mutually_exclusive_group ()
1764
- legacy_group .add_argument (
1765
- "-i" ,
1766
- "--interactive" ,
1767
- action = "store_true" ,
1768
- help = argparse .SUPPRESS ,
1769
- )
1770
- legacy_group .add_argument (
1771
- "-b" ,
1772
- "--batch" ,
1773
- action = "store_true" ,
1774
- help = argparse .SUPPRESS ,
1775
- )
1776
-
1739
+ if add_interactive_options :
1740
+ arg_parser .add_argument (
1741
+ "-i" ,
1742
+ "--interactive" ,
1743
+ action = "store_true" ,
1744
+ help = "parse a crash log and load it in a ScriptedProcess" ,
1745
+ default = False ,
1746
+ )
1747
+ arg_parser .add_argument (
1748
+ "-b" ,
1749
+ "--batch" ,
1750
+ action = "store_true" ,
1751
+ help = "dump symbolicated stackframes without creating a debug session" ,
1752
+ default = True ,
1753
+ )
1754
+ arg_parser .add_argument (
1755
+ "--target" ,
1756
+ "-t" ,
1757
+ dest = "target_path" ,
1758
+ help = "the target binary path that should be used for interactive crashlog (optional)" ,
1759
+ default = None ,
1760
+ )
1761
+ arg_parser .add_argument (
1762
+ "--skip-status" ,
1763
+ "-s" ,
1764
+ dest = "skip_status" ,
1765
+ action = "store_true" ,
1766
+ help = "prevent the interactive crashlog to dump the process status and thread backtrace at launch" ,
1767
+ default = False ,
1768
+ )
1777
1769
return arg_parser
1778
1770
1779
1771
@@ -1786,7 +1778,7 @@ def CrashLogOptionParser():
1786
1778
created that has all of the shared libraries loaded at the load addresses found in the crash log file. This allows
1787
1779
you to explore the program as if it were stopped at the locations described in the crash log and functions can
1788
1780
be disassembled and lookups can be performed using the addresses found in the crash log."""
1789
- return CreateSymbolicateCrashLogOptions ("crashlog" , description )
1781
+ return CreateSymbolicateCrashLogOptions ("crashlog" , description , True )
1790
1782
1791
1783
1792
1784
def SymbolicateCrashLogs (debugger , command_args , result , is_command ):
@@ -1802,35 +1794,8 @@ def SymbolicateCrashLogs(debugger, command_args, result, is_command):
1802
1794
result .SetError (str (e ))
1803
1795
return
1804
1796
1805
- # To avoid breaking existing users, we should keep supporting legacy flags
1806
- # even if we don't use them / advertise them anymore.
1807
- if not options .mode :
1808
- if options .batch :
1809
- options .mode = CrashLogLoadingMode .batch
1810
- else :
1811
- options .mode = CrashLogLoadingMode .interactive
1812
-
1813
- if options .mode != CrashLogLoadingMode .interactive and (
1814
- options .target_path or options .skip_status
1815
- ):
1816
- print (
1817
- "Target path (-t) and skipping process status (-s) options can only used in interactive mode (-m=interactive)."
1818
- )
1819
- print ("Aborting symbolication." )
1820
- arg_parser .print_help ()
1821
- return
1822
-
1823
- if options .version :
1824
- print (debugger .GetVersionString ())
1825
- return
1826
-
1827
- if options .debug :
1828
- print ("command_args = %s" % command_args )
1829
- print ("options" , options )
1830
- print ("args" , options .reports )
1831
-
1832
1797
# Interactive mode requires running the crashlog command from inside lldb.
1833
- if options .mode == CrashLogLoadingMode . interactive and not is_command :
1798
+ if options .interactive and not is_command :
1834
1799
lldb_exec = (
1835
1800
subprocess .check_output (["/usr/bin/xcrun" , "-f" , "lldb" ])
1836
1801
.decode ("utf-8" )
@@ -1856,24 +1821,31 @@ def SymbolicateCrashLogs(debugger, command_args, result, is_command):
1856
1821
print (debugger .GetVersionString ())
1857
1822
return
1858
1823
1824
+ if options .debug :
1825
+ print ("command_args = %s" % command_args )
1826
+ print ("options" , options )
1827
+ print ("args" , options .reports )
1828
+
1859
1829
if options .debug_delay > 0 :
1860
1830
print ("Waiting %u seconds for debugger to attach..." % options .debug_delay )
1861
1831
time .sleep (options .debug_delay )
1862
1832
error = lldb .SBError ()
1863
1833
1864
1834
def should_run_in_interactive_mode (options , ci ):
1865
- if options .mode == CrashLogLoadingMode .batch :
1866
- return False
1867
- elif ci and ci .IsInteractive ():
1835
+ if options .interactive :
1868
1836
return True
1837
+ elif options .batch :
1838
+ return False
1839
+ # elif ci and ci.IsInteractive():
1840
+ # return True
1869
1841
else :
1870
- return sys . stdout . isatty ()
1842
+ return False
1871
1843
1872
1844
ci = debugger .GetCommandInterpreter ()
1873
1845
1874
1846
if options .reports :
1875
1847
for crashlog_file in options .reports :
1876
- crashlog_path = os .path .normpath ( os . path . expanduser (crashlog_file ) )
1848
+ crashlog_path = os .path .expanduser (crashlog_file )
1877
1849
if not os .path .exists (crashlog_path ):
1878
1850
raise FileNotFoundError (
1879
1851
"crashlog file %s does not exist" % crashlog_path
0 commit comments