494 lines · python
1"""2Test lldb data formatter subsystem.3"""4 5 6import lldb7from lldbsuite.test.decorators import *8from lldbsuite.test.lldbtest import *9from lldbsuite.test import lldbutil10 11 12class SmartArrayDataFormatterTestCase(TestBase):13 def test_with_run_command(self):14 """Test data formatter commands."""15 self.build()16 self.data_formatter_commands()17 18 def setUp(self):19 # Call super's setUp().20 TestBase.setUp(self)21 # Find the line number to break at.22 self.line = line_number("main.cpp", "// Set break point at this line.")23 24 def data_formatter_commands(self):25 """Test that that file and class static variables display correctly."""26 self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)27 28 lldbutil.run_break_set_by_file_and_line(29 self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True30 )31 32 self.runCmd("run", RUN_SUCCEEDED)33 34 process = self.dbg.GetSelectedTarget().GetProcess()35 36 # The stop reason of the thread should be breakpoint.37 self.expect(38 "thread list",39 STOPPED_DUE_TO_BREAKPOINT,40 substrs=["stopped", "stop reason = breakpoint"],41 )42 43 # This is the function to remove the custom formats in order to have a44 # clean slate for the next test case.45 def cleanup():46 self.runCmd("type format clear", check=False)47 self.runCmd("type summary clear", check=False)48 49 # Execute the cleanup function during test case tear down.50 self.addTearDownHook(cleanup)51 52 # check that we are not looping here53 self.runCmd('type summary add --summary-string "${var%V}" SomeData')54 55 self.expect("frame variable data", substrs=["SomeData @ 0x"])56 # ${var%s}57 self.runCmd('type summary add --summary-string "ptr = ${var%s}" "char *"')58 59 self.expect("frame variable strptr", substrs=['ptr = "', "Hello world!"])60 61 self.expect(62 "frame variable other.strptr", substrs=['ptr = "', "Nested Hello world!"]63 )64 65 self.runCmd(66 'type summary add --summary-string "arr = ${var%s}" -x "char\\[[0-9]+\\]"'67 )68 69 self.expect("frame variable strarr", substrs=['arr = "', "Hello world!"])70 71 self.expect(72 "frame variable other.strarr", substrs=['arr = "', "Nested Hello world!"]73 )74 75 self.expect("expression strarr", substrs=['arr = "', "Hello world!"])76 77 self.expect(78 "expression other.strarr", substrs=['arr = "', "Nested Hello world!"]79 )80 81 # ${var%c}82 self.runCmd('type summary add --summary-string "ptr = ${var%c}" "char *"')83 84 self.expect("frame variable strptr", substrs=['ptr = "', "Hello world!"])85 86 self.expect(87 "frame variable other.strptr", substrs=['ptr = "', "Nested Hello world!"]88 )89 90 self.expect("expression strptr", substrs=['ptr = "', "Hello world!"])91 92 self.expect(93 "expression other.strptr", substrs=['ptr = "', "Nested Hello world!"]94 )95 96 self.runCmd(97 'type summary add --summary-string "arr = ${var%c}" -x "char\\[[0-9]+\\]"'98 )99 100 self.expect("frame variable strarr", substrs=['arr = "', "Hello world!"])101 102 self.expect(103 "frame variable other.strarr", substrs=['arr = "', "Nested Hello world!"]104 )105 106 self.expect("expression strarr", substrs=['arr = "', "Hello world!"])107 108 self.expect(109 "expression other.strarr", substrs=['arr = "', "Nested Hello world!"]110 )111 112 # ${var%char[]}113 self.runCmd(114 'type summary add --summary-string "arr = ${var%char[]}" -x "char\\[[0-9]+\\]"'115 )116 117 self.expect("frame variable strarr", substrs=['arr = "', "Hello world!"])118 119 self.expect(120 "frame variable other.strarr", substrs=["arr = ", "Nested Hello world!"]121 )122 123 self.expect("expression strarr", substrs=['arr = "', "Hello world!"])124 125 self.expect(126 "expression other.strarr", substrs=["arr = ", "Nested Hello world!"]127 )128 129 self.runCmd('type summary add --summary-string "ptr = ${var%char[]}" "char *"')130 131 self.expect("frame variable strptr", substrs=['ptr = "', "Hello world!"])132 133 self.expect(134 "frame variable other.strptr", substrs=['ptr = "', "Nested Hello world!"]135 )136 137 self.expect("expression strptr", substrs=['ptr = "', "Hello world!"])138 139 self.expect(140 "expression other.strptr", substrs=['ptr = "', "Nested Hello world!"]141 )142 143 # ${var%a}144 self.runCmd(145 'type summary add --summary-string "arr = ${var%a}" -x "char\\[[0-9]+\\]"'146 )147 148 self.expect("frame variable strarr", substrs=['arr = "', "Hello world!"])149 150 self.expect(151 "frame variable other.strarr", substrs=["arr = ", "Nested Hello world!"]152 )153 154 self.expect("expression strarr", substrs=['arr = "', "Hello world!"])155 156 self.expect(157 "expression other.strarr", substrs=["arr = ", "Nested Hello world!"]158 )159 160 self.runCmd('type summary add --summary-string "ptr = ${var%a}" "char *"')161 162 self.expect("frame variable strptr", substrs=['ptr = "', "Hello world!"])163 164 self.expect(165 "frame variable other.strptr", substrs=['ptr = "', "Nested Hello world!"]166 )167 168 self.expect("expression strptr", substrs=['ptr = "', "Hello world!"])169 170 self.expect(171 "expression other.strptr", substrs=['ptr = "', "Nested Hello world!"]172 )173 174 self.runCmd(175 'type summary add --summary-string "ptr = ${var[]%char[]}" "char *"'176 )177 178 # I do not know the size of the data, but you are asking for a full array slice..179 # use the ${var%char[]} to obtain a string as result180 self.expect(181 "frame variable strptr", matching=False, substrs=['ptr = "', "Hello world!"]182 )183 184 self.expect(185 "frame variable other.strptr",186 matching=False,187 substrs=['ptr = "', "Nested Hello world!"],188 )189 190 self.expect(191 "expression strptr", matching=False, substrs=['ptr = "', "Hello world!"]192 )193 194 self.expect(195 "expression other.strptr",196 matching=False,197 substrs=['ptr = "', "Nested Hello world!"],198 )199 200 # You asked an array-style printout...201 self.runCmd(202 'type summary add --summary-string "ptr = ${var[0-1]%char[]}" "char *"'203 )204 205 self.expect("frame variable strptr", substrs=["ptr = ", "[{H},{e}]"])206 207 self.expect("frame variable other.strptr", substrs=["ptr = ", "[{N},{e}]"])208 209 self.expect("expression strptr", substrs=["ptr = ", "[{H},{e}]"])210 211 self.expect("expression other.strptr", substrs=["ptr = ", "[{N},{e}]"])212 213 # using [] is required here214 self.runCmd('type summary add --summary-string "arr = ${var%x}" "int [5]"')215 216 self.expect(217 "frame variable intarr",218 matching=False,219 substrs=["0x00000001,0x00000001,0x00000002,0x00000003,0x00000005"],220 )221 222 self.expect(223 "frame variable other.intarr",224 matching=False,225 substrs=["0x00000009,0x00000008,0x00000007,0x00000006,0x00000005"],226 )227 228 self.runCmd('type summary add --summary-string "arr = ${var[]%x}" "int[5]"')229 230 self.expect(231 "frame variable intarr",232 substrs=[233 "intarr = arr =",234 "0x00000001,0x00000001,0x00000002,0x00000003,0x00000005",235 ],236 )237 238 self.expect(239 "frame variable other.intarr",240 substrs=[241 "intarr = arr =",242 "0x00000009,0x00000008,0x00000007,0x00000006,0x00000005",243 ],244 )245 246 # printing each array item as an array247 self.runCmd(248 'type summary add --summary-string "arr = ${var[]%uint32_t[]}" "int[5]"'249 )250 251 self.expect(252 "frame variable intarr",253 substrs=[254 "intarr = arr =",255 "{0x00000001},{0x00000001},{0x00000002},{0x00000003},{0x00000005}",256 ],257 )258 259 self.expect(260 "frame variable other.intarr",261 substrs=[262 "intarr = arr = ",263 "{0x00000009},{0x00000008},{0x00000007},{0x00000006},{0x00000005}",264 ],265 )266 267 # printing full array as an array268 self.runCmd(269 'type summary add --summary-string "arr = ${var%uint32_t[]}" "int[5]"'270 )271 272 self.expect(273 "frame variable intarr",274 substrs=[275 "intarr = arr =",276 "0x00000001,0x00000001,0x00000002,0x00000003,0x00000005",277 ],278 )279 280 self.expect(281 "frame variable other.intarr",282 substrs=[283 "intarr = arr =",284 "0x00000009,0x00000008,0x00000007,0x00000006,0x00000005",285 ],286 )287 288 # printing each array item as an array289 self.runCmd(290 'type summary add --summary-string "arr = ${var[]%float32[]}" "float[7]"'291 )292 293 self.expect(294 "frame variable flarr",295 substrs=[296 "flarr = arr =",297 "{78.5},{77.25},{78},{76.125},{76.75},{76.875},{77}",298 ],299 )300 301 self.expect(302 "frame variable other.flarr",303 substrs=[304 "flarr = arr = ",305 "{25.5},{25.25},{25.125},{26.75},{27.375},{27.5},{26.125}",306 ],307 )308 309 # printing full array as an array310 self.runCmd(311 'type summary add --summary-string "arr = ${var%float32[]}" "float[7]"'312 )313 314 self.expect(315 "frame variable flarr",316 substrs=["flarr = arr =", "78.5,77.25,78,76.125,76.75,76.875,77"],317 )318 319 self.expect(320 "frame variable other.flarr",321 substrs=["flarr = arr =", "25.5,25.25,25.125,26.75,27.375,27.5,26.125"],322 )323 324 # using array smart summary strings for pointers should make no sense325 self.runCmd(326 'type summary add --summary-string "arr = ${var%float32[]}" "float *"'327 )328 self.runCmd(329 'type summary add --summary-string "arr = ${var%int32_t[]}" "int *"'330 )331 332 self.expect(333 "frame variable flptr",334 matching=False,335 substrs=["78.5,77.25,78,76.125,76.75,76.875,77"],336 )337 338 self.expect("frame variable intptr", matching=False, substrs=["1,1,2,3,5"])339 340 # use y and Y341 self.runCmd('type summary add --summary-string "arr = ${var%y}" "float[7]"')342 self.runCmd('type summary add --summary-string "arr = ${var%y}" "int[5]"')343 344 if process.GetByteOrder() == lldb.eByteOrderLittle:345 self.expect(346 "frame variable flarr",347 substrs=[348 "flarr = arr =",349 "00 00 9d 42,00 80 9a 42,00 00 9c 42,00 40 98 42,00 80 99 42,00 c0 99 42,00 00 9a 42",350 ],351 )352 else:353 self.expect(354 "frame variable flarr",355 substrs=[356 "flarr = arr =",357 "42 9d 00 00,42 9a 80 00,42 9c 00 00,42 98 40 00,42 99 80 00,42 99 c0 00,42 9a 00 00",358 ],359 )360 361 if process.GetByteOrder() == lldb.eByteOrderLittle:362 self.expect(363 "frame variable other.flarr",364 substrs=[365 "flarr = arr =",366 "00 00 cc 41,00 00 ca 41,00 00 c9 41,00 00 d6 41,00 00 db 41,00 00 dc 41,00 00 d1 41",367 ],368 )369 else:370 self.expect(371 "frame variable other.flarr",372 substrs=[373 "flarr = arr =",374 "41 cc 00 00,41 ca 00 00,41 c9 00 00,41 d6 00 00,41 db 00 00,41 dc 00 00,41 d1 00 00",375 ],376 )377 378 if process.GetByteOrder() == lldb.eByteOrderLittle:379 self.expect(380 "frame variable intarr",381 substrs=[382 "intarr = arr =",383 "01 00 00 00,01 00 00 00,02 00 00 00,03 00 00 00,05 00 00 00",384 ],385 )386 else:387 self.expect(388 "frame variable intarr",389 substrs=[390 "intarr = arr =",391 "00 00 00 01,00 00 00 01,00 00 00 02,00 00 00 03,00 00 00 05",392 ],393 )394 395 if process.GetByteOrder() == lldb.eByteOrderLittle:396 self.expect(397 "frame variable other.intarr",398 substrs=[399 "intarr = arr = ",400 "09 00 00 00,08 00 00 00,07 00 00 00,06 00 00 00,05 00 00 00",401 ],402 )403 else:404 self.expect(405 "frame variable other.intarr",406 substrs=[407 "intarr = arr = ",408 "00 00 00 09,00 00 00 08,00 00 00 07,00 00 00 06,00 00 00 05",409 ],410 )411 412 self.runCmd('type summary add --summary-string "arr = ${var%Y}" "float[7]"')413 self.runCmd('type summary add --summary-string "arr = ${var%Y}" "int[5]"')414 415 if process.GetByteOrder() == lldb.eByteOrderLittle:416 self.expect(417 "frame variable flarr",418 substrs=[419 "flarr = arr =",420 "00 00 9d 42",421 "00 80 9a 42",422 "00 00 9c 42",423 "00 40 98 42",424 "00 80 99 42",425 "00 c0 99 42",426 "00 00 9a 42",427 ],428 )429 else:430 self.expect(431 "frame variable flarr",432 substrs=[433 "flarr = arr =",434 "42 9d 00 00",435 "42 9a 80 00",436 "42 9c 00 00",437 "42 98 40 00",438 "42 99 80 00",439 "42 99 c0 00",440 "42 9a 00 00",441 ],442 )443 444 if process.GetByteOrder() == lldb.eByteOrderLittle:445 self.expect(446 "frame variable other.flarr",447 substrs=[448 "flarr = arr =",449 "00 00 cc 41",450 "00 00 ca 41",451 "00 00 c9 41",452 "00 00 d6 41",453 "00 00 db 41",454 "00 00 dc 41",455 "00 00 d1 41",456 ],457 )458 else:459 self.expect(460 "frame variable other.flarr",461 substrs=[462 "flarr = arr =",463 "41 cc 00 00",464 "41 ca 00 00",465 "41 c9 00 00",466 "41 d6 00 00",467 "41 db 00 00",468 "41 dc 00 00",469 "41 d1 00 00",470 ],471 )472 473 if process.GetByteOrder() == lldb.eByteOrderLittle:474 self.expect(475 "frame variable intarr",476 substrs=["intarr = arr =", "....,01 00 00 00", "....,05 00 00 00"],477 )478 else:479 self.expect(480 "frame variable intarr",481 substrs=["intarr = arr =", "....,00 00 00 01", "....,00 00 00 05"],482 )483 484 if process.GetByteOrder() == lldb.eByteOrderLittle:485 self.expect(486 "frame variable other.intarr",487 substrs=["intarr = arr = ", "09 00 00 00", "....,07 00 00 00"],488 )489 else:490 self.expect(491 "frame variable other.intarr",492 substrs=["intarr = arr = ", "00 00 00 09", "....,00 00 00 07"],493 )494