blob: d114aaa2b40bb9f4539ae1077ffe621709177ca7 [file] [log] [blame]
Johnny Chen30ee4ef2010-09-08 22:54:46 +00001"""
Johnny Chen7ea9aee2010-10-07 21:38:28 +00002This LLDB module contains miscellaneous utilities.
Johnny Chenb411b982011-05-13 21:55:30 +00003Some of the test suite takes advantage of the utility functions defined here.
4They can also be useful for general purpose lldb scripting.
Johnny Chen30ee4ef2010-09-08 22:54:46 +00005"""
6
Zachary Turnerff890da2015-10-19 23:45:41 +00007from __future__ import print_function
Zachary Turnerc1b7cd72015-11-05 19:22:28 +00008from __future__ import absolute_import
Zachary Turnerff890da2015-10-19 23:45:41 +00009
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000010# System modules
11import collections
Adrian Prantl5ec76fe2018-01-30 18:29:16 +000012import errno
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000013import os
Enrico Granata0b5a6e32015-09-18 20:12:52 +000014import re
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000015import sys
Pavel Labatha95e0ef2016-04-06 08:55:31 +000016import time
Johnny Chen30ee4ef2010-09-08 22:54:46 +000017
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000018# Third-party modules
Zachary Turner814236d2015-10-21 17:48:52 +000019from six import StringIO as SixStringIO
Zachary Turnercd236b82015-10-26 18:48:24 +000020import six
Zachary Turnerc1b7cd72015-11-05 19:22:28 +000021
22# LLDB modules
23import lldb
24
Zachary Turner814236d2015-10-21 17:48:52 +000025
Johnny Chen6424b7d2011-04-26 23:07:40 +000026# ===================================================
27# Utilities for locating/checking executable programs
28# ===================================================
Johnny Chen4fdcebd2011-04-26 22:53:38 +000029
Johnny Chenac77f3b2011-03-23 20:28:59 +000030def is_exe(fpath):
Johnny Chen35ec6742011-04-26 23:10:15 +000031 """Returns True if fpath is an executable."""
Johnny Chenac77f3b2011-03-23 20:28:59 +000032 return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
33
Kate Stoneb9c1b512016-09-06 20:57:50 +000034
Johnny Chenac77f3b2011-03-23 20:28:59 +000035def which(program):
Johnny Chen35ec6742011-04-26 23:10:15 +000036 """Returns the full path to a program; None otherwise."""
Johnny Chenac77f3b2011-03-23 20:28:59 +000037 fpath, fname = os.path.split(program)
38 if fpath:
39 if is_exe(program):
40 return program
41 else:
42 for path in os.environ["PATH"].split(os.pathsep):
43 exe_file = os.path.join(path, program)
44 if is_exe(exe_file):
45 return exe_file
46 return None
47
Adrian Prantl5ec76fe2018-01-30 18:29:16 +000048def mkdir_p(path):
49 try:
50 os.makedirs(path)
51 except OSError as e:
52 if e.errno != errno.EEXIST:
53 raise
54 if not os.path.isdir(path):
55 raise OSError(errno.ENOTDIR, "%s is not a directory"%path)
Johnny Chened401982011-03-03 19:14:00 +000056# ===================================================
57# Disassembly for an SBFunction or an SBSymbol object
58# ===================================================
59
Kate Stoneb9c1b512016-09-06 20:57:50 +000060
Johnny Chened401982011-03-03 19:14:00 +000061def disassemble(target, function_or_symbol):
62 """Disassemble the function or symbol given a target.
63
64 It returns the disassembly content in a string object.
65 """
Zachary Turner814236d2015-10-21 17:48:52 +000066 buf = SixStringIO()
Johnny Chened401982011-03-03 19:14:00 +000067 insts = function_or_symbol.GetInstructions(target)
Johnny Chene69c7482011-04-28 22:57:01 +000068 for i in insts:
Zachary Turnerff890da2015-10-19 23:45:41 +000069 print(i, file=buf)
Johnny Chened401982011-03-03 19:14:00 +000070 return buf.getvalue()
71
Johnny Chen43766d62011-03-02 01:36:45 +000072# ==========================================================
73# Integer (byte size 1, 2, 4, and 8) to bytearray conversion
74# ==========================================================
75
Kate Stoneb9c1b512016-09-06 20:57:50 +000076
Johnny Chen43766d62011-03-02 01:36:45 +000077def int_to_bytearray(val, bytesize):
78 """Utility function to convert an integer into a bytearray.
79
Johnny Chen43e587c2011-03-02 20:54:22 +000080 It returns the bytearray in the little endian format. It is easy to get the
81 big endian format, just do ba.reverse() on the returned object.
Johnny Chen43766d62011-03-02 01:36:45 +000082 """
Johnny Chen90bb9052011-03-30 17:54:35 +000083 import struct
Johnny Chen43766d62011-03-02 01:36:45 +000084
85 if bytesize == 1:
86 return bytearray([val])
87
88 # Little endian followed by a format character.
89 template = "<%c"
90 if bytesize == 2:
91 fmt = template % 'h'
92 elif bytesize == 4:
93 fmt = template % 'i'
94 elif bytesize == 4:
95 fmt = template % 'q'
96 else:
97 return None
98
Johnny Chen90bb9052011-03-30 17:54:35 +000099 packed = struct.pack(fmt, val)
Zachary Turner44073962016-01-25 23:21:18 +0000100 return bytearray(packed)
Johnny Chen43766d62011-03-02 01:36:45 +0000101
Kate Stoneb9c1b512016-09-06 20:57:50 +0000102
Johnny Chen43766d62011-03-02 01:36:45 +0000103def bytearray_to_int(bytes, bytesize):
104 """Utility function to convert a bytearray into an integer.
105
Johnny Chen43e587c2011-03-02 20:54:22 +0000106 It interprets the bytearray in the little endian format. For a big endian
107 bytearray, just do ba.reverse() on the object before passing it in.
Johnny Chen43766d62011-03-02 01:36:45 +0000108 """
Johnny Chen90bb9052011-03-30 17:54:35 +0000109 import struct
Johnny Chen43766d62011-03-02 01:36:45 +0000110
111 if bytesize == 1:
Filipe Cabecinhas5d261b02012-07-06 16:20:13 +0000112 return bytes[0]
Johnny Chen43766d62011-03-02 01:36:45 +0000113
114 # Little endian followed by a format character.
115 template = "<%c"
116 if bytesize == 2:
117 fmt = template % 'h'
118 elif bytesize == 4:
119 fmt = template % 'i'
120 elif bytesize == 4:
121 fmt = template % 'q'
122 else:
123 return None
124
Zachary Turner44073962016-01-25 23:21:18 +0000125 unpacked = struct.unpack_from(fmt, bytes)
Johnny Chen43766d62011-03-02 01:36:45 +0000126 return unpacked[0]
127
128
Johnny Chen90256cd2011-04-23 00:13:34 +0000129# ==============================================================
130# Get the description of an lldb object or None if not available
131# ==============================================================
Johnny Chenfc87e2d2011-04-25 20:23:05 +0000132def get_description(obj, option=None):
133 """Calls lldb_obj.GetDescription() and returns a string, or None.
134
Johnny Chen01a67862011-10-14 00:42:25 +0000135 For SBTarget, SBBreakpointLocation, and SBWatchpoint lldb objects, an extra
136 option can be passed in to describe the detailed level of description
137 desired:
Johnny Chenfc87e2d2011-04-25 20:23:05 +0000138 o lldb.eDescriptionLevelBrief
139 o lldb.eDescriptionLevelFull
140 o lldb.eDescriptionLevelVerbose
141 """
142 method = getattr(obj, 'GetDescription')
Johnny Chen90256cd2011-04-23 00:13:34 +0000143 if not method:
144 return None
Johnny Chen01a67862011-10-14 00:42:25 +0000145 tuple = (lldb.SBTarget, lldb.SBBreakpointLocation, lldb.SBWatchpoint)
Johnny Chen469683e2011-09-27 21:27:19 +0000146 if isinstance(obj, tuple):
Johnny Chenfc87e2d2011-04-25 20:23:05 +0000147 if option is None:
148 option = lldb.eDescriptionLevelBrief
149
Johnny Chen90256cd2011-04-23 00:13:34 +0000150 stream = lldb.SBStream()
151 if option is None:
152 success = method(stream)
153 else:
154 success = method(stream, option)
155 if not success:
156 return None
157 return stream.GetData()
Kate Stoneb9c1b512016-09-06 20:57:50 +0000158
Johnny Chen90256cd2011-04-23 00:13:34 +0000159
Johnny Chenf4f70bb2010-10-22 21:31:03 +0000160# =================================================
161# Convert some enum value to its string counterpart
162# =================================================
Johnny Chen28ae2942010-10-07 22:15:58 +0000163
Johnny Chende90f1d2011-04-27 17:43:07 +0000164def state_type_to_str(enum):
Johnny Chen28ae2942010-10-07 22:15:58 +0000165 """Returns the stateType string given an enum."""
166 if enum == lldb.eStateInvalid:
Johnny Chen8b6b1892010-10-18 15:46:54 +0000167 return "invalid"
Johnny Chen28ae2942010-10-07 22:15:58 +0000168 elif enum == lldb.eStateUnloaded:
Johnny Chen8b6b1892010-10-18 15:46:54 +0000169 return "unloaded"
Johnny Chen930e3ad2011-03-05 01:20:11 +0000170 elif enum == lldb.eStateConnected:
171 return "connected"
Johnny Chen28ae2942010-10-07 22:15:58 +0000172 elif enum == lldb.eStateAttaching:
Johnny Chen8b6b1892010-10-18 15:46:54 +0000173 return "attaching"
Johnny Chen28ae2942010-10-07 22:15:58 +0000174 elif enum == lldb.eStateLaunching:
Johnny Chen8b6b1892010-10-18 15:46:54 +0000175 return "launching"
Johnny Chen28ae2942010-10-07 22:15:58 +0000176 elif enum == lldb.eStateStopped:
Johnny Chen8b6b1892010-10-18 15:46:54 +0000177 return "stopped"
Johnny Chen28ae2942010-10-07 22:15:58 +0000178 elif enum == lldb.eStateRunning:
Johnny Chen8b6b1892010-10-18 15:46:54 +0000179 return "running"
Johnny Chen28ae2942010-10-07 22:15:58 +0000180 elif enum == lldb.eStateStepping:
Johnny Chen8b6b1892010-10-18 15:46:54 +0000181 return "stepping"
Johnny Chen28ae2942010-10-07 22:15:58 +0000182 elif enum == lldb.eStateCrashed:
Johnny Chen8b6b1892010-10-18 15:46:54 +0000183 return "crashed"
Johnny Chen28ae2942010-10-07 22:15:58 +0000184 elif enum == lldb.eStateDetached:
Johnny Chen8b6b1892010-10-18 15:46:54 +0000185 return "detached"
Johnny Chen28ae2942010-10-07 22:15:58 +0000186 elif enum == lldb.eStateExited:
Johnny Chen8b6b1892010-10-18 15:46:54 +0000187 return "exited"
Johnny Chen28ae2942010-10-07 22:15:58 +0000188 elif enum == lldb.eStateSuspended:
Johnny Chen8b6b1892010-10-18 15:46:54 +0000189 return "suspended"
Johnny Chen28ae2942010-10-07 22:15:58 +0000190 else:
Johnny Chen930e3ad2011-03-05 01:20:11 +0000191 raise Exception("Unknown StateType enum")
Johnny Chen28ae2942010-10-07 22:15:58 +0000192
Kate Stoneb9c1b512016-09-06 20:57:50 +0000193
Johnny Chende90f1d2011-04-27 17:43:07 +0000194def stop_reason_to_str(enum):
Johnny Chen28ae2942010-10-07 22:15:58 +0000195 """Returns the stopReason string given an enum."""
196 if enum == lldb.eStopReasonInvalid:
Johnny Chen8b6b1892010-10-18 15:46:54 +0000197 return "invalid"
Johnny Chen28ae2942010-10-07 22:15:58 +0000198 elif enum == lldb.eStopReasonNone:
Johnny Chen8b6b1892010-10-18 15:46:54 +0000199 return "none"
Johnny Chen28ae2942010-10-07 22:15:58 +0000200 elif enum == lldb.eStopReasonTrace:
Johnny Chen8b6b1892010-10-18 15:46:54 +0000201 return "trace"
Johnny Chen28ae2942010-10-07 22:15:58 +0000202 elif enum == lldb.eStopReasonBreakpoint:
Johnny Chen8b6b1892010-10-18 15:46:54 +0000203 return "breakpoint"
Johnny Chen28ae2942010-10-07 22:15:58 +0000204 elif enum == lldb.eStopReasonWatchpoint:
Johnny Chen8b6b1892010-10-18 15:46:54 +0000205 return "watchpoint"
Jim Ingham6cc0d2f2014-04-03 01:25:28 +0000206 elif enum == lldb.eStopReasonExec:
207 return "exec"
Johnny Chen28ae2942010-10-07 22:15:58 +0000208 elif enum == lldb.eStopReasonSignal:
Johnny Chen8b6b1892010-10-18 15:46:54 +0000209 return "signal"
Johnny Chen28ae2942010-10-07 22:15:58 +0000210 elif enum == lldb.eStopReasonException:
Johnny Chen8b6b1892010-10-18 15:46:54 +0000211 return "exception"
Johnny Chen28ae2942010-10-07 22:15:58 +0000212 elif enum == lldb.eStopReasonPlanComplete:
Johnny Chen8b6b1892010-10-18 15:46:54 +0000213 return "plancomplete"
Daniel Maleab3d41a22013-07-09 00:08:01 +0000214 elif enum == lldb.eStopReasonThreadExiting:
215 return "threadexiting"
Johnny Chen28ae2942010-10-07 22:15:58 +0000216 else:
Johnny Chen930e3ad2011-03-05 01:20:11 +0000217 raise Exception("Unknown StopReason enum")
Johnny Chen28ae2942010-10-07 22:15:58 +0000218
Kate Stoneb9c1b512016-09-06 20:57:50 +0000219
Johnny Chena32a13d2011-09-28 00:51:00 +0000220def symbol_type_to_str(enum):
221 """Returns the symbolType string given an enum."""
222 if enum == lldb.eSymbolTypeInvalid:
223 return "invalid"
224 elif enum == lldb.eSymbolTypeAbsolute:
225 return "absolute"
Johnny Chena32a13d2011-09-28 00:51:00 +0000226 elif enum == lldb.eSymbolTypeCode:
227 return "code"
228 elif enum == lldb.eSymbolTypeData:
229 return "data"
230 elif enum == lldb.eSymbolTypeTrampoline:
231 return "trampoline"
232 elif enum == lldb.eSymbolTypeRuntime:
233 return "runtime"
234 elif enum == lldb.eSymbolTypeException:
235 return "exception"
236 elif enum == lldb.eSymbolTypeSourceFile:
237 return "sourcefile"
238 elif enum == lldb.eSymbolTypeHeaderFile:
239 return "headerfile"
240 elif enum == lldb.eSymbolTypeObjectFile:
241 return "objectfile"
242 elif enum == lldb.eSymbolTypeCommonBlock:
243 return "commonblock"
244 elif enum == lldb.eSymbolTypeBlock:
245 return "block"
246 elif enum == lldb.eSymbolTypeLocal:
247 return "local"
248 elif enum == lldb.eSymbolTypeParam:
249 return "param"
250 elif enum == lldb.eSymbolTypeVariable:
251 return "variable"
252 elif enum == lldb.eSymbolTypeVariableType:
253 return "variabletype"
254 elif enum == lldb.eSymbolTypeLineEntry:
255 return "lineentry"
256 elif enum == lldb.eSymbolTypeLineHeader:
257 return "lineheader"
258 elif enum == lldb.eSymbolTypeScopeBegin:
259 return "scopebegin"
260 elif enum == lldb.eSymbolTypeScopeEnd:
261 return "scopeend"
262 elif enum == lldb.eSymbolTypeAdditional:
263 return "additional"
264 elif enum == lldb.eSymbolTypeCompiler:
265 return "compiler"
266 elif enum == lldb.eSymbolTypeInstrumentation:
267 return "instrumentation"
268 elif enum == lldb.eSymbolTypeUndefined:
269 return "undefined"
270
Kate Stoneb9c1b512016-09-06 20:57:50 +0000271
Johnny Chende90f1d2011-04-27 17:43:07 +0000272def value_type_to_str(enum):
Johnny Chen87bb5892010-11-03 21:37:58 +0000273 """Returns the valueType string given an enum."""
274 if enum == lldb.eValueTypeInvalid:
275 return "invalid"
276 elif enum == lldb.eValueTypeVariableGlobal:
277 return "global_variable"
278 elif enum == lldb.eValueTypeVariableStatic:
279 return "static_variable"
280 elif enum == lldb.eValueTypeVariableArgument:
281 return "argument_variable"
282 elif enum == lldb.eValueTypeVariableLocal:
283 return "local_variable"
284 elif enum == lldb.eValueTypeRegister:
285 return "register"
286 elif enum == lldb.eValueTypeRegisterSet:
287 return "register_set"
288 elif enum == lldb.eValueTypeConstResult:
289 return "constant_result"
290 else:
Johnny Chen930e3ad2011-03-05 01:20:11 +0000291 raise Exception("Unknown ValueType enum")
Johnny Chen87bb5892010-11-03 21:37:58 +0000292
Johnny Chen28ae2942010-10-07 22:15:58 +0000293
Johnny Chenf4f70bb2010-10-22 21:31:03 +0000294# ==================================================
Daniel Maleab3d41a22013-07-09 00:08:01 +0000295# Get stopped threads due to each stop reason.
296# ==================================================
297
298def sort_stopped_threads(process,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000299 breakpoint_threads=None,
300 crashed_threads=None,
301 watchpoint_threads=None,
302 signal_threads=None,
303 exiting_threads=None,
304 other_threads=None):
Daniel Maleab3d41a22013-07-09 00:08:01 +0000305 """ Fills array *_threads with threads stopped for the corresponding stop
306 reason.
307 """
308 for lst in [breakpoint_threads,
309 watchpoint_threads,
310 signal_threads,
311 exiting_threads,
312 other_threads]:
313 if lst is not None:
314 lst[:] = []
315
316 for thread in process:
317 dispatched = False
318 for (reason, list) in [(lldb.eStopReasonBreakpoint, breakpoint_threads),
319 (lldb.eStopReasonException, crashed_threads),
320 (lldb.eStopReasonWatchpoint, watchpoint_threads),
321 (lldb.eStopReasonSignal, signal_threads),
322 (lldb.eStopReasonThreadExiting, exiting_threads),
323 (None, other_threads)]:
324 if not dispatched and list is not None:
325 if thread.GetStopReason() == reason or reason is None:
326 list.append(thread)
327 dispatched = True
328
329# ==================================================
Jim Ingham63dfc722012-09-22 00:05:11 +0000330# Utility functions for setting breakpoints
331# ==================================================
332
Kate Stoneb9c1b512016-09-06 20:57:50 +0000333
334def run_break_set_by_file_and_line(
335 test,
336 file_name,
337 line_number,
338 extra_options=None,
339 num_expected_locations=1,
340 loc_exact=False,
341 module_name=None):
342 """Set a breakpoint by file and line, returning the breakpoint number.
Jim Ingham63dfc722012-09-22 00:05:11 +0000343
344 If extra_options is not None, then we append it to the breakpoint set command.
345
Adrian McCarthy25727a42018-02-21 18:08:23 +0000346 If num_expected_locations is -1, we check that we got AT LEAST one location. If num_expected_locations is -2, we don't
347 check the actual number at all. Otherwise, we check that num_expected_locations equals the number of locations.
Jim Ingham63dfc722012-09-22 00:05:11 +0000348
349 If loc_exact is true, we check that there is one location, and that location must be at the input file and line number."""
350
Kate Stoneb9c1b512016-09-06 20:57:50 +0000351 if file_name is None:
352 command = 'breakpoint set -l %d' % (line_number)
Jim Ingham63dfc722012-09-22 00:05:11 +0000353 else:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000354 command = 'breakpoint set -f "%s" -l %d' % (file_name, line_number)
Jim Ingham63dfc722012-09-22 00:05:11 +0000355
Greg Claytonc1b2ccf2013-01-08 00:01:36 +0000356 if module_name:
357 command += " --shlib '%s'" % (module_name)
358
Jim Ingham63dfc722012-09-22 00:05:11 +0000359 if extra_options:
360 command += " " + extra_options
361
Kate Stoneb9c1b512016-09-06 20:57:50 +0000362 break_results = run_break_set_command(test, command)
Jim Ingham63dfc722012-09-22 00:05:11 +0000363
364 if num_expected_locations == 1 and loc_exact:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000365 check_breakpoint_result(
366 test,
367 break_results,
368 num_locations=num_expected_locations,
369 file_name=file_name,
370 line_number=line_number,
371 module_name=module_name)
Jim Ingham63dfc722012-09-22 00:05:11 +0000372 else:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000373 check_breakpoint_result(
374 test,
375 break_results,
376 num_locations=num_expected_locations)
Jim Ingham63dfc722012-09-22 00:05:11 +0000377
Kate Stoneb9c1b512016-09-06 20:57:50 +0000378 return get_bpno_from_match(break_results)
Jim Ingham63dfc722012-09-22 00:05:11 +0000379
Kate Stoneb9c1b512016-09-06 20:57:50 +0000380
381def run_break_set_by_symbol(
382 test,
383 symbol,
384 extra_options=None,
385 num_expected_locations=-1,
386 sym_exact=False,
387 module_name=None):
Jim Ingham63dfc722012-09-22 00:05:11 +0000388 """Set a breakpoint by symbol name. Common options are the same as run_break_set_by_file_and_line.
389
390 If sym_exact is true, then the output symbol must match the input exactly, otherwise we do a substring match."""
Kate Stoneb9c1b512016-09-06 20:57:50 +0000391 command = 'breakpoint set -n "%s"' % (symbol)
Greg Claytonc1b2ccf2013-01-08 00:01:36 +0000392
393 if module_name:
394 command += " --shlib '%s'" % (module_name)
395
Jim Ingham63dfc722012-09-22 00:05:11 +0000396 if extra_options:
397 command += " " + extra_options
398
Kate Stoneb9c1b512016-09-06 20:57:50 +0000399 break_results = run_break_set_command(test, command)
Jim Ingham63dfc722012-09-22 00:05:11 +0000400
401 if num_expected_locations == 1 and sym_exact:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000402 check_breakpoint_result(
403 test,
404 break_results,
405 num_locations=num_expected_locations,
406 symbol_name=symbol,
407 module_name=module_name)
Jim Ingham63dfc722012-09-22 00:05:11 +0000408 else:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000409 check_breakpoint_result(
410 test,
411 break_results,
412 num_locations=num_expected_locations)
Jim Ingham63dfc722012-09-22 00:05:11 +0000413
Kate Stoneb9c1b512016-09-06 20:57:50 +0000414 return get_bpno_from_match(break_results)
Jim Ingham63dfc722012-09-22 00:05:11 +0000415
Kate Stoneb9c1b512016-09-06 20:57:50 +0000416
417def run_break_set_by_selector(
418 test,
419 selector,
420 extra_options=None,
421 num_expected_locations=-1,
422 module_name=None):
Jim Ingham63dfc722012-09-22 00:05:11 +0000423 """Set a breakpoint by selector. Common options are the same as run_break_set_by_file_and_line."""
424
Greg Claytonc1b2ccf2013-01-08 00:01:36 +0000425 command = 'breakpoint set -S "%s"' % (selector)
426
427 if module_name:
428 command += ' --shlib "%s"' % (module_name)
429
Jim Ingham63dfc722012-09-22 00:05:11 +0000430 if extra_options:
431 command += " " + extra_options
432
Kate Stoneb9c1b512016-09-06 20:57:50 +0000433 break_results = run_break_set_command(test, command)
Jim Ingham63dfc722012-09-22 00:05:11 +0000434
435 if num_expected_locations == 1:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000436 check_breakpoint_result(
437 test,
438 break_results,
439 num_locations=num_expected_locations,
440 symbol_name=selector,
441 symbol_match_exact=False,
442 module_name=module_name)
Jim Ingham63dfc722012-09-22 00:05:11 +0000443 else:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000444 check_breakpoint_result(
445 test,
446 break_results,
447 num_locations=num_expected_locations)
Jim Ingham63dfc722012-09-22 00:05:11 +0000448
Kate Stoneb9c1b512016-09-06 20:57:50 +0000449 return get_bpno_from_match(break_results)
Jim Ingham63dfc722012-09-22 00:05:11 +0000450
Kate Stoneb9c1b512016-09-06 20:57:50 +0000451
452def run_break_set_by_regexp(
453 test,
454 regexp,
455 extra_options=None,
456 num_expected_locations=-1):
Jim Ingham63dfc722012-09-22 00:05:11 +0000457 """Set a breakpoint by regular expression match on symbol name. Common options are the same as run_break_set_by_file_and_line."""
458
Kate Stoneb9c1b512016-09-06 20:57:50 +0000459 command = 'breakpoint set -r "%s"' % (regexp)
Jim Ingham63dfc722012-09-22 00:05:11 +0000460 if extra_options:
461 command += " " + extra_options
Jim Ingham63dfc722012-09-22 00:05:11 +0000462
Kate Stoneb9c1b512016-09-06 20:57:50 +0000463 break_results = run_break_set_command(test, command)
Jim Ingham63dfc722012-09-22 00:05:11 +0000464
Kate Stoneb9c1b512016-09-06 20:57:50 +0000465 check_breakpoint_result(
466 test,
467 break_results,
468 num_locations=num_expected_locations)
469
470 return get_bpno_from_match(break_results)
471
472
473def run_break_set_by_source_regexp(
474 test,
475 regexp,
476 extra_options=None,
477 num_expected_locations=-1):
Jim Ingham63dfc722012-09-22 00:05:11 +0000478 """Set a breakpoint by source regular expression. Common options are the same as run_break_set_by_file_and_line."""
Kate Stoneb9c1b512016-09-06 20:57:50 +0000479 command = 'breakpoint set -p "%s"' % (regexp)
Jim Ingham63dfc722012-09-22 00:05:11 +0000480 if extra_options:
481 command += " " + extra_options
Jim Ingham63dfc722012-09-22 00:05:11 +0000482
Kate Stoneb9c1b512016-09-06 20:57:50 +0000483 break_results = run_break_set_command(test, command)
Jim Ingham63dfc722012-09-22 00:05:11 +0000484
Kate Stoneb9c1b512016-09-06 20:57:50 +0000485 check_breakpoint_result(
486 test,
487 break_results,
488 num_locations=num_expected_locations)
489
490 return get_bpno_from_match(break_results)
491
492
493def run_break_set_command(test, command):
494 """Run the command passed in - it must be some break set variant - and analyze the result.
Jim Ingham63dfc722012-09-22 00:05:11 +0000495 Returns a dictionary of information gleaned from the command-line results.
496 Will assert if the breakpoint setting fails altogether.
497
498 Dictionary will contain:
499 bpno - breakpoint of the newly created breakpoint, -1 on error.
500 num_locations - number of locations set for the breakpoint.
501
502 If there is only one location, the dictionary MAY contain:
503 file - source file name
504 line_no - source line number
505 symbol - symbol name
506 inline_symbol - inlined symbol name
507 offset - offset from the original symbol
508 module - module
509 address - address at which the breakpoint was set."""
510
Kate Stoneb9c1b512016-09-06 20:57:50 +0000511 patterns = [
512 r"^Breakpoint (?P<bpno>[0-9]+): (?P<num_locations>[0-9]+) locations\.$",
513 r"^Breakpoint (?P<bpno>[0-9]+): (?P<num_locations>no) locations \(pending\)\.",
Adrian Prantl431b1582018-08-30 15:11:00 +0000514 r"^Breakpoint (?P<bpno>[0-9]+): where = (?P<module>.*)`(?P<symbol>[+\-]{0,1}[^+]+)( \+ (?P<offset>[0-9]+)){0,1}( \[inlined\] (?P<inline_symbol>.*)){0,1} at (?P<file>[^:]+):(?P<line_no>[0-9]+)(?P<column>(:[0-9]+)?), address = (?P<address>0x[0-9a-fA-F]+)$",
Kate Stoneb9c1b512016-09-06 20:57:50 +0000515 r"^Breakpoint (?P<bpno>[0-9]+): where = (?P<module>.*)`(?P<symbol>.*)( \+ (?P<offset>[0-9]+)){0,1}, address = (?P<address>0x[0-9a-fA-F]+)$"]
516 match_object = test.match(command, patterns)
Jim Ingham63dfc722012-09-22 00:05:11 +0000517 break_results = match_object.groupdict()
Jim Ingham63dfc722012-09-22 00:05:11 +0000518
519 # We always insert the breakpoint number, setting it to -1 if we couldn't find it
520 # Also, make sure it gets stored as an integer.
521 if not 'bpno' in break_results:
522 break_results['bpno'] = -1
523 else:
524 break_results['bpno'] = int(break_results['bpno'])
Kate Stoneb9c1b512016-09-06 20:57:50 +0000525
Jim Ingham63dfc722012-09-22 00:05:11 +0000526 # We always insert the number of locations
527 # If ONE location is set for the breakpoint, then the output doesn't mention locations, but it has to be 1...
528 # We also make sure it is an integer.
529
530 if not 'num_locations' in break_results:
531 num_locations = 1
532 else:
533 num_locations = break_results['num_locations']
534 if num_locations == 'no':
535 num_locations = 0
536 else:
537 num_locations = int(break_results['num_locations'])
538
539 break_results['num_locations'] = num_locations
Kate Stoneb9c1b512016-09-06 20:57:50 +0000540
Jim Ingham63dfc722012-09-22 00:05:11 +0000541 if 'line_no' in break_results:
542 break_results['line_no'] = int(break_results['line_no'])
543
544 return break_results
545
Jim Ingham63dfc722012-09-22 00:05:11 +0000546
Kate Stoneb9c1b512016-09-06 20:57:50 +0000547def get_bpno_from_match(break_results):
548 return int(break_results['bpno'])
549
550
551def check_breakpoint_result(
552 test,
553 break_results,
554 file_name=None,
555 line_number=-1,
556 symbol_name=None,
557 symbol_match_exact=True,
558 module_name=None,
559 offset=-1,
560 num_locations=-1):
Jim Ingham63dfc722012-09-22 00:05:11 +0000561
562 out_num_locations = break_results['num_locations']
563
Jim Ingham63dfc722012-09-22 00:05:11 +0000564 if num_locations == -1:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000565 test.assertTrue(out_num_locations > 0,
566 "Expecting one or more locations, got none.")
Adrian McCarthy25727a42018-02-21 18:08:23 +0000567 elif num_locations != -2:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000568 test.assertTrue(
569 num_locations == out_num_locations,
570 "Expecting %d locations, got %d." %
571 (num_locations,
572 out_num_locations))
Jim Ingham63dfc722012-09-22 00:05:11 +0000573
574 if file_name:
575 out_file_name = ""
576 if 'file' in break_results:
577 out_file_name = break_results['file']
Kate Stoneb9c1b512016-09-06 20:57:50 +0000578 test.assertTrue(
Greg Clayton52098cf2018-04-13 14:52:54 +0000579 file_name.endswith(out_file_name),
Kate Stoneb9c1b512016-09-06 20:57:50 +0000580 "Breakpoint file name '%s' doesn't match resultant name '%s'." %
581 (file_name,
582 out_file_name))
Jim Ingham63dfc722012-09-22 00:05:11 +0000583
584 if line_number != -1:
Ilia K055ad9b2015-05-18 13:41:01 +0000585 out_line_number = -1
Jim Ingham63dfc722012-09-22 00:05:11 +0000586 if 'line_no' in break_results:
587 out_line_number = break_results['line_no']
588
Kate Stoneb9c1b512016-09-06 20:57:50 +0000589 test.assertTrue(
590 line_number == out_line_number,
591 "Breakpoint line number %s doesn't match resultant line %s." %
592 (line_number,
593 out_line_number))
Jim Ingham63dfc722012-09-22 00:05:11 +0000594
595 if symbol_name:
596 out_symbol_name = ""
Kate Stoneb9c1b512016-09-06 20:57:50 +0000597 # Look first for the inlined symbol name, otherwise use the symbol
598 # name:
Jim Ingham63dfc722012-09-22 00:05:11 +0000599 if 'inline_symbol' in break_results and break_results['inline_symbol']:
600 out_symbol_name = break_results['inline_symbol']
601 elif 'symbol' in break_results:
602 out_symbol_name = break_results['symbol']
603
604 if symbol_match_exact:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000605 test.assertTrue(
606 symbol_name == out_symbol_name,
607 "Symbol name '%s' doesn't match resultant symbol '%s'." %
608 (symbol_name,
609 out_symbol_name))
Jim Ingham63dfc722012-09-22 00:05:11 +0000610 else:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000611 test.assertTrue(
612 out_symbol_name.find(symbol_name) != -
613 1,
614 "Symbol name '%s' isn't in resultant symbol '%s'." %
615 (symbol_name,
616 out_symbol_name))
Jim Ingham63dfc722012-09-22 00:05:11 +0000617
618 if module_name:
Ilia K055ad9b2015-05-18 13:41:01 +0000619 out_module_name = None
Jim Ingham63dfc722012-09-22 00:05:11 +0000620 if 'module' in break_results:
621 out_module_name = break_results['module']
Kate Stoneb9c1b512016-09-06 20:57:50 +0000622
623 test.assertTrue(
624 module_name.find(out_module_name) != -
625 1,
626 "Symbol module name '%s' isn't in expected module name '%s'." %
627 (out_module_name,
628 module_name))
Jim Ingham63dfc722012-09-22 00:05:11 +0000629
630# ==================================================
Johnny Chenf4f70bb2010-10-22 21:31:03 +0000631# Utility functions related to Threads and Processes
632# ==================================================
Johnny Chen28ae2942010-10-07 22:15:58 +0000633
Kate Stoneb9c1b512016-09-06 20:57:50 +0000634
Johnny Chend3699082011-04-25 22:04:05 +0000635def get_stopped_threads(process, reason):
Johnny Chen75ec1592011-05-26 21:53:05 +0000636 """Returns the thread(s) with the specified stop reason in a list.
637
638 The list can be empty if no such thread exists.
639 """
Johnny Chend3699082011-04-25 22:04:05 +0000640 threads = []
Johnny Chene69c7482011-04-28 22:57:01 +0000641 for t in process:
Johnny Chend3699082011-04-25 22:04:05 +0000642 if t.GetStopReason() == reason:
643 threads.append(t)
644 return threads
645
Kate Stoneb9c1b512016-09-06 20:57:50 +0000646
Johnny Chend3699082011-04-25 22:04:05 +0000647def get_stopped_thread(process, reason):
648 """A convenience function which returns the first thread with the given stop
649 reason or None.
650
651 Example usages:
652
653 1. Get the stopped thread due to a breakpoint condition
654
655 ...
656 from lldbutil import get_stopped_thread
Johnny Chen5a0bee72011-06-15 22:14:12 +0000657 thread = get_stopped_thread(process, lldb.eStopReasonPlanComplete)
Greg Clayton53c5ddf2013-03-19 17:59:30 +0000658 self.assertTrue(thread.IsValid(), "There should be a thread stopped due to breakpoint condition")
Johnny Chend3699082011-04-25 22:04:05 +0000659 ...
660
661 2. Get the thread stopped due to a breakpoint
662
663 ...
664 from lldbutil import get_stopped_thread
Johnny Chen5a0bee72011-06-15 22:14:12 +0000665 thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)
Greg Clayton53c5ddf2013-03-19 17:59:30 +0000666 self.assertTrue(thread.IsValid(), "There should be a thread stopped due to breakpoint")
Johnny Chend3699082011-04-25 22:04:05 +0000667 ...
668
669 """
670 threads = get_stopped_threads(process, reason)
671 if len(threads) == 0:
672 return None
673 return threads[0]
674
Kate Stoneb9c1b512016-09-06 20:57:50 +0000675
Zachary Turner1da094a2016-01-22 23:54:41 +0000676def get_threads_stopped_at_breakpoint_id(process, bpid):
Johnny Chend0fef812011-04-25 23:38:13 +0000677 """ For a stopped process returns the thread stopped at the breakpoint passed in bkpt"""
678 stopped_threads = []
679 threads = []
680
Kate Stoneb9c1b512016-09-06 20:57:50 +0000681 stopped_threads = get_stopped_threads(process, lldb.eStopReasonBreakpoint)
Johnny Chend0fef812011-04-25 23:38:13 +0000682
683 if len(stopped_threads) == 0:
684 return threads
Kate Stoneb9c1b512016-09-06 20:57:50 +0000685
Johnny Chend0fef812011-04-25 23:38:13 +0000686 for thread in stopped_threads:
Johnny Chen32391242011-12-22 20:21:46 +0000687 # Make sure we've hit our breakpoint...
Kate Stoneb9c1b512016-09-06 20:57:50 +0000688 break_id = thread.GetStopReasonDataAtIndex(0)
Zachary Turner1da094a2016-01-22 23:54:41 +0000689 if break_id == bpid:
Johnny Chend0fef812011-04-25 23:38:13 +0000690 threads.append(thread)
691
692 return threads
693
Kate Stoneb9c1b512016-09-06 20:57:50 +0000694
695def get_threads_stopped_at_breakpoint(process, bkpt):
Zachary Turner1da094a2016-01-22 23:54:41 +0000696 return get_threads_stopped_at_breakpoint_id(process, bkpt.GetID())
697
Kate Stoneb9c1b512016-09-06 20:57:50 +0000698
699def get_one_thread_stopped_at_breakpoint_id(
700 process, bpid, require_exactly_one=True):
Zachary Turner1da094a2016-01-22 23:54:41 +0000701 threads = get_threads_stopped_at_breakpoint_id(process, bpid)
Zachary Turner783550b2016-01-21 21:07:30 +0000702 if len(threads) == 0:
703 return None
704 if require_exactly_one and len(threads) != 1:
705 return None
706
707 return threads[0]
708
Zachary Turner1da094a2016-01-22 23:54:41 +0000709
Kate Stoneb9c1b512016-09-06 20:57:50 +0000710def get_one_thread_stopped_at_breakpoint(
711 process, bkpt, require_exactly_one=True):
712 return get_one_thread_stopped_at_breakpoint_id(
713 process, bkpt.GetID(), require_exactly_one)
714
715
716def is_thread_crashed(test, thread):
Pavel Labathc4e25c92015-05-29 10:13:03 +0000717 """In the test suite we dereference a null pointer to simulate a crash. The way this is
718 reported depends on the platform."""
719 if test.platformIsDarwin():
Kate Stoneb9c1b512016-09-06 20:57:50 +0000720 return thread.GetStopReason(
721 ) == lldb.eStopReasonException and "EXC_BAD_ACCESS" in thread.GetStopDescription(100)
Pavel Labathc4e25c92015-05-29 10:13:03 +0000722 elif test.getPlatform() == "linux":
Kate Stoneb9c1b512016-09-06 20:57:50 +0000723 return thread.GetStopReason() == lldb.eStopReasonSignal and thread.GetStopReasonDataAtIndex(
724 0) == thread.GetProcess().GetUnixSignals().GetSignalNumberFromName("SIGSEGV")
Pavel Labathc4e25c92015-05-29 10:13:03 +0000725 else:
726 return "invalid address" in thread.GetStopDescription(100)
727
Kate Stoneb9c1b512016-09-06 20:57:50 +0000728
729def get_crashed_threads(test, process):
Pavel Labathc4e25c92015-05-29 10:13:03 +0000730 threads = []
731 if process.GetState() != lldb.eStateStopped:
732 return threads
733 for thread in process:
734 if is_thread_crashed(test, thread):
735 threads.append(thread)
736 return threads
737
Jim Ingham0423fca2018-02-01 21:35:50 +0000738# Helper functions for run_to_{source,name}_breakpoint:
739
740def run_to_breakpoint_make_target(test, exe_name, in_cwd):
741 if in_cwd:
742 exe = test.getBuildArtifact(exe_name)
Raphael Isemann23d7a9e2018-07-27 22:20:59 +0000743
Jim Ingham0423fca2018-02-01 21:35:50 +0000744 # Create the target
745 target = test.dbg.CreateTarget(exe)
746 test.assertTrue(target, "Target: %s is not valid."%(exe_name))
747 return target
748
749def run_to_breakpoint_do_run(test, target, bkpt, launch_info):
750
751 # Launch the process, and do not stop at the entry point.
752 if not launch_info:
753 launch_info = lldb.SBLaunchInfo(None)
754 launch_info.SetWorkingDirectory(test.get_process_working_directory())
755
756 error = lldb.SBError()
757 process = target.Launch(launch_info, error)
758
Raphael Isemann23d7a9e2018-07-27 22:20:59 +0000759 test.assertTrue(process,
760 "Could not create a valid process for %s: %s"%(target.GetExecutable().GetFilename(),
Jim Ingham0423fca2018-02-01 21:35:50 +0000761 error.GetCString()))
762
763 # Frame #0 should be at our breakpoint.
764 threads = get_threads_stopped_at_breakpoint(
765 process, bkpt)
766
767 test.assertTrue(len(threads) == 1, "Expected 1 thread to stop at breakpoint, %d did."%(len(threads)))
768 thread = threads[0]
769 return (target, process, thread, bkpt)
770
Raphael Isemann23d7a9e2018-07-27 22:20:59 +0000771def run_to_name_breakpoint (test, bkpt_name, launch_info = None,
Jim Ingham0423fca2018-02-01 21:35:50 +0000772 exe_name = "a.out",
Jim Ingham40207d52018-02-02 18:39:25 +0000773 bkpt_module = None,
Jim Ingham0423fca2018-02-01 21:35:50 +0000774 in_cwd = True):
Adrian Prantl595048f2018-01-19 23:24:35 +0000775 """Start up a target, using exe_name as the executable, and run it to
Jim Ingham40207d52018-02-02 18:39:25 +0000776 a breakpoint set by name on bkpt_name restricted to bkpt_module.
Adrian Prantl595048f2018-01-19 23:24:35 +0000777
778 If you want to pass in launch arguments or environment
779 variables, you can optionally pass in an SBLaunchInfo. If you
780 do that, remember to set the working directory as well.
781
782 If your executable isn't called a.out, you can pass that in.
783 And if your executable isn't in the CWD, pass in the absolute
784 path to the executable in exe_name, and set in_cwd to False.
785
Jim Ingham40207d52018-02-02 18:39:25 +0000786 If you need to restrict the breakpoint to a particular module,
787 pass the module name (a string not a FileSpec) in bkpt_module. If
788 nothing is passed in setting will be unrestricted.
789
Jim Inghama15e7f22017-07-06 02:18:16 +0000790 If the target isn't valid, the breakpoint isn't found, or hit, the
791 function will cause a testsuite failure.
Adrian Prantl595048f2018-01-19 23:24:35 +0000792
793 If successful it returns a tuple with the target process and
Jim Ingham40207d52018-02-02 18:39:25 +0000794 thread that hit the breakpoint, and the breakpoint that we set
795 for you.
Adrian Prantl595048f2018-01-19 23:24:35 +0000796 """
Jim Inghama15e7f22017-07-06 02:18:16 +0000797
Jim Ingham0423fca2018-02-01 21:35:50 +0000798 target = run_to_breakpoint_make_target(test, exe_name, in_cwd)
Jim Inghama15e7f22017-07-06 02:18:16 +0000799
Jim Ingham40207d52018-02-02 18:39:25 +0000800 breakpoint = target.BreakpointCreateByName(bkpt_name, bkpt_module)
801
802
Jim Ingham0423fca2018-02-01 21:35:50 +0000803 test.assertTrue(breakpoint.GetNumLocations() > 0,
804 "No locations found for name breakpoint: '%s'."%(bkpt_name))
805 return run_to_breakpoint_do_run(test, target, breakpoint, launch_info)
806
807def run_to_source_breakpoint(test, bkpt_pattern, source_spec,
808 launch_info = None, exe_name = "a.out",
Jim Ingham40207d52018-02-02 18:39:25 +0000809 bkpt_module = None,
Jim Ingham0423fca2018-02-01 21:35:50 +0000810 in_cwd = True):
811 """Start up a target, using exe_name as the executable, and run it to
812 a breakpoint set by source regex bkpt_pattern.
813
814 The rest of the behavior is the same as run_to_name_breakpoint.
815 """
816
817 target = run_to_breakpoint_make_target(test, exe_name, in_cwd)
Jim Inghama15e7f22017-07-06 02:18:16 +0000818 # Set the breakpoints
819 breakpoint = target.BreakpointCreateBySourceRegex(
Jim Ingham40207d52018-02-02 18:39:25 +0000820 bkpt_pattern, source_spec, bkpt_module)
Raphael Isemann23d7a9e2018-07-27 22:20:59 +0000821 test.assertTrue(breakpoint.GetNumLocations() > 0,
Adrian Prantl431b1582018-08-30 15:11:00 +0000822 'No locations found for source breakpoint: "%s", file: "%s", dir: "%s"'
823 %(bkpt_pattern, source_spec.GetFilename(), source_spec.GetDirectory()))
Jim Ingham0423fca2018-02-01 21:35:50 +0000824 return run_to_breakpoint_do_run(test, target, breakpoint, launch_info)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000825
Adrian Prantl431b1582018-08-30 15:11:00 +0000826def run_to_line_breakpoint(test, source_spec, line_number, column = 0,
827 launch_info = None, exe_name = "a.out",
828 bkpt_module = None,
829 in_cwd = True):
830 """Start up a target, using exe_name as the executable, and run it to
831 a breakpoint set by (source_spec, line_number(, column)).
832
833 The rest of the behavior is the same as run_to_name_breakpoint.
834 """
835
836 target = run_to_breakpoint_make_target(test, exe_name, in_cwd)
837 # Set the breakpoints
838 breakpoint = target.BreakpointCreateByLocation(
839 source_spec, line_number, column, 0, lldb.SBFileSpecList())
840 test.assertTrue(breakpoint.GetNumLocations() > 0,
841 'No locations found for line breakpoint: "%s:%d(:%d)", dir: "%s"'
842 %(source_spec.GetFilename(), line_number, column,
843 source_spec.GetDirectory()))
844 return run_to_breakpoint_do_run(test, target, breakpoint, launch_info)
845
846
Kate Stoneb9c1b512016-09-06 20:57:50 +0000847def continue_to_breakpoint(process, bkpt):
Johnny Chend0fef812011-04-25 23:38:13 +0000848 """ Continues the process, if it stops, returns the threads stopped at bkpt; otherwise, returns None"""
849 process.Continue()
850 if process.GetState() != lldb.eStateStopped:
851 return None
852 else:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000853 return get_threads_stopped_at_breakpoint(process, bkpt)
854
Johnny Chend0fef812011-04-25 23:38:13 +0000855
Johnny Chena4603162011-03-09 23:45:56 +0000856def get_caller_symbol(thread):
857 """
858 Returns the symbol name for the call site of the leaf function.
859 """
860 depth = thread.GetNumFrames()
861 if depth <= 1:
862 return None
863 caller = thread.GetFrameAtIndex(1).GetSymbol()
864 if caller:
865 return caller.GetName()
866 else:
867 return None
868
869
Johnny Chend0fef812011-04-25 23:38:13 +0000870def get_function_names(thread):
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000871 """
872 Returns a sequence of function names from the stack frames of this thread.
873 """
874 def GetFuncName(i):
Johnny Chen4cfd07e2011-06-20 00:26:39 +0000875 return thread.GetFrameAtIndex(i).GetFunctionName()
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000876
Zachary Turner744cd5d2015-10-26 16:49:57 +0000877 return list(map(GetFuncName, list(range(thread.GetNumFrames()))))
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000878
879
Johnny Chend0fef812011-04-25 23:38:13 +0000880def get_symbol_names(thread):
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000881 """
882 Returns a sequence of symbols for this thread.
883 """
884 def GetSymbol(i):
885 return thread.GetFrameAtIndex(i).GetSymbol().GetName()
886
Zachary Turner744cd5d2015-10-26 16:49:57 +0000887 return list(map(GetSymbol, list(range(thread.GetNumFrames()))))
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000888
889
Johnny Chend0fef812011-04-25 23:38:13 +0000890def get_pc_addresses(thread):
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000891 """
892 Returns a sequence of pc addresses for this thread.
893 """
894 def GetPCAddress(i):
895 return thread.GetFrameAtIndex(i).GetPCAddress()
896
Zachary Turner744cd5d2015-10-26 16:49:57 +0000897 return list(map(GetPCAddress, list(range(thread.GetNumFrames()))))
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000898
899
Johnny Chend0fef812011-04-25 23:38:13 +0000900def get_filenames(thread):
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000901 """
902 Returns a sequence of file names from the stack frames of this thread.
903 """
904 def GetFilename(i):
Kate Stoneb9c1b512016-09-06 20:57:50 +0000905 return thread.GetFrameAtIndex(
906 i).GetLineEntry().GetFileSpec().GetFilename()
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000907
Zachary Turner744cd5d2015-10-26 16:49:57 +0000908 return list(map(GetFilename, list(range(thread.GetNumFrames()))))
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000909
910
Johnny Chend0fef812011-04-25 23:38:13 +0000911def get_line_numbers(thread):
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000912 """
913 Returns a sequence of line numbers from the stack frames of this thread.
914 """
915 def GetLineNumber(i):
916 return thread.GetFrameAtIndex(i).GetLineEntry().GetLine()
917
Zachary Turner744cd5d2015-10-26 16:49:57 +0000918 return list(map(GetLineNumber, list(range(thread.GetNumFrames()))))
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000919
920
Johnny Chend0fef812011-04-25 23:38:13 +0000921def get_module_names(thread):
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000922 """
923 Returns a sequence of module names from the stack frames of this thread.
924 """
925 def GetModuleName(i):
Kate Stoneb9c1b512016-09-06 20:57:50 +0000926 return thread.GetFrameAtIndex(
927 i).GetModule().GetFileSpec().GetFilename()
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000928
Zachary Turner744cd5d2015-10-26 16:49:57 +0000929 return list(map(GetModuleName, list(range(thread.GetNumFrames()))))
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000930
931
Johnny Chend0fef812011-04-25 23:38:13 +0000932def get_stack_frames(thread):
Johnny Chen43a651c2010-09-09 00:55:07 +0000933 """
934 Returns a sequence of stack frames for this thread.
935 """
936 def GetStackFrame(i):
937 return thread.GetFrameAtIndex(i)
938
Zachary Turner744cd5d2015-10-26 16:49:57 +0000939 return list(map(GetStackFrame, list(range(thread.GetNumFrames()))))
Johnny Chen43a651c2010-09-09 00:55:07 +0000940
941
Kate Stoneb9c1b512016-09-06 20:57:50 +0000942def print_stacktrace(thread, string_buffer=False):
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000943 """Prints a simple stack trace of this thread."""
Johnny Chen6c704992010-10-07 18:52:48 +0000944
Zachary Turner814236d2015-10-21 17:48:52 +0000945 output = SixStringIO() if string_buffer else sys.stdout
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000946 target = thread.GetProcess().GetTarget()
947
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000948 depth = thread.GetNumFrames()
949
Johnny Chend0fef812011-04-25 23:38:13 +0000950 mods = get_module_names(thread)
951 funcs = get_function_names(thread)
952 symbols = get_symbol_names(thread)
953 files = get_filenames(thread)
954 lines = get_line_numbers(thread)
955 addrs = get_pc_addresses(thread)
Johnny Chen6c704992010-10-07 18:52:48 +0000956
Johnny Chen567a0452010-10-25 19:13:52 +0000957 if thread.GetStopReason() != lldb.eStopReasonInvalid:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000958 desc = "stop reason=" + stop_reason_to_str(thread.GetStopReason())
Johnny Chen567a0452010-10-25 19:13:52 +0000959 else:
960 desc = ""
Kate Stoneb9c1b512016-09-06 20:57:50 +0000961 print(
962 "Stack trace for thread id={0:#x} name={1} queue={2} ".format(
963 thread.GetThreadID(),
964 thread.GetName(),
965 thread.GetQueueName()) + desc,
966 file=output)
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000967
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000968 for i in range(depth):
969 frame = thread.GetFrameAtIndex(i)
970 function = frame.GetFunction()
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000971
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000972 load_addr = addrs[i].GetLoadAddress(target)
Johnny Chen3cd1e552011-05-25 19:06:18 +0000973 if not function:
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000974 file_addr = addrs[i].GetFileAddress()
Johnny Chen0d4f6dd2011-06-16 22:07:48 +0000975 start_addr = frame.GetSymbol().GetStartAddress().GetFileAddress()
976 symbol_offset = file_addr - start_addr
Kate Stoneb9c1b512016-09-06 20:57:50 +0000977 print(
978 " frame #{num}: {addr:#016x} {mod}`{symbol} + {offset}".format(
979 num=i,
980 addr=load_addr,
981 mod=mods[i],
982 symbol=symbols[i],
983 offset=symbol_offset),
984 file=output)
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000985 else:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000986 print(
987 " frame #{num}: {addr:#016x} {mod}`{func} at {file}:{line} {args}".format(
988 num=i,
989 addr=load_addr,
990 mod=mods[i],
991 func='%s [inlined]' %
992 funcs[i] if frame.IsInlined() else funcs[i],
993 file=files[i],
994 line=lines[i],
995 args=get_args_as_string(
996 frame,
997 showFuncName=False) if not frame.IsInlined() else '()'),
998 file=output)
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000999
1000 if string_buffer:
Johnny Chend5d6fac2010-10-15 23:33:18 +00001001 return output.getvalue()
Johnny Chen7ea9aee2010-10-07 21:38:28 +00001002
1003
Kate Stoneb9c1b512016-09-06 20:57:50 +00001004def print_stacktraces(process, string_buffer=False):
Johnny Chen7ea9aee2010-10-07 21:38:28 +00001005 """Prints the stack traces of all the threads."""
1006
Zachary Turner814236d2015-10-21 17:48:52 +00001007 output = SixStringIO() if string_buffer else sys.stdout
Johnny Chen7ea9aee2010-10-07 21:38:28 +00001008
Zachary Turnerff890da2015-10-19 23:45:41 +00001009 print("Stack traces for " + str(process), file=output)
Johnny Chen7ea9aee2010-10-07 21:38:28 +00001010
Johnny Chenae9639a2011-05-05 18:50:56 +00001011 for thread in process:
Zachary Turnerff890da2015-10-19 23:45:41 +00001012 print(print_stacktrace(thread, string_buffer=True), file=output)
Johnny Chen6c704992010-10-07 18:52:48 +00001013
1014 if string_buffer:
Johnny Chend5d6fac2010-10-15 23:33:18 +00001015 return output.getvalue()
Johnny Chenb21c52e2011-05-08 17:25:27 +00001016
Kate Stoneb9c1b512016-09-06 20:57:50 +00001017
1018def expect_state_changes(test, listener, process, states, timeout=5):
Pavel Labath5dcb0252015-09-02 09:12:28 +00001019 """Listens for state changed events on the listener and makes sure they match what we
1020 expect. Stop-and-restart events (where GetRestartedFromEvent() returns true) are ignored."""
Pavel Labathe5c98082016-01-06 11:40:06 +00001021
Pavel Labath5dcb0252015-09-02 09:12:28 +00001022 for expected_state in states:
Pavel Labathe5c98082016-01-06 11:40:06 +00001023 def get_next_event():
1024 event = lldb.SBEvent()
Kate Stoneb9c1b512016-09-06 20:57:50 +00001025 if not listener.WaitForEventForBroadcasterWithType(
1026 timeout,
1027 process.GetBroadcaster(),
1028 lldb.SBProcess.eBroadcastBitStateChanged,
1029 event):
1030 test.fail(
1031 "Timed out while waiting for a transition to state %s" %
Pavel Labathe5c98082016-01-06 11:40:06 +00001032 lldb.SBDebugger.StateAsCString(expected_state))
1033 return event
Pavel Labath5dcb0252015-09-02 09:12:28 +00001034
Pavel Labathe5c98082016-01-06 11:40:06 +00001035 event = get_next_event()
1036 while (lldb.SBProcess.GetStateFromEvent(event) == lldb.eStateStopped and
1037 lldb.SBProcess.GetRestartedFromEvent(event)):
1038 # Ignore restarted event and the subsequent running event.
1039 event = get_next_event()
Kate Stoneb9c1b512016-09-06 20:57:50 +00001040 test.assertEqual(
1041 lldb.SBProcess.GetStateFromEvent(event),
1042 lldb.eStateRunning,
1043 "Restarted event followed by a running event")
Pavel Labathe5c98082016-01-06 11:40:06 +00001044 event = get_next_event()
Pavel Labath5dcb0252015-09-02 09:12:28 +00001045
Kate Stoneb9c1b512016-09-06 20:57:50 +00001046 test.assertEqual(
1047 lldb.SBProcess.GetStateFromEvent(event),
1048 expected_state)
Pavel Labath5dcb0252015-09-02 09:12:28 +00001049
Johnny Chenb21c52e2011-05-08 17:25:27 +00001050# ===================================
1051# Utility functions related to Frames
1052# ===================================
1053
Kate Stoneb9c1b512016-09-06 20:57:50 +00001054
Johnny Chenad7372c2011-05-12 00:32:41 +00001055def get_parent_frame(frame):
1056 """
1057 Returns the parent frame of the input frame object; None if not available.
1058 """
1059 thread = frame.GetThread()
1060 parent_found = False
1061 for f in thread:
1062 if parent_found:
1063 return f
1064 if f.GetFrameID() == frame.GetFrameID():
1065 parent_found = True
1066
1067 # If we reach here, no parent has been found, return None.
1068 return None
1069
Kate Stoneb9c1b512016-09-06 20:57:50 +00001070
Johnny Chen0d4f6dd2011-06-16 22:07:48 +00001071def get_args_as_string(frame, showFuncName=True):
Johnny Chenad7372c2011-05-12 00:32:41 +00001072 """
1073 Returns the args of the input frame object as a string.
1074 """
1075 # arguments => True
1076 # locals => False
1077 # statics => False
1078 # in_scope_only => True
Kate Stoneb9c1b512016-09-06 20:57:50 +00001079 vars = frame.GetVariables(True, False, False, True) # type of SBValueList
1080 args = [] # list of strings
Johnny Chenad7372c2011-05-12 00:32:41 +00001081 for var in vars:
1082 args.append("(%s)%s=%s" % (var.GetTypeName(),
1083 var.GetName(),
Greg Claytonfe42ac42011-08-03 22:57:10 +00001084 var.GetValue()))
Johnny Chen3cd1e552011-05-25 19:06:18 +00001085 if frame.GetFunction():
Johnny Chen52b0ffd92011-05-13 00:44:49 +00001086 name = frame.GetFunction().GetName()
Johnny Chen3cd1e552011-05-25 19:06:18 +00001087 elif frame.GetSymbol():
Johnny Chen52b0ffd92011-05-13 00:44:49 +00001088 name = frame.GetSymbol().GetName()
1089 else:
1090 name = ""
Johnny Chen0d4f6dd2011-06-16 22:07:48 +00001091 if showFuncName:
1092 return "%s(%s)" % (name, ", ".join(args))
1093 else:
1094 return "(%s)" % (", ".join(args))
Kate Stoneb9c1b512016-09-06 20:57:50 +00001095
1096
1097def print_registers(frame, string_buffer=False):
Johnny Chen2158b972011-05-08 18:55:37 +00001098 """Prints all the register sets of the frame."""
Johnny Chenb21c52e2011-05-08 17:25:27 +00001099
Zachary Turner814236d2015-10-21 17:48:52 +00001100 output = SixStringIO() if string_buffer else sys.stdout
Johnny Chenb21c52e2011-05-08 17:25:27 +00001101
Zachary Turnerff890da2015-10-19 23:45:41 +00001102 print("Register sets for " + str(frame), file=output)
Johnny Chenb21c52e2011-05-08 17:25:27 +00001103
Kate Stoneb9c1b512016-09-06 20:57:50 +00001104 registerSet = frame.GetRegisters() # Return type of SBValueList.
1105 print("Frame registers (size of register set = %d):" %
1106 registerSet.GetSize(), file=output)
Johnny Chen64ff7e62011-05-10 19:21:13 +00001107 for value in registerSet:
Zachary Turner35d017f2015-10-23 17:04:29 +00001108 #print(value, file=output)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001109 print("%s (number of children = %d):" %
1110 (value.GetName(), value.GetNumChildren()), file=output)
Johnny Chenb21c52e2011-05-08 17:25:27 +00001111 for child in value:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001112 print(
1113 "Name: %s, Value: %s" %
1114 (child.GetName(),
1115 child.GetValue()),
1116 file=output)
Johnny Chenb21c52e2011-05-08 17:25:27 +00001117
1118 if string_buffer:
1119 return output.getvalue()
Johnny Chen64ff7e62011-05-10 19:21:13 +00001120
Kate Stoneb9c1b512016-09-06 20:57:50 +00001121
Johnny Chen64ff7e62011-05-10 19:21:13 +00001122def get_registers(frame, kind):
1123 """Returns the registers given the frame and the kind of registers desired.
1124
1125 Returns None if there's no such kind.
1126 """
Kate Stoneb9c1b512016-09-06 20:57:50 +00001127 registerSet = frame.GetRegisters() # Return type of SBValueList.
Johnny Chen64ff7e62011-05-10 19:21:13 +00001128 for value in registerSet:
1129 if kind.lower() in value.GetName().lower():
1130 return value
1131
1132 return None
1133
Kate Stoneb9c1b512016-09-06 20:57:50 +00001134
Johnny Chen64ff7e62011-05-10 19:21:13 +00001135def get_GPRs(frame):
1136 """Returns the general purpose registers of the frame as an SBValue.
1137
Johnny Chene9e86892011-05-10 23:01:44 +00001138 The returned SBValue object is iterable. An example:
1139 ...
1140 from lldbutil import get_GPRs
1141 regs = get_GPRs(frame)
1142 for reg in regs:
Zachary Turner35d017f2015-10-23 17:04:29 +00001143 print("%s => %s" % (reg.GetName(), reg.GetValue()))
Johnny Chene9e86892011-05-10 23:01:44 +00001144 ...
Johnny Chen64ff7e62011-05-10 19:21:13 +00001145 """
1146 return get_registers(frame, "general purpose")
1147
Kate Stoneb9c1b512016-09-06 20:57:50 +00001148
Johnny Chen64ff7e62011-05-10 19:21:13 +00001149def get_FPRs(frame):
1150 """Returns the floating point registers of the frame as an SBValue.
1151
Johnny Chene9e86892011-05-10 23:01:44 +00001152 The returned SBValue object is iterable. An example:
1153 ...
1154 from lldbutil import get_FPRs
1155 regs = get_FPRs(frame)
1156 for reg in regs:
Zachary Turner35d017f2015-10-23 17:04:29 +00001157 print("%s => %s" % (reg.GetName(), reg.GetValue()))
Johnny Chene9e86892011-05-10 23:01:44 +00001158 ...
Johnny Chen64ff7e62011-05-10 19:21:13 +00001159 """
1160 return get_registers(frame, "floating point")
1161
Kate Stoneb9c1b512016-09-06 20:57:50 +00001162
Johnny Chen64ff7e62011-05-10 19:21:13 +00001163def get_ESRs(frame):
1164 """Returns the exception state registers of the frame as an SBValue.
1165
Johnny Chene9e86892011-05-10 23:01:44 +00001166 The returned SBValue object is iterable. An example:
1167 ...
1168 from lldbutil import get_ESRs
1169 regs = get_ESRs(frame)
1170 for reg in regs:
Zachary Turner35d017f2015-10-23 17:04:29 +00001171 print("%s => %s" % (reg.GetName(), reg.GetValue()))
Johnny Chene9e86892011-05-10 23:01:44 +00001172 ...
Johnny Chen64ff7e62011-05-10 19:21:13 +00001173 """
1174 return get_registers(frame, "exception state")
Johnny Chen989b7ef2011-07-22 00:47:58 +00001175
Johnny Chenefee1cd2011-07-22 00:51:54 +00001176# ======================================
1177# Utility classes/functions for SBValues
1178# ======================================
Johnny Chen989b7ef2011-07-22 00:47:58 +00001179
Kate Stoneb9c1b512016-09-06 20:57:50 +00001180
Johnny Chen989b7ef2011-07-22 00:47:58 +00001181class BasicFormatter(object):
Johnny Chen36d7d912011-07-22 22:01:35 +00001182 """The basic formatter inspects the value object and prints the value."""
Kate Stoneb9c1b512016-09-06 20:57:50 +00001183
Johnny Chen989b7ef2011-07-22 00:47:58 +00001184 def format(self, value, buffer=None, indent=0):
1185 if not buffer:
Zachary Turner814236d2015-10-21 17:48:52 +00001186 output = SixStringIO()
Johnny Chen989b7ef2011-07-22 00:47:58 +00001187 else:
1188 output = buffer
Johnny Chen36d7d912011-07-22 22:01:35 +00001189 # If there is a summary, it suffices.
1190 val = value.GetSummary()
1191 # Otherwise, get the value.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001192 if val is None:
Johnny Chen36d7d912011-07-22 22:01:35 +00001193 val = value.GetValue()
Kate Stoneb9c1b512016-09-06 20:57:50 +00001194 if val is None and value.GetNumChildren() > 0:
Johnny Chen36d7d912011-07-22 22:01:35 +00001195 val = "%s (location)" % value.GetLocation()
Zachary Turnerff890da2015-10-19 23:45:41 +00001196 print("{indentation}({type}) {name} = {value}".format(
Kate Stoneb9c1b512016-09-06 20:57:50 +00001197 indentation=' ' * indent,
1198 type=value.GetTypeName(),
1199 name=value.GetName(),
1200 value=val), file=output)
Johnny Chen989b7ef2011-07-22 00:47:58 +00001201 return output.getvalue()
1202
Kate Stoneb9c1b512016-09-06 20:57:50 +00001203
Johnny Chen989b7ef2011-07-22 00:47:58 +00001204class ChildVisitingFormatter(BasicFormatter):
Johnny Chen36d7d912011-07-22 22:01:35 +00001205 """The child visiting formatter prints the value and its immediate children.
1206
1207 The constructor takes a keyword arg: indent_child, which defaults to 2.
1208 """
Kate Stoneb9c1b512016-09-06 20:57:50 +00001209
Johnny Chen36d7d912011-07-22 22:01:35 +00001210 def __init__(self, indent_child=2):
1211 """Default indentation of 2 SPC's for the children."""
1212 self.cindent = indent_child
Kate Stoneb9c1b512016-09-06 20:57:50 +00001213
Johnny Chen989b7ef2011-07-22 00:47:58 +00001214 def format(self, value, buffer=None):
1215 if not buffer:
Zachary Turner814236d2015-10-21 17:48:52 +00001216 output = SixStringIO()
Johnny Chen989b7ef2011-07-22 00:47:58 +00001217 else:
1218 output = buffer
1219
1220 BasicFormatter.format(self, value, buffer=output)
1221 for child in value:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001222 BasicFormatter.format(
1223 self, child, buffer=output, indent=self.cindent)
Johnny Chen36d7d912011-07-22 22:01:35 +00001224
1225 return output.getvalue()
1226
Kate Stoneb9c1b512016-09-06 20:57:50 +00001227
Johnny Chen36d7d912011-07-22 22:01:35 +00001228class RecursiveDecentFormatter(BasicFormatter):
1229 """The recursive decent formatter prints the value and the decendents.
1230
1231 The constructor takes two keyword args: indent_level, which defaults to 0,
1232 and indent_child, which defaults to 2. The current indentation level is
1233 determined by indent_level, while the immediate children has an additional
Kate Stoneb9c1b512016-09-06 20:57:50 +00001234 indentation by inden_child.
Johnny Chen36d7d912011-07-22 22:01:35 +00001235 """
Kate Stoneb9c1b512016-09-06 20:57:50 +00001236
Johnny Chen36d7d912011-07-22 22:01:35 +00001237 def __init__(self, indent_level=0, indent_child=2):
1238 self.lindent = indent_level
1239 self.cindent = indent_child
Kate Stoneb9c1b512016-09-06 20:57:50 +00001240
Johnny Chen36d7d912011-07-22 22:01:35 +00001241 def format(self, value, buffer=None):
1242 if not buffer:
Zachary Turner814236d2015-10-21 17:48:52 +00001243 output = SixStringIO()
Johnny Chen36d7d912011-07-22 22:01:35 +00001244 else:
1245 output = buffer
1246
1247 BasicFormatter.format(self, value, buffer=output, indent=self.lindent)
1248 new_indent = self.lindent + self.cindent
1249 for child in value:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001250 if child.GetSummary() is not None:
1251 BasicFormatter.format(
1252 self, child, buffer=output, indent=new_indent)
Johnny Chen36d7d912011-07-22 22:01:35 +00001253 else:
1254 if child.GetNumChildren() > 0:
1255 rdf = RecursiveDecentFormatter(indent_level=new_indent)
1256 rdf.format(child, buffer=output)
1257 else:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001258 BasicFormatter.format(
1259 self, child, buffer=output, indent=new_indent)
Johnny Chen989b7ef2011-07-22 00:47:58 +00001260
1261 return output.getvalue()
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00001262
1263# ===========================================================
1264# Utility functions for path manipulation on remote platforms
1265# ===========================================================
1266
Kate Stoneb9c1b512016-09-06 20:57:50 +00001267
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00001268def join_remote_paths(*paths):
1269 # TODO: update with actual platform name for remote windows once it exists
1270 if lldb.remote_platform.GetName() == 'remote-windows':
1271 return os.path.join(*paths).replace(os.path.sep, '\\')
1272 return os.path.join(*paths).replace(os.path.sep, '/')
1273
Kate Stoneb9c1b512016-09-06 20:57:50 +00001274
Pavel Labathf3a9ab02018-02-21 15:33:53 +00001275def append_to_process_working_directory(test, *paths):
Chaoren Lin5d76b1b2015-06-06 00:25:50 +00001276 remote = lldb.remote_platform
1277 if remote:
1278 return join_remote_paths(remote.GetWorkingDirectory(), *paths)
Pavel Labathf3a9ab02018-02-21 15:33:53 +00001279 return os.path.join(test.getBuildDir(), *paths)
Chaoren Linf59d05092015-06-02 16:46:28 +00001280
1281# ==================================================
1282# Utility functions to get the correct signal number
1283# ==================================================
1284
1285import signal
1286
Kate Stoneb9c1b512016-09-06 20:57:50 +00001287
Chaoren Linf59d05092015-06-02 16:46:28 +00001288def get_signal_number(signal_name):
1289 platform = lldb.remote_platform
Chaoren Lin98d0a4b2015-07-14 01:09:28 +00001290 if platform and platform.IsValid():
1291 signals = platform.GetUnixSignals()
1292 if signals.IsValid():
Chaoren Lin264e5422015-06-02 18:31:57 +00001293 signal_number = signals.GetSignalNumberFromName(signal_name)
1294 if signal_number > 0:
1295 return signal_number
Chaoren Lin98d0a4b2015-07-14 01:09:28 +00001296 # No remote platform; fall back to using local python signals.
Chaoren Linf59d05092015-06-02 16:46:28 +00001297 return getattr(signal, signal_name)
Enrico Granata0b5a6e32015-09-18 20:12:52 +00001298
Kate Stoneb9c1b512016-09-06 20:57:50 +00001299
Enrico Granata0b5a6e32015-09-18 20:12:52 +00001300class PrintableRegex(object):
Kate Stoneb9c1b512016-09-06 20:57:50 +00001301
Enrico Granata0b5a6e32015-09-18 20:12:52 +00001302 def __init__(self, text):
1303 self.regex = re.compile(text)
1304 self.text = text
Kate Stoneb9c1b512016-09-06 20:57:50 +00001305
Enrico Granata0b5a6e32015-09-18 20:12:52 +00001306 def match(self, str):
1307 return self.regex.match(str)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001308
Enrico Granata0b5a6e32015-09-18 20:12:52 +00001309 def __str__(self):
1310 return "%s" % (self.text)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001311
Enrico Granata0b5a6e32015-09-18 20:12:52 +00001312 def __repr__(self):
1313 return "re.compile(%s) -> %s" % (self.text, self.regex)
1314
Kate Stoneb9c1b512016-09-06 20:57:50 +00001315
Enrico Granataef4fa442015-12-04 19:50:05 +00001316def skip_if_callable(test, mycallable, reason):
1317 if six.callable(mycallable):
1318 if mycallable(test):
1319 test.skipTest(reason)
1320 return True
Enrico Granata0b5a6e32015-09-18 20:12:52 +00001321 return False
1322
Kate Stoneb9c1b512016-09-06 20:57:50 +00001323
Enrico Granata0b5a6e32015-09-18 20:12:52 +00001324def skip_if_library_missing(test, target, library):
1325 def find_library(target, library):
1326 for module in target.modules:
1327 filename = module.file.GetFilename()
1328 if isinstance(library, str):
1329 if library == filename:
1330 return False
1331 elif hasattr(library, 'match'):
1332 if library.match(filename):
1333 return False
1334 return True
Kate Stoneb9c1b512016-09-06 20:57:50 +00001335
Enrico Granata0b5a6e32015-09-18 20:12:52 +00001336 def find_library_callable(test):
1337 return find_library(target, library)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001338 return skip_if_callable(
1339 test,
1340 find_library_callable,
1341 "could not find library matching '%s' in target %s" %
1342 (library,
1343 target))
Tamas Berghammer19fc1d42016-04-05 14:08:18 +00001344
Kate Stoneb9c1b512016-09-06 20:57:50 +00001345
Pavel Labath107052f2018-03-15 13:47:09 +00001346def read_file_on_target(test, remote):
1347 if lldb.remote_platform:
1348 local = test.getBuildArtifact("file_from_target")
1349 error = lldb.remote_platform.Get(lldb.SBFileSpec(remote, False),
1350 lldb.SBFileSpec(local, True))
1351 test.assertTrue(error.Success(), "Reading file {0} failed: {1}".format(remote, error))
1352 else:
1353 local = remote
1354 with open(local, 'r') as f:
1355 return f.read()
1356
1357def read_file_from_process_wd(test, name):
1358 path = append_to_process_working_directory(test, name)
1359 return read_file_on_target(test, path)
1360
Kate Stoneb9c1b512016-09-06 20:57:50 +00001361def wait_for_file_on_target(testcase, file_path, max_attempts=6):
Tamas Berghammer19fc1d42016-04-05 14:08:18 +00001362 for i in range(max_attempts):
1363 err, retcode, msg = testcase.run_platform_command("ls %s" % file_path)
1364 if err.Success() and retcode == 0:
1365 break
1366 if i < max_attempts:
1367 # Exponential backoff!
Todd Fiala464f7df2016-04-08 18:06:11 +00001368 import time
Tamas Berghammer19fc1d42016-04-05 14:08:18 +00001369 time.sleep(pow(2, i) * 0.25)
1370 else:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001371 testcase.fail(
1372 "File %s not found even after %d attempts." %
1373 (file_path, max_attempts))
Tamas Berghammer19fc1d42016-04-05 14:08:18 +00001374
Pavel Labath107052f2018-03-15 13:47:09 +00001375 return read_file_on_target(testcase, file_path)