1import gdbremote_testcase 2from lldbsuite.test.decorators import * 3from lldbsuite.test.lldbtest import * 4from lldbsuite.test import lldbutil 5 6import binascii 7import os 8 9class TestGdbSaveCore(gdbremote_testcase.GdbRemoteTestCaseBase): 10 11 def coredump_test(self, core_path=None, expect_path=None): 12 self.build() 13 self.set_inferior_startup_attach() 14 procs = self.prep_debug_monitor_and_inferior() 15 self.add_qSupported_packets() 16 ret = self.expect_gdbremote_sequence() 17 if "qSaveCore+" not in ret["qSupported_response"]: 18 self.skipTest("qSaveCore not supported by lldb-server") 19 self.reset_test_sequence() 20 21 packet = "$qSaveCore" 22 if core_path is not None: 23 packet += ";path-hint:{}".format( 24 binascii.b2a_hex(core_path.encode()).decode()) 25 26 self.test_sequence.add_log_lines([ 27 "read packet: {}#00".format(packet), 28 {"direction": "send", "regex": "[$]core-path:([0-9a-f]+)#.*", 29 "capture": {1: "path"}}, 30 ], True) 31 ret = self.expect_gdbremote_sequence() 32 out_path = binascii.a2b_hex(ret["path"].encode()).decode() 33 if expect_path is not None: 34 self.assertEqual(out_path, expect_path) 35 36 target = self.dbg.CreateTarget(None) 37 process = target.LoadCore(out_path) 38 self.assertTrue(process, PROCESS_IS_VALID) 39 self.assertEqual(process.GetProcessID(), procs["inferior"].pid) 40 41 @skipUnlessPlatform(oslist=["freebsd", "netbsd"]) 42 def test_netbsd_path(self): 43 core = lldbutil.append_to_process_working_directory(self, "core") 44 self.coredump_test(core, core) 45 46 @skipUnlessPlatform(oslist=["freebsd", "netbsd"]) 47 def test_netbsd_no_path(self): 48 self.coredump_test() 49 50 @skipUnlessPlatform(oslist=["freebsd", "netbsd"]) 51 def test_netbsd_bad_path(self): 52 self.coredump_test("/dev/null/cantwritehere") 53