3 # ----------------------------------------------------------------------
4 # This module will enable GDB remote packet logging when the
5 # 'start_gdb_log' command is called with a filename to log to. When the
6 # 'stop_gdb_log' command is called, it will disable the logging and
7 # print out statistics about how long commands took to execute and also
9 # Be sure to add the python path that points to the LLDB shared library.
11 # To use this in the embedded python interpreter using "lldb" just
12 # import it with the full path using the "command script import"
13 # command. This can be done from the LLDB command line:
14 # (lldb) command script import /path/to/gdbremote.py
15 # Or it can be added to your ~/.lldbinit file so this module is always
17 # ----------------------------------------------------------------------
26 def start_gdb_log(debugger
, command
, result
, dict):
27 """Start logging GDB remote packets by enabling logging with timestamps and
28 thread safe logging. Follow a call to this function with a call to "stop_gdb_log"
29 in order to dump out the commands."""
33 'error: logging is already in progress with file "%s"', log_file
38 log_file
= tempfile
.mktemp()
43 debugger
.HandleCommand(
44 'log enable --threadsafe --timestamp --file "%s" gdb-remote packets'
48 "GDB packet logging enable with log file '%s'\nUse the 'stop_gdb_log' command to stop logging and show packet statistics."
53 result
.PutCString("error: invalid log file path")
54 result
.PutCString(usage
)
57 def parse_time_log(debugger
, command
, result
, dict):
58 # Any commands whose names might be followed by more valid C identifier
59 # characters must be listed here
60 command_args
= shlex
.split(command
)
61 parse_time_log_args(command_args
)
64 def parse_time_log_args(command_args
):
65 usage
= "usage: parse_time_log [options] [<LOGFILEPATH>]"
66 description
= """Parse a log file that contains timestamps and convert the timestamps to delta times between log lines."""
67 parser
= optparse
.OptionParser(
68 description
=description
, prog
="parse_time_log", usage
=usage
75 help="display verbose debug info",
79 (options
, args
) = parser
.parse_args(command_args
)
83 parse_log_file(log_file
, options
)
86 def parse_log_file(file, options
):
87 """Parse a log file that was contains timestamps. These logs are typically
89 (lldb) log enable --threadsafe --timestamp --file <FILE> ....
91 This log file will contain timestamps and this function will then normalize
92 those packets to be relative to the first value timestamp that is found and
93 show delta times between log lines and also keep track of how long it takes
94 for GDB remote commands to make a send/receive round trip. This can be
95 handy when trying to figure out why some operation in the debugger is taking
96 a long time during a preset set of debugger commands."""
98 print("#----------------------------------------------------------------------")
99 print("# Log file: '%s'" % file)
100 print("#----------------------------------------------------------------------")
102 timestamp_regex
= re
.compile("(\s*)([1-9][0-9]+\.[0-9]+)([^0-9].*)$")
107 lines
= file.read().splitlines()
109 match
= timestamp_regex
.match(line
)
111 curr_time
= float(match
.group(2))
114 delta
= curr_time
- last_time
116 base_time
= curr_time
120 % (match
.group(1), curr_time
- base_time
, delta
, match
.group(3))
122 last_time
= curr_time
127 if __name__
== "__main__":
130 parse_time_log_args(sys
.argv
[1:])
133 def __lldb_init_module(debugger
, internal_dict
):
134 # This initializer is being run from LLDB in the embedded command interpreter
135 # Add any commands contained in this module to LLDB
136 debugger
.HandleCommand(
137 "command script add -o -f delta.parse_time_log parse_time_log"
140 'The "parse_time_log" command is now installed and ready for use, type "parse_time_log --help" for more information'