1import bz2 2import shutil 3import struct 4 5import lldb 6from lldbsuite.test.decorators import * 7from lldbsuite.test.lldbtest import * 8from lldbsuite.test import lldbutil 9 10 11@skipIfFBSDVMCoreSupportMissing 12class FreeBSDKernelVMCoreTestCase(TestBase): 13 NO_DEBUG_INFO_TESTCASE = True 14 maxDiff = None 15 16 def make_target(self, src_filename): 17 src = self.getSourcePath(src_filename) 18 dest = self.getBuildArtifact("kernel") 19 self.yaml2obj(src, dest, max_size=30 * 1024 * 1024) 20 return self.dbg.CreateTarget(dest) 21 22 def make_vmcore(self, src_filename): 23 src = self.getSourcePath(src_filename) 24 dest = self.getBuildArtifact("vmcore") 25 with bz2.open(src, "rb") as inf: 26 with open(dest, "wb") as outf: 27 shutil.copyfileobj(inf, outf) 28 return dest 29 30 def do_test(self, kernel_yaml, vmcore_bz2, numthread, threads={}, hz=100): 31 target = self.make_target(kernel_yaml) 32 vmcore_file = self.make_vmcore(vmcore_bz2) 33 process = target.LoadCore(vmcore_file) 34 35 self.assertTrue(process, PROCESS_IS_VALID) 36 self.assertEqual(process.GetNumThreads(), numthread) 37 self.assertEqual(process.GetProcessID(), 0) 38 39 # test memory reading 40 self.expect("expr -- *(int *) &hz", substrs=["(int) $0 = %d" % hz]) 41 42 main_mod = target.GetModuleAtIndex(0) 43 hz_addr = main_mod.FindSymbols("hz")[0].symbol.addr.GetLoadAddress(target) 44 error = lldb.SBError() 45 self.assertEqual(process.ReadMemory(hz_addr, 4, error), struct.pack("<I", hz)) 46 47 for thread_index, thread_data in threads.items(): 48 bt_expected = thread_data["bt"] 49 regs_expected = thread_data["regs"] 50 thread = process.GetThreadAtIndex(thread_index) 51 self.assertEqual(thread.GetName(), thread_data["name"]) 52 53 # test backtrace 54 self.assertEqual( 55 [frame.addr.GetLoadAddress(target) for frame in thread], bt_expected 56 ) 57 58 # test registers 59 regs = thread.GetFrameAtIndex(0).GetRegisters() 60 reg_values = {} 61 for regset in regs: 62 for reg in regset: 63 if reg.value is None: 64 continue 65 reg_values[reg.name] = reg.value 66 self.assertEqual(reg_values, regs_expected) 67 68 self.dbg.DeleteTarget(target) 69 70 def test_amd64_full_vmcore(self): 71 self.do_test( 72 "kernel-amd64.yaml", 73 "vmcore-amd64-full.bz2", 74 numthread=13, 75 threads={ 76 0: { 77 "name": "(pid 806) sysctl (crashed)", 78 "bt": [ 79 0xFFFFFFFF80C09ADE, 80 0xFFFFFFFF80C09916, 81 0xFFFFFFFF80C09D90, 82 0xFFFFFFFF80C09B93, 83 0xFFFFFFFF80C57D91, 84 0xFFFFFFFF80C19E71, 85 0xFFFFFFFF80C192BC, 86 0xFFFFFFFF80C19933, 87 0xFFFFFFFF80C1977F, 88 0xFFFFFFFF8108BA8C, 89 0xFFFFFFFF810620CE, 90 ], 91 "regs": { 92 "rbx": "0x0000000000000000", 93 "rbp": "0xfffffe0085cb2760", 94 "rsp": "0xfffffe0085cb2748", 95 "r12": "0xfffffe0045a6c300", 96 "r13": "0xfffff800033693a8", 97 "r14": "0x0000000000000000", 98 "r15": "0xfffff80003369380", 99 "rip": "0xffffffff80c09ade", 100 }, 101 }, 102 1: { 103 "name": "(pid 11) idle/idle: cpu0 (on CPU 0)", 104 "bt": [ 105 0xFFFFFFFF81057988, 106 0xFFFFFFFF81057949, 107 0xFFFFFFFF8108A5FF, 108 0xFFFFFFFF81062537, 109 0xFFFFFFFF80C1AA38, 110 0xFFFFFFFF80B9D587, 111 0xFFFFFFFF810575B1, 112 0xFFFFFFFF81063B33, 113 0xFFFFFFFF804E3EDB, 114 0xFFFFFFFF8104DC6E, 115 0xFFFFFFFF8104DD1F, 116 0xFFFFFFFF80C3F0B4, 117 0xFFFFFFFF80BC7C5E, 118 ], 119 "regs": { 120 "rbx": "0xffffffff81d43950", 121 "rbp": "0xffffffff81d43820", 122 "rsp": "0xffffffff81d43808", 123 "r12": "0xfffff80003374000", 124 "r13": "0x00000000027be000", 125 "r14": "0x0000000000000000", 126 "r15": "0xfffffe00009f7300", 127 "rip": "0xffffffff81057988", 128 }, 129 }, 130 10: { 131 "name": "(pid 11) idle/idle: cpu9", 132 "bt": [ 133 0xFFFFFFFF80C3C8C8, 134 0xFFFFFFFF80C16521, 135 0xFFFFFFFF80C3F0B4, 136 0xFFFFFFFF80BC7C5E, 137 ], 138 "regs": { 139 "rbx": "0x000000007fff29f4", 140 "rbp": "0xfffffe00007a4ad0", 141 "rsp": "0xfffffe00007a4a08", 142 "r12": "0xfffffe00009fd300", 143 "r13": "0x0000000000000608", 144 "r14": "0xfffffe00009250c0", 145 "r15": "0xfffffe0045a6c300", 146 "rip": "0xffffffff80c3c8c8", 147 }, 148 }, 149 }, 150 ) 151 152 def test_amd64_minidump(self): 153 self.do_test( 154 "kernel-amd64.yaml", 155 "vmcore-amd64-minidump.bz2", 156 numthread=16, 157 threads={ 158 0: { 159 "name": "(pid 800) sysctl (crashed)", 160 "bt": [ 161 0xFFFFFFFF80C09ADE, 162 0xFFFFFFFF80C09916, 163 0xFFFFFFFF80C09D90, 164 0xFFFFFFFF80C09B93, 165 0xFFFFFFFF80C57D91, 166 0xFFFFFFFF80C19E71, 167 0xFFFFFFFF80C192BC, 168 0xFFFFFFFF80C19933, 169 0xFFFFFFFF80C1977F, 170 0xFFFFFFFF8108BA8C, 171 0xFFFFFFFF810620CE, 172 ], 173 "regs": { 174 "rbx": "0x0000000000000000", 175 "rbp": "0xfffffe00798c4760", 176 "rsp": "0xfffffe00798c4748", 177 "r12": "0xfffffe0045b11c00", 178 "r13": "0xfffff800033693a8", 179 "r14": "0x0000000000000000", 180 "r15": "0xfffff80003369380", 181 "rip": "0xffffffff80c09ade", 182 }, 183 }, 184 1: { 185 "name": "(pid 28) pagedaemon/dom0 (on CPU 4)", 186 "bt": [ 187 0xFFFFFFFF81057988, 188 0xFFFFFFFF81057949, 189 0xFFFFFFFF8108A5FF, 190 0xFFFFFFFF81062537, 191 0xFFFFFFFF8107171E, 192 0xFFFFFFFF81075F9C, 193 0xFFFFFFFF80F4359E, 194 0xFFFFFFFF80F494B4, 195 0xFFFFFFFF80F47430, 196 0xFFFFFFFF80F46EEE, 197 0xFFFFFFFF80BC7C5E, 198 ], 199 "regs": { 200 "rbx": "0xfffffe00008e2f30", 201 "rbp": "0xfffffe00008e2e00", 202 "rsp": "0xfffffe00008e2de8", 203 "r12": "0xfffff80003845000", 204 "r13": "0x00000000027be000", 205 "r14": "0x0000000000000004", 206 "r15": "0xfffffe00458c2700", 207 "rip": "0xffffffff81057988", 208 }, 209 }, 210 2: { 211 "name": "(pid 28) pagedaemon/laundry: dom0", 212 "bt": [ 213 0xFFFFFFFF80C3C8C8, 214 0xFFFFFFFF80C16521, 215 0xFFFFFFFF80C15C3B, 216 0xFFFFFFFF80F48DFC, 217 0xFFFFFFFF80BC7C5E, 218 ], 219 "regs": { 220 "rbx": "0x000000007fff25f1", 221 "rbp": "0xfffffe00527dd890", 222 "rsp": "0xfffffe00527dd7c8", 223 "r12": "0xfffffe0045b13100", 224 "r13": "0x0000000000000104", 225 "r14": "0xfffffe00008d70c0", 226 "r15": "0xfffffe00009f5e00", 227 "rip": "0xffffffff80c3c8c8", 228 }, 229 }, 230 }, 231 ) 232 233 def test_arm64_minidump(self): 234 self.do_test( 235 "kernel-arm64.yaml", 236 "vmcore-arm64-minidump.bz2", 237 hz=1000, 238 numthread=10, 239 threads={ 240 0: { 241 "name": "(pid 939) sysctl (crashed)", 242 # TODO: fix unwinding 243 "bt": [ 244 0xFFFF0000004B6E78, 245 ], 246 "regs": { 247 "x0": "0x0000000000000000", 248 "x1": "0x0000000000000000", 249 "x2": "0x0000000000000000", 250 "x3": "0x0000000000000000", 251 "x4": "0x0000000000000000", 252 "x5": "0x0000000000000000", 253 "x6": "0x0000000000000000", 254 "x7": "0x0000000000000000", 255 "x8": "0xffffa00001548700", 256 "x9": "0x0000000000000000", 257 "x10": "0xffffa00000e04580", 258 "x11": "0x0000000000000000", 259 "x12": "0x000000000008950a", 260 "x13": "0x0000000000089500", 261 "x14": "0x0000000000000039", 262 "x15": "0x0000000000000000", 263 "x16": "0x00000000ffffffd8", 264 "x17": "0x0000000000000000", 265 "x18": "0xffff000000e6d380", 266 "x19": "0xffff000000af9000", 267 "x20": "0xffff000000b82000", 268 "x21": "0xffffa00000319da8", 269 "x22": "0xffff000000b84000", 270 "x23": "0xffff000000b84000", 271 "x24": "0xffff000000b55000", 272 "x25": "0x0000000000000000", 273 "x26": "0x0000000000040800", 274 "x27": "0x0000000000000000", 275 "x28": "0x00000000002019ca", 276 "fp": "0xffff0000d58f23b0", 277 "sp": "0xffff0000d58f23b0", 278 "pc": "0xffff0000004b6e78", 279 }, 280 }, 281 1: { 282 "name": "(pid 21) syncer (on CPU 6)", 283 # TODO: fix unwinding 284 "bt": [ 285 0xFFFF000000811370, 286 ], 287 "regs": { 288 "x0": "0x0000000000000000", 289 "x1": "0x0000000000000000", 290 "x2": "0x0000000000000000", 291 "x3": "0x0000000000000000", 292 "x4": "0x0000000000000000", 293 "x5": "0x0000000000000000", 294 "x6": "0x0000000000000000", 295 "x7": "0x0000000000000000", 296 "x8": "0x0000000000000006", 297 "x9": "0x0000000000000560", 298 "x10": "0xffff000000e8f640", 299 "x11": "0x0000000000000001", 300 "x12": "0x0000000056000000", 301 "x13": "0x0000000000002af8", 302 "x14": "0x0000000000002710", 303 "x15": "0x0000000000000002", 304 "x16": "0x00000000ffffffff", 305 "x17": "0x0000000000000002", 306 "x18": "0xffff000000e6db80", 307 "x19": "0x0000000000000006", 308 "x20": "0xffff0000853a3670", 309 "x21": "0xffff0000009279c1", 310 "x22": "0x0000000000000804", 311 "x23": "0x0000000000000004", 312 "x24": "0xffff000082a93000", 313 "x25": "0xffffa0000053f080", 314 "x26": "0xffff000000e6391c", 315 "x27": "0xffff000000e63000", 316 "x28": "0x0000000000000004", 317 "fp": "0xffff0000853a35c0", 318 "sp": "0xffff0000853a35c0", 319 "pc": "0xffff000000811370", 320 }, 321 }, 322 4: { 323 "name": "(pid 11) idle/idle: cpu2", 324 # TODO: fix unwinding 325 "bt": [ 326 0xFFFF0000004EE99C, 327 ], 328 "regs": { 329 "x0": "0x0000000000000000", 330 "x1": "0x0000000000000000", 331 "x2": "0x0000000000000000", 332 "x3": "0x0000000000000000", 333 "x4": "0x0000000000000000", 334 "x5": "0x0000000000000000", 335 "x6": "0x0000000000000000", 336 "x7": "0x0000000000000000", 337 "x8": "0x00000000ffffffff", 338 "x9": "0x0000000000000001", 339 "x10": "0x0000000000002710", 340 "x11": "0x000000007ff7e333", 341 "x12": "0x000000007ff7ba9c", 342 "x13": "0x0000000000002af8", 343 "x14": "0x0000000000002897", 344 "x15": "0x0000000000002af8", 345 "x16": "0x00000000000028e1", 346 "x17": "0x00000000ffffffff", 347 "x18": "0xffff000000e6d380", 348 "x19": "0xffffa0000032e580", 349 "x20": "0xffff000000b82000", 350 "x21": "0xffff000040517100", 351 "x22": "0xffffa00000e04580", 352 "x23": "0xffff000000b84000", 353 "x24": "0x0000000000000001", 354 "x25": "0xffff000000dd1000", 355 "x26": "0xffff000082783898", 356 "x27": "0xffff000000e26000", 357 "x28": "0xffff000000b82000", 358 "fp": "0xffff0000827835f0", 359 "sp": "0xffff000082783570", 360 "pc": "0xffff0000004ee99c", 361 }, 362 }, 363 }, 364 ) 365 366 def test_i386_minidump(self): 367 self.do_test( 368 "kernel-i386.yaml", 369 "vmcore-i386-minidump.bz2", 370 numthread=13, 371 threads={ 372 0: { 373 "name": "(pid 806) sysctl (crashed)", 374 "bt": [ 375 0x010025C5, 376 0x01002410, 377 0x010027D5, 378 0x01002644, 379 0x01049A2F, 380 0x01011077, 381 0x01010780, 382 0x01010C7A, 383 0x01010AB2, 384 0x013E9E2D, 385 0xFFC033F9, 386 ], 387 "regs": { 388 "ebp": "0x151968e4", 389 "esp": "0x151968d8", 390 "esi": "0x0c77aa80", 391 "edi": "0x03f0dc80", 392 "eip": "0x010025c5", 393 }, 394 }, 395 1: { 396 "name": "(pid 11) idle/idle: cpu0 (on CPU 0)", 397 "bt": [ 398 0x013A91F6, 399 0x013A91C0, 400 0x013E8CE4, 401 0xFFC0319F, 402 0x00000028, 403 ], 404 "regs": { 405 "ebp": "0x03d979bc", 406 "esp": "0x03d979a0", 407 "esi": "0x000007f7", 408 "edi": "0x00000000", 409 "eip": "0x013a91f6", 410 }, 411 }, 412 12: { 413 "name": "(pid 11) idle/idle: cpu11", 414 "bt": [ 415 0x0103012C, 416 0x0100DE0E, 417 0x0100B770, 418 0x010323BE, 419 0x00FC50B6, 420 ], 421 "regs": { 422 "ebp": "0x03dc4af0", 423 "esp": "0x03dc4aa4", 424 "esi": "0x03f97e00", 425 "edi": "0x000003e8", 426 "eip": "0x0103012c", 427 }, 428 }, 429 }, 430 ) 431