blob: 2fe24023f481b7a8de6f3d984b60afc9d4998793 [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\)\.",
514 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]+), address = (?P<address>0x[0-9a-fA-F]+)$",
515 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(
579 file_name == out_file_name,
580 "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)
743
744 # 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
759 test.assertTrue(process,
760 "Could not create a valid process for %s: %s"%(target.GetExecutable().GetFilename(),
761 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
771def run_to_name_breakpoint (test, bkpt_name, launch_info = None,
772 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)
Jim Inghama15e7f22017-07-06 02:18:16 +0000821 test.assertTrue(breakpoint.GetNumLocations() > 0,
Adrian Prantlee2d2bf2018-01-30 19:40:09 +0000822 'No locations found for source breakpoint: "%s", file: "%s", dir: "%s"'%(bkpt_pattern, source_spec.GetFilename(), source_spec.GetDirectory()))
Jim Ingham0423fca2018-02-01 21:35:50 +0000823 return run_to_breakpoint_do_run(test, target, breakpoint, launch_info)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000824
825def continue_to_breakpoint(process, bkpt):
Johnny Chend0fef812011-04-25 23:38:13 +0000826 """ Continues the process, if it stops, returns the threads stopped at bkpt; otherwise, returns None"""
827 process.Continue()
828 if process.GetState() != lldb.eStateStopped:
829 return None
830 else:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000831 return get_threads_stopped_at_breakpoint(process, bkpt)
832
Johnny Chend0fef812011-04-25 23:38:13 +0000833
Johnny Chena4603162011-03-09 23:45:56 +0000834def get_caller_symbol(thread):
835 """
836 Returns the symbol name for the call site of the leaf function.
837 """
838 depth = thread.GetNumFrames()
839 if depth <= 1:
840 return None
841 caller = thread.GetFrameAtIndex(1).GetSymbol()
842 if caller:
843 return caller.GetName()
844 else:
845 return None
846
847
Johnny Chend0fef812011-04-25 23:38:13 +0000848def get_function_names(thread):
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000849 """
850 Returns a sequence of function names from the stack frames of this thread.
851 """
852 def GetFuncName(i):
Johnny Chen4cfd07e2011-06-20 00:26:39 +0000853 return thread.GetFrameAtIndex(i).GetFunctionName()
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000854
Zachary Turner744cd5d2015-10-26 16:49:57 +0000855 return list(map(GetFuncName, list(range(thread.GetNumFrames()))))
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000856
857
Johnny Chend0fef812011-04-25 23:38:13 +0000858def get_symbol_names(thread):
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000859 """
860 Returns a sequence of symbols for this thread.
861 """
862 def GetSymbol(i):
863 return thread.GetFrameAtIndex(i).GetSymbol().GetName()
864
Zachary Turner744cd5d2015-10-26 16:49:57 +0000865 return list(map(GetSymbol, list(range(thread.GetNumFrames()))))
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000866
867
Johnny Chend0fef812011-04-25 23:38:13 +0000868def get_pc_addresses(thread):
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000869 """
870 Returns a sequence of pc addresses for this thread.
871 """
872 def GetPCAddress(i):
873 return thread.GetFrameAtIndex(i).GetPCAddress()
874
Zachary Turner744cd5d2015-10-26 16:49:57 +0000875 return list(map(GetPCAddress, list(range(thread.GetNumFrames()))))
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000876
877
Johnny Chend0fef812011-04-25 23:38:13 +0000878def get_filenames(thread):
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000879 """
880 Returns a sequence of file names from the stack frames of this thread.
881 """
882 def GetFilename(i):
Kate Stoneb9c1b512016-09-06 20:57:50 +0000883 return thread.GetFrameAtIndex(
884 i).GetLineEntry().GetFileSpec().GetFilename()
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000885
Zachary Turner744cd5d2015-10-26 16:49:57 +0000886 return list(map(GetFilename, list(range(thread.GetNumFrames()))))
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000887
888
Johnny Chend0fef812011-04-25 23:38:13 +0000889def get_line_numbers(thread):
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000890 """
891 Returns a sequence of line numbers from the stack frames of this thread.
892 """
893 def GetLineNumber(i):
894 return thread.GetFrameAtIndex(i).GetLineEntry().GetLine()
895
Zachary Turner744cd5d2015-10-26 16:49:57 +0000896 return list(map(GetLineNumber, list(range(thread.GetNumFrames()))))
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000897
898
Johnny Chend0fef812011-04-25 23:38:13 +0000899def get_module_names(thread):
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000900 """
901 Returns a sequence of module names from the stack frames of this thread.
902 """
903 def GetModuleName(i):
Kate Stoneb9c1b512016-09-06 20:57:50 +0000904 return thread.GetFrameAtIndex(
905 i).GetModule().GetFileSpec().GetFilename()
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000906
Zachary Turner744cd5d2015-10-26 16:49:57 +0000907 return list(map(GetModuleName, list(range(thread.GetNumFrames()))))
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000908
909
Johnny Chend0fef812011-04-25 23:38:13 +0000910def get_stack_frames(thread):
Johnny Chen43a651c2010-09-09 00:55:07 +0000911 """
912 Returns a sequence of stack frames for this thread.
913 """
914 def GetStackFrame(i):
915 return thread.GetFrameAtIndex(i)
916
Zachary Turner744cd5d2015-10-26 16:49:57 +0000917 return list(map(GetStackFrame, list(range(thread.GetNumFrames()))))
Johnny Chen43a651c2010-09-09 00:55:07 +0000918
919
Kate Stoneb9c1b512016-09-06 20:57:50 +0000920def print_stacktrace(thread, string_buffer=False):
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000921 """Prints a simple stack trace of this thread."""
Johnny Chen6c704992010-10-07 18:52:48 +0000922
Zachary Turner814236d2015-10-21 17:48:52 +0000923 output = SixStringIO() if string_buffer else sys.stdout
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000924 target = thread.GetProcess().GetTarget()
925
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000926 depth = thread.GetNumFrames()
927
Johnny Chend0fef812011-04-25 23:38:13 +0000928 mods = get_module_names(thread)
929 funcs = get_function_names(thread)
930 symbols = get_symbol_names(thread)
931 files = get_filenames(thread)
932 lines = get_line_numbers(thread)
933 addrs = get_pc_addresses(thread)
Johnny Chen6c704992010-10-07 18:52:48 +0000934
Johnny Chen567a0452010-10-25 19:13:52 +0000935 if thread.GetStopReason() != lldb.eStopReasonInvalid:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000936 desc = "stop reason=" + stop_reason_to_str(thread.GetStopReason())
Johnny Chen567a0452010-10-25 19:13:52 +0000937 else:
938 desc = ""
Kate Stoneb9c1b512016-09-06 20:57:50 +0000939 print(
940 "Stack trace for thread id={0:#x} name={1} queue={2} ".format(
941 thread.GetThreadID(),
942 thread.GetName(),
943 thread.GetQueueName()) + desc,
944 file=output)
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000945
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000946 for i in range(depth):
947 frame = thread.GetFrameAtIndex(i)
948 function = frame.GetFunction()
Johnny Chen30ee4ef2010-09-08 22:54:46 +0000949
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000950 load_addr = addrs[i].GetLoadAddress(target)
Johnny Chen3cd1e552011-05-25 19:06:18 +0000951 if not function:
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000952 file_addr = addrs[i].GetFileAddress()
Johnny Chen0d4f6dd2011-06-16 22:07:48 +0000953 start_addr = frame.GetSymbol().GetStartAddress().GetFileAddress()
954 symbol_offset = file_addr - start_addr
Kate Stoneb9c1b512016-09-06 20:57:50 +0000955 print(
956 " frame #{num}: {addr:#016x} {mod}`{symbol} + {offset}".format(
957 num=i,
958 addr=load_addr,
959 mod=mods[i],
960 symbol=symbols[i],
961 offset=symbol_offset),
962 file=output)
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000963 else:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000964 print(
965 " frame #{num}: {addr:#016x} {mod}`{func} at {file}:{line} {args}".format(
966 num=i,
967 addr=load_addr,
968 mod=mods[i],
969 func='%s [inlined]' %
970 funcs[i] if frame.IsInlined() else funcs[i],
971 file=files[i],
972 line=lines[i],
973 args=get_args_as_string(
974 frame,
975 showFuncName=False) if not frame.IsInlined() else '()'),
976 file=output)
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000977
978 if string_buffer:
Johnny Chend5d6fac2010-10-15 23:33:18 +0000979 return output.getvalue()
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000980
981
Kate Stoneb9c1b512016-09-06 20:57:50 +0000982def print_stacktraces(process, string_buffer=False):
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000983 """Prints the stack traces of all the threads."""
984
Zachary Turner814236d2015-10-21 17:48:52 +0000985 output = SixStringIO() if string_buffer else sys.stdout
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000986
Zachary Turnerff890da2015-10-19 23:45:41 +0000987 print("Stack traces for " + str(process), file=output)
Johnny Chen7ea9aee2010-10-07 21:38:28 +0000988
Johnny Chenae9639a2011-05-05 18:50:56 +0000989 for thread in process:
Zachary Turnerff890da2015-10-19 23:45:41 +0000990 print(print_stacktrace(thread, string_buffer=True), file=output)
Johnny Chen6c704992010-10-07 18:52:48 +0000991
992 if string_buffer:
Johnny Chend5d6fac2010-10-15 23:33:18 +0000993 return output.getvalue()
Johnny Chenb21c52e2011-05-08 17:25:27 +0000994
Kate Stoneb9c1b512016-09-06 20:57:50 +0000995
996def expect_state_changes(test, listener, process, states, timeout=5):
Pavel Labath5dcb0252015-09-02 09:12:28 +0000997 """Listens for state changed events on the listener and makes sure they match what we
998 expect. Stop-and-restart events (where GetRestartedFromEvent() returns true) are ignored."""
Pavel Labathe5c98082016-01-06 11:40:06 +0000999
Pavel Labath5dcb0252015-09-02 09:12:28 +00001000 for expected_state in states:
Pavel Labathe5c98082016-01-06 11:40:06 +00001001 def get_next_event():
1002 event = lldb.SBEvent()
Kate Stoneb9c1b512016-09-06 20:57:50 +00001003 if not listener.WaitForEventForBroadcasterWithType(
1004 timeout,
1005 process.GetBroadcaster(),
1006 lldb.SBProcess.eBroadcastBitStateChanged,
1007 event):
1008 test.fail(
1009 "Timed out while waiting for a transition to state %s" %
Pavel Labathe5c98082016-01-06 11:40:06 +00001010 lldb.SBDebugger.StateAsCString(expected_state))
1011 return event
Pavel Labath5dcb0252015-09-02 09:12:28 +00001012
Pavel Labathe5c98082016-01-06 11:40:06 +00001013 event = get_next_event()
1014 while (lldb.SBProcess.GetStateFromEvent(event) == lldb.eStateStopped and
1015 lldb.SBProcess.GetRestartedFromEvent(event)):
1016 # Ignore restarted event and the subsequent running event.
1017 event = get_next_event()
Kate Stoneb9c1b512016-09-06 20:57:50 +00001018 test.assertEqual(
1019 lldb.SBProcess.GetStateFromEvent(event),
1020 lldb.eStateRunning,
1021 "Restarted event followed by a running event")
Pavel Labathe5c98082016-01-06 11:40:06 +00001022 event = get_next_event()
Pavel Labath5dcb0252015-09-02 09:12:28 +00001023
Kate Stoneb9c1b512016-09-06 20:57:50 +00001024 test.assertEqual(
1025 lldb.SBProcess.GetStateFromEvent(event),
1026 expected_state)
Pavel Labath5dcb0252015-09-02 09:12:28 +00001027
Johnny Chenb21c52e2011-05-08 17:25:27 +00001028# ===================================
1029# Utility functions related to Frames
1030# ===================================
1031
Kate Stoneb9c1b512016-09-06 20:57:50 +00001032
Johnny Chenad7372c2011-05-12 00:32:41 +00001033def get_parent_frame(frame):
1034 """
1035 Returns the parent frame of the input frame object; None if not available.
1036 """
1037 thread = frame.GetThread()
1038 parent_found = False
1039 for f in thread:
1040 if parent_found:
1041 return f
1042 if f.GetFrameID() == frame.GetFrameID():
1043 parent_found = True
1044
1045 # If we reach here, no parent has been found, return None.
1046 return None
1047
Kate Stoneb9c1b512016-09-06 20:57:50 +00001048
Johnny Chen0d4f6dd2011-06-16 22:07:48 +00001049def get_args_as_string(frame, showFuncName=True):
Johnny Chenad7372c2011-05-12 00:32:41 +00001050 """
1051 Returns the args of the input frame object as a string.
1052 """
1053 # arguments => True
1054 # locals => False
1055 # statics => False
1056 # in_scope_only => True
Kate Stoneb9c1b512016-09-06 20:57:50 +00001057 vars = frame.GetVariables(True, False, False, True) # type of SBValueList
1058 args = [] # list of strings
Johnny Chenad7372c2011-05-12 00:32:41 +00001059 for var in vars:
1060 args.append("(%s)%s=%s" % (var.GetTypeName(),
1061 var.GetName(),
Greg Claytonfe42ac42011-08-03 22:57:10 +00001062 var.GetValue()))
Johnny Chen3cd1e552011-05-25 19:06:18 +00001063 if frame.GetFunction():
Johnny Chen52b0ffd92011-05-13 00:44:49 +00001064 name = frame.GetFunction().GetName()
Johnny Chen3cd1e552011-05-25 19:06:18 +00001065 elif frame.GetSymbol():
Johnny Chen52b0ffd92011-05-13 00:44:49 +00001066 name = frame.GetSymbol().GetName()
1067 else:
1068 name = ""
Johnny Chen0d4f6dd2011-06-16 22:07:48 +00001069 if showFuncName:
1070 return "%s(%s)" % (name, ", ".join(args))
1071 else:
1072 return "(%s)" % (", ".join(args))
Kate Stoneb9c1b512016-09-06 20:57:50 +00001073
1074
1075def print_registers(frame, string_buffer=False):
Johnny Chen2158b972011-05-08 18:55:37 +00001076 """Prints all the register sets of the frame."""
Johnny Chenb21c52e2011-05-08 17:25:27 +00001077
Zachary Turner814236d2015-10-21 17:48:52 +00001078 output = SixStringIO() if string_buffer else sys.stdout
Johnny Chenb21c52e2011-05-08 17:25:27 +00001079
Zachary Turnerff890da2015-10-19 23:45:41 +00001080 print("Register sets for " + str(frame), file=output)
Johnny Chenb21c52e2011-05-08 17:25:27 +00001081
Kate Stoneb9c1b512016-09-06 20:57:50 +00001082 registerSet = frame.GetRegisters() # Return type of SBValueList.
1083 print("Frame registers (size of register set = %d):" %
1084 registerSet.GetSize(), file=output)
Johnny Chen64ff7e62011-05-10 19:21:13 +00001085 for value in registerSet:
Zachary Turner35d017f2015-10-23 17:04:29 +00001086 #print(value, file=output)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001087 print("%s (number of children = %d):" %
1088 (value.GetName(), value.GetNumChildren()), file=output)
Johnny Chenb21c52e2011-05-08 17:25:27 +00001089 for child in value:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001090 print(
1091 "Name: %s, Value: %s" %
1092 (child.GetName(),
1093 child.GetValue()),
1094 file=output)
Johnny Chenb21c52e2011-05-08 17:25:27 +00001095
1096 if string_buffer:
1097 return output.getvalue()
Johnny Chen64ff7e62011-05-10 19:21:13 +00001098
Kate Stoneb9c1b512016-09-06 20:57:50 +00001099
Johnny Chen64ff7e62011-05-10 19:21:13 +00001100def get_registers(frame, kind):
1101 """Returns the registers given the frame and the kind of registers desired.
1102
1103 Returns None if there's no such kind.
1104 """
Kate Stoneb9c1b512016-09-06 20:57:50 +00001105 registerSet = frame.GetRegisters() # Return type of SBValueList.
Johnny Chen64ff7e62011-05-10 19:21:13 +00001106 for value in registerSet:
1107 if kind.lower() in value.GetName().lower():
1108 return value
1109
1110 return None
1111
Kate Stoneb9c1b512016-09-06 20:57:50 +00001112
Johnny Chen64ff7e62011-05-10 19:21:13 +00001113def get_GPRs(frame):
1114 """Returns the general purpose registers of the frame as an SBValue.
1115
Johnny Chene9e86892011-05-10 23:01:44 +00001116 The returned SBValue object is iterable. An example:
1117 ...
1118 from lldbutil import get_GPRs
1119 regs = get_GPRs(frame)
1120 for reg in regs:
Zachary Turner35d017f2015-10-23 17:04:29 +00001121 print("%s => %s" % (reg.GetName(), reg.GetValue()))
Johnny Chene9e86892011-05-10 23:01:44 +00001122 ...
Johnny Chen64ff7e62011-05-10 19:21:13 +00001123 """
1124 return get_registers(frame, "general purpose")
1125
Kate Stoneb9c1b512016-09-06 20:57:50 +00001126
Johnny Chen64ff7e62011-05-10 19:21:13 +00001127def get_FPRs(frame):
1128 """Returns the floating point registers of the frame as an SBValue.
1129
Johnny Chene9e86892011-05-10 23:01:44 +00001130 The returned SBValue object is iterable. An example:
1131 ...
1132 from lldbutil import get_FPRs
1133 regs = get_FPRs(frame)
1134 for reg in regs:
Zachary Turner35d017f2015-10-23 17:04:29 +00001135 print("%s => %s" % (reg.GetName(), reg.GetValue()))
Johnny Chene9e86892011-05-10 23:01:44 +00001136 ...
Johnny Chen64ff7e62011-05-10 19:21:13 +00001137 """
1138 return get_registers(frame, "floating point")
1139
Kate Stoneb9c1b512016-09-06 20:57:50 +00001140
Johnny Chen64ff7e62011-05-10 19:21:13 +00001141def get_ESRs(frame):
1142 """Returns the exception state registers of the frame as an SBValue.
1143
Johnny Chene9e86892011-05-10 23:01:44 +00001144 The returned SBValue object is iterable. An example:
1145 ...
1146 from lldbutil import get_ESRs
1147 regs = get_ESRs(frame)
1148 for reg in regs:
Zachary Turner35d017f2015-10-23 17:04:29 +00001149 print("%s => %s" % (reg.GetName(), reg.GetValue()))
Johnny Chene9e86892011-05-10 23:01:44 +00001150 ...
Johnny Chen64ff7e62011-05-10 19:21:13 +00001151 """
1152 return get_registers(frame, "exception state")
Johnny Chen989b7ef2011-07-22 00:47:58 +00001153
Johnny Chenefee1cd2011-07-22 00:51:54 +00001154# ======================================
1155# Utility classes/functions for SBValues
1156# ======================================
Johnny Chen989b7ef2011-07-22 00:47:58 +00001157
Kate Stoneb9c1b512016-09-06 20:57:50 +00001158
Johnny Chen989b7ef2011-07-22 00:47:58 +00001159class BasicFormatter(object):
Johnny Chen36d7d912011-07-22 22:01:35 +00001160 """The basic formatter inspects the value object and prints the value."""
Kate Stoneb9c1b512016-09-06 20:57:50 +00001161
Johnny Chen989b7ef2011-07-22 00:47:58 +00001162 def format(self, value, buffer=None, indent=0):
1163 if not buffer:
Zachary Turner814236d2015-10-21 17:48:52 +00001164 output = SixStringIO()
Johnny Chen989b7ef2011-07-22 00:47:58 +00001165 else:
1166 output = buffer
Johnny Chen36d7d912011-07-22 22:01:35 +00001167 # If there is a summary, it suffices.
1168 val = value.GetSummary()
1169 # Otherwise, get the value.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001170 if val is None:
Johnny Chen36d7d912011-07-22 22:01:35 +00001171 val = value.GetValue()
Kate Stoneb9c1b512016-09-06 20:57:50 +00001172 if val is None and value.GetNumChildren() > 0:
Johnny Chen36d7d912011-07-22 22:01:35 +00001173 val = "%s (location)" % value.GetLocation()
Zachary Turnerff890da2015-10-19 23:45:41 +00001174 print("{indentation}({type}) {name} = {value}".format(
Kate Stoneb9c1b512016-09-06 20:57:50 +00001175 indentation=' ' * indent,
1176 type=value.GetTypeName(),
1177 name=value.GetName(),
1178 value=val), file=output)
Johnny Chen989b7ef2011-07-22 00:47:58 +00001179 return output.getvalue()
1180
Kate Stoneb9c1b512016-09-06 20:57:50 +00001181
Johnny Chen989b7ef2011-07-22 00:47:58 +00001182class ChildVisitingFormatter(BasicFormatter):
Johnny Chen36d7d912011-07-22 22:01:35 +00001183 """The child visiting formatter prints the value and its immediate children.
1184
1185 The constructor takes a keyword arg: indent_child, which defaults to 2.
1186 """
Kate Stoneb9c1b512016-09-06 20:57:50 +00001187
Johnny Chen36d7d912011-07-22 22:01:35 +00001188 def __init__(self, indent_child=2):
1189 """Default indentation of 2 SPC's for the children."""
1190 self.cindent = indent_child
Kate Stoneb9c1b512016-09-06 20:57:50 +00001191
Johnny Chen989b7ef2011-07-22 00:47:58 +00001192 def format(self, value, buffer=None):
1193 if not buffer:
Zachary Turner814236d2015-10-21 17:48:52 +00001194 output = SixStringIO()
Johnny Chen989b7ef2011-07-22 00:47:58 +00001195 else:
1196 output = buffer
1197
1198 BasicFormatter.format(self, value, buffer=output)
1199 for child in value:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001200 BasicFormatter.format(
1201 self, child, buffer=output, indent=self.cindent)
Johnny Chen36d7d912011-07-22 22:01:35 +00001202
1203 return output.getvalue()
1204
Kate Stoneb9c1b512016-09-06 20:57:50 +00001205
Johnny Chen36d7d912011-07-22 22:01:35 +00001206class RecursiveDecentFormatter(BasicFormatter):
1207 """The recursive decent formatter prints the value and the decendents.
1208
1209 The constructor takes two keyword args: indent_level, which defaults to 0,
1210 and indent_child, which defaults to 2. The current indentation level is
1211 determined by indent_level, while the immediate children has an additional
Kate Stoneb9c1b512016-09-06 20:57:50 +00001212 indentation by inden_child.
Johnny Chen36d7d912011-07-22 22:01:35 +00001213 """
Kate Stoneb9c1b512016-09-06 20:57:50 +00001214
Johnny Chen36d7d912011-07-22 22:01:35 +00001215 def __init__(self, indent_level=0, indent_child=2):
1216 self.lindent = indent_level
1217 self.cindent = indent_child
Kate Stoneb9c1b512016-09-06 20:57:50 +00001218
Johnny Chen36d7d912011-07-22 22:01:35 +00001219 def format(self, value, buffer=None):
1220 if not buffer:
Zachary Turner814236d2015-10-21 17:48:52 +00001221 output = SixStringIO()
Johnny Chen36d7d912011-07-22 22:01:35 +00001222 else:
1223 output = buffer
1224
1225 BasicFormatter.format(self, value, buffer=output, indent=self.lindent)
1226 new_indent = self.lindent + self.cindent
1227 for child in value:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001228 if child.GetSummary() is not None:
1229 BasicFormatter.format(
1230 self, child, buffer=output, indent=new_indent)
Johnny Chen36d7d912011-07-22 22:01:35 +00001231 else:
1232 if child.GetNumChildren() > 0:
1233 rdf = RecursiveDecentFormatter(indent_level=new_indent)
1234 rdf.format(child, buffer=output)
1235 else:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001236 BasicFormatter.format(
1237 self, child, buffer=output, indent=new_indent)
Johnny Chen989b7ef2011-07-22 00:47:58 +00001238
1239 return output.getvalue()
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00001240
1241# ===========================================================
1242# Utility functions for path manipulation on remote platforms
1243# ===========================================================
1244
Kate Stoneb9c1b512016-09-06 20:57:50 +00001245
Chaoren Lin3e2bdb42015-05-11 17:53:39 +00001246def join_remote_paths(*paths):
1247 # TODO: update with actual platform name for remote windows once it exists
1248 if lldb.remote_platform.GetName() == 'remote-windows':
1249 return os.path.join(*paths).replace(os.path.sep, '\\')
1250 return os.path.join(*paths).replace(os.path.sep, '/')
1251
Kate Stoneb9c1b512016-09-06 20:57:50 +00001252
Pavel Labathf3a9ab02018-02-21 15:33:53 +00001253def append_to_process_working_directory(test, *paths):
Chaoren Lin5d76b1b2015-06-06 00:25:50 +00001254 remote = lldb.remote_platform
1255 if remote:
1256 return join_remote_paths(remote.GetWorkingDirectory(), *paths)
Pavel Labathf3a9ab02018-02-21 15:33:53 +00001257 return os.path.join(test.getBuildDir(), *paths)
Chaoren Linf59d05092015-06-02 16:46:28 +00001258
1259# ==================================================
1260# Utility functions to get the correct signal number
1261# ==================================================
1262
1263import signal
1264
Kate Stoneb9c1b512016-09-06 20:57:50 +00001265
Chaoren Linf59d05092015-06-02 16:46:28 +00001266def get_signal_number(signal_name):
1267 platform = lldb.remote_platform
Chaoren Lin98d0a4b2015-07-14 01:09:28 +00001268 if platform and platform.IsValid():
1269 signals = platform.GetUnixSignals()
1270 if signals.IsValid():
Chaoren Lin264e5422015-06-02 18:31:57 +00001271 signal_number = signals.GetSignalNumberFromName(signal_name)
1272 if signal_number > 0:
1273 return signal_number
Chaoren Lin98d0a4b2015-07-14 01:09:28 +00001274 # No remote platform; fall back to using local python signals.
Chaoren Linf59d05092015-06-02 16:46:28 +00001275 return getattr(signal, signal_name)
Enrico Granata0b5a6e32015-09-18 20:12:52 +00001276
Kate Stoneb9c1b512016-09-06 20:57:50 +00001277
Enrico Granata0b5a6e32015-09-18 20:12:52 +00001278class PrintableRegex(object):
Kate Stoneb9c1b512016-09-06 20:57:50 +00001279
Enrico Granata0b5a6e32015-09-18 20:12:52 +00001280 def __init__(self, text):
1281 self.regex = re.compile(text)
1282 self.text = text
Kate Stoneb9c1b512016-09-06 20:57:50 +00001283
Enrico Granata0b5a6e32015-09-18 20:12:52 +00001284 def match(self, str):
1285 return self.regex.match(str)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001286
Enrico Granata0b5a6e32015-09-18 20:12:52 +00001287 def __str__(self):
1288 return "%s" % (self.text)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001289
Enrico Granata0b5a6e32015-09-18 20:12:52 +00001290 def __repr__(self):
1291 return "re.compile(%s) -> %s" % (self.text, self.regex)
1292
Kate Stoneb9c1b512016-09-06 20:57:50 +00001293
Enrico Granataef4fa442015-12-04 19:50:05 +00001294def skip_if_callable(test, mycallable, reason):
1295 if six.callable(mycallable):
1296 if mycallable(test):
1297 test.skipTest(reason)
1298 return True
Enrico Granata0b5a6e32015-09-18 20:12:52 +00001299 return False
1300
Kate Stoneb9c1b512016-09-06 20:57:50 +00001301
Enrico Granata0b5a6e32015-09-18 20:12:52 +00001302def skip_if_library_missing(test, target, library):
1303 def find_library(target, library):
1304 for module in target.modules:
1305 filename = module.file.GetFilename()
1306 if isinstance(library, str):
1307 if library == filename:
1308 return False
1309 elif hasattr(library, 'match'):
1310 if library.match(filename):
1311 return False
1312 return True
Kate Stoneb9c1b512016-09-06 20:57:50 +00001313
Enrico Granata0b5a6e32015-09-18 20:12:52 +00001314 def find_library_callable(test):
1315 return find_library(target, library)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001316 return skip_if_callable(
1317 test,
1318 find_library_callable,
1319 "could not find library matching '%s' in target %s" %
1320 (library,
1321 target))
Tamas Berghammer19fc1d42016-04-05 14:08:18 +00001322
Kate Stoneb9c1b512016-09-06 20:57:50 +00001323
Pavel Labath107052f2018-03-15 13:47:09 +00001324def read_file_on_target(test, remote):
1325 if lldb.remote_platform:
1326 local = test.getBuildArtifact("file_from_target")
1327 error = lldb.remote_platform.Get(lldb.SBFileSpec(remote, False),
1328 lldb.SBFileSpec(local, True))
1329 test.assertTrue(error.Success(), "Reading file {0} failed: {1}".format(remote, error))
1330 else:
1331 local = remote
1332 with open(local, 'r') as f:
1333 return f.read()
1334
1335def read_file_from_process_wd(test, name):
1336 path = append_to_process_working_directory(test, name)
1337 return read_file_on_target(test, path)
1338
Kate Stoneb9c1b512016-09-06 20:57:50 +00001339def wait_for_file_on_target(testcase, file_path, max_attempts=6):
Tamas Berghammer19fc1d42016-04-05 14:08:18 +00001340 for i in range(max_attempts):
1341 err, retcode, msg = testcase.run_platform_command("ls %s" % file_path)
1342 if err.Success() and retcode == 0:
1343 break
1344 if i < max_attempts:
1345 # Exponential backoff!
Todd Fiala464f7df2016-04-08 18:06:11 +00001346 import time
Tamas Berghammer19fc1d42016-04-05 14:08:18 +00001347 time.sleep(pow(2, i) * 0.25)
1348 else:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001349 testcase.fail(
1350 "File %s not found even after %d attempts." %
1351 (file_path, max_attempts))
Tamas Berghammer19fc1d42016-04-05 14:08:18 +00001352
Pavel Labath107052f2018-03-15 13:47:09 +00001353 return read_file_on_target(testcase, file_path)