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