263 lines · python
1import re2 3import gdbremote_testcase4from lldbsuite.test.decorators import *5from lldbsuite.test.lldbtest import *6from lldbsuite.test import lldbutil7 8 9class TestSignal(gdbremote_testcase.GdbRemoteTestCaseBase):10 def start_threads(self, num):11 procs = self.prep_debug_monitor_and_inferior(inferior_args=[str(num)])12 self.test_sequence.add_log_lines(13 [14 "read packet: $c#63",15 {"direction": "send", "regex": "[$]T.*;reason:signal.*"},16 ],17 True,18 )19 self.add_threadinfo_collection_packets()20 21 context = self.expect_gdbremote_sequence()22 self.assertIsNotNone(context)23 threads = self.parse_threadinfo_packets(context)24 self.assertIsNotNone(threads)25 self.assertEqual(len(threads), num + 1)26 27 self.reset_test_sequence()28 return threads29 30 SIGNAL_MATCH_RE = re.compile(r"received SIGUSR1 on thread id: ([0-9a-f]+)")31 32 def send_and_check_signal(self, vCont_data, threads):33 self.test_sequence.add_log_lines(34 [35 "read packet: $vCont;{0}#00".format(vCont_data),36 "send packet: $W00#00",37 ],38 True,39 )40 exp = self.expect_gdbremote_sequence()41 self.reset_test_sequence()42 tids = []43 for line in exp["O_content"].decode().splitlines():44 m = self.SIGNAL_MATCH_RE.match(line)45 if m is not None:46 tids.append(int(m.group(1), 16))47 self.assertEqual(sorted(tids), sorted(threads))48 49 def get_pid(self):50 self.add_process_info_collection_packets()51 context = self.expect_gdbremote_sequence()52 self.assertIsNotNone(context)53 procinfo = self.parse_process_info_response(context)54 return int(procinfo["pid"], 16)55 56 @skipIfWindows57 @skipIfDarwin58 @expectedFailureNetBSD59 @expectedFailureAll(60 oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"61 )62 @skipIfAsan # Times out under asan63 @skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot64 def test_signal_process_without_tid(self):65 self.build()66 self.set_inferior_startup_launch()67 68 threads = self.start_threads(1)69 self.send_and_check_signal(70 "C{0:x}".format(lldbutil.get_signal_number("SIGUSR1")), threads71 )72 73 @skipUnlessPlatform(["netbsd"])74 @expectedFailureNetBSD75 @skipIfAsan # Times out under asan76 @skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot77 def test_signal_one_thread(self):78 self.build()79 self.set_inferior_startup_launch()80 81 threads = self.start_threads(1)82 # try sending a signal to one of the two threads83 self.send_and_check_signal(84 "C{0:x}:{1:x};c".format(lldbutil.get_signal_number("SIGUSR1")), threads[:1]85 )86 87 @skipIfWindows88 @skipIfDarwin89 @expectedFailureNetBSD90 @expectedFailureAll(91 oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"92 )93 @skipIfAsan # Times out under asan94 @skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot95 def test_signal_all_threads(self):96 self.build()97 self.set_inferior_startup_launch()98 99 threads = self.start_threads(1)100 # try sending a signal to two threads (= the process)101 self.send_and_check_signal(102 "C{0:x}:{1:x};C{0:x}:{2:x}".format(103 lldbutil.get_signal_number("SIGUSR1"), *threads104 ),105 threads,106 )107 108 @skipIfWindows109 @expectedFailureNetBSD110 @expectedFailureAll(111 oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"112 )113 @add_test_categories(["llgs"])114 @skipIfAsan # Times out under asan115 @skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot116 def test_signal_process_by_pid(self):117 self.build()118 self.set_inferior_startup_launch()119 120 threads = self.start_threads(1)121 self.send_and_check_signal(122 "C{0:x}:p{1:x}".format(123 lldbutil.get_signal_number("SIGUSR1"), self.get_pid()124 ),125 threads,126 )127 128 @skipIfWindows129 @expectedFailureNetBSD130 @expectedFailureAll(131 oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"132 )133 @add_test_categories(["llgs"])134 @skipIfAsan # Times out under asan135 @skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot136 def test_signal_process_minus_one(self):137 self.build()138 self.set_inferior_startup_launch()139 140 threads = self.start_threads(1)141 self.send_and_check_signal(142 "C{0:x}:p-1".format(lldbutil.get_signal_number("SIGUSR1")), threads143 )144 145 @skipIfWindows146 @expectedFailureNetBSD147 @expectedFailureAll(148 oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"149 )150 @add_test_categories(["llgs"])151 @skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot152 def test_signal_minus_one(self):153 self.build()154 self.set_inferior_startup_launch()155 156 threads = self.start_threads(1)157 self.send_and_check_signal(158 "C{0:x}:-1".format(lldbutil.get_signal_number("SIGUSR1")), threads159 )160 161 @skipIfWindows162 @expectedFailureNetBSD163 @expectedFailureAll(164 oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"165 )166 @add_test_categories(["llgs"])167 @skipIfAsan # Times out under asan168 @skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot169 def test_signal_all_threads_by_pid(self):170 self.build()171 self.set_inferior_startup_launch()172 173 threads = self.start_threads(1)174 # try sending a signal to two threads (= the process)175 self.send_and_check_signal(176 "C{0:x}:p{1:x}.{2:x};C{0:x}:p{1:x}.{3:x}".format(177 lldbutil.get_signal_number("SIGUSR1"), self.get_pid(), *threads178 ),179 threads,180 )181 182 @skipIfWindows183 @expectedFailureNetBSD184 @expectedFailureAll(185 oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"186 )187 @add_test_categories(["llgs"])188 @skipIfAsan # Times out under asan189 @skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot190 def test_signal_minus_one_by_pid(self):191 self.build()192 self.set_inferior_startup_launch()193 194 threads = self.start_threads(1)195 self.send_and_check_signal(196 "C{0:x}:p{1:x}.-1".format(197 lldbutil.get_signal_number("SIGUSR1"), self.get_pid()198 ),199 threads,200 )201 202 @skipIfWindows203 @expectedFailureNetBSD204 @expectedFailureAll(205 oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"206 )207 @add_test_categories(["llgs"])208 @skipIfAsan # Times out under asan209 @skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot210 def test_signal_minus_one_by_minus_one(self):211 self.build()212 self.set_inferior_startup_launch()213 214 threads = self.start_threads(1)215 self.send_and_check_signal(216 "C{0:x}:p-1.-1".format(lldbutil.get_signal_number("SIGUSR1")), threads217 )218 219 @skipUnlessPlatform(["netbsd"])220 @skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot221 def test_signal_two_of_three_threads(self):222 self.build()223 self.set_inferior_startup_launch()224 225 threads = self.start_threads(2)226 # try sending a signal to 2 out of 3 threads227 self.test_sequence.add_log_lines(228 [229 "read packet: $vCont;C{0:x}:{1:x};C{0:x}:{2:x};c#00".format(230 lldbutil.get_signal_number("SIGUSR1"), threads[1], threads[2]231 ),232 {"direction": "send", "regex": r"^\$E1e#db$"},233 ],234 True,235 )236 237 context = self.expect_gdbremote_sequence()238 self.assertIsNotNone(context)239 240 @skipUnlessPlatform(["netbsd"])241 @skipIf(oslist=["linux"], archs=["arm$", "aarch64"]) # Randomly fails on buildbot242 def test_signal_two_signals(self):243 self.build()244 self.set_inferior_startup_launch()245 246 threads = self.start_threads(1)247 # try sending two different signals to two threads248 self.test_sequence.add_log_lines(249 [250 "read packet: $vCont;C{0:x}:{1:x};C{2:x}:{3:x}#00".format(251 lldbutil.get_signal_number("SIGUSR1"),252 threads[0],253 lldbutil.get_signal_number("SIGUSR2"),254 threads[1],255 ),256 {"direction": "send", "regex": r"^\$E1e#db$"},257 ],258 True,259 )260 261 context = self.expect_gdbremote_sequence()262 self.assertIsNotNone(context)263