From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id E1FEC3896C32 for ; Mon, 5 Dec 2022 10:10:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E1FEC3896C32 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1670235004; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wNEyVVjqwJPeJb+zqYx6QrXB+qUdqJvifNRitlOMROQ=; b=A2jVgC531gi3kAlvntsgU6Ee4SKYhpv9M9ktt5iCR6pgL5r9p3866t8J4++nO/lC8ity61 8fdEphZHRVA59KjED0Ma80RtNW2+5R/jYjfU83L3Iln6z4K2zri15Nea8xmgR97pk9aC4x fIis9dNANe9dVGEna7+0IVFv0aDBti8= Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-595-IiDEFwsyMFOlej5NUXkuGA-1; Mon, 05 Dec 2022 05:10:03 -0500 X-MC-Unique: IiDEFwsyMFOlej5NUXkuGA-1 Received: by mail-wr1-f69.google.com with SMTP id i25-20020adfaad9000000b002426945fa63so289880wrc.6 for ; Mon, 05 Dec 2022 02:10:03 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:references :in-reply-to:subject:to:from:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=6e+t6VM95hR7i24+EQjgWbUotQX3r3yPGhmJKh7zICA=; b=xd2VWj1w7fbhSOpZogjumIKwrORsjinDKiL5o6FB1m6/XIgONs9jFtJLg6yGCLDNEV kkkfd/jYs2QzRqlJHmMjt8C2Fl6arMr8vVOELOQaz36was3AChO4WRioZmNdwwLNveeh uYBaHsKhSId4WGTwBd9wJPVyfzSLrgO1RTwzSPUuW61TpXsoJ3krIzrg+0rhlJOwqDc/ m2YJ1igekO09/h0kmBplYyhs4Todb+hWX974A8BPIwt1DFmasWd0CUpYXKVyhtr1l23m 9OSFtqFTUPLpzwUcasf6RuAj99G39lObIbLOvJJLf/eqgNUih3Y6otsKvbna/qRetepY ZtdQ== X-Gm-Message-State: ANoB5pkmMKHLrygAnMIuNEkj0RDZjXvCna+4j2p7b1G3Hi6ftRAEipkV a/sJWmxDLhIso8kHaD7wyDZ0ApIIny9UdokT8nYwKI9X02D98FMX4tCHa2qTx0u9/Ik1FkN6C+d tBKVj382E6N6eywXo2kar9Q== X-Received: by 2002:adf:ffc9:0:b0:242:44ef:ad48 with SMTP id x9-20020adfffc9000000b0024244efad48mr8009784wrs.141.1670235001855; Mon, 05 Dec 2022 02:10:01 -0800 (PST) X-Google-Smtp-Source: AA0mqf5Do0F65X3GuhpVh1kzy3FRIoTza1AV5LOZdC2tg59V8i/DBdxtGCWXhCPMYrKwRRtZ1DG2vw== X-Received: by 2002:adf:ffc9:0:b0:242:44ef:ad48 with SMTP id x9-20020adfffc9000000b0024244efad48mr8009768wrs.141.1670235001404; Mon, 05 Dec 2022 02:10:01 -0800 (PST) Received: from localhost ([31.111.84.238]) by smtp.gmail.com with ESMTPSA id cl8-20020a5d5f08000000b00241fde8fe04sm14187609wrb.7.2022.12.05.02.10.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Dec 2022 02:10:01 -0800 (PST) From: Andrew Burgess To: Luis Machado , Simon Marchi , gdb-patches@sourceware.org Subject: Re: [PATCH] gdb: relax requirement for the map_failed stap probe to be present In-Reply-To: References: <9b1fe2f9-b4a9-17a8-1175-a1a776db1afc@simark.ca> <87y1s03a0a.fsf@redhat.com> <87sfi30zgy.fsf@redhat.com> <610ebe6b-64d0-d0c9-f9da-9e1445d53d73@arm.com> Date: Mon, 05 Dec 2022 10:09:59 +0000 Message-ID: <87mt8240w8.fsf@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-10.2 required=5.0 tests=BAYES_00,BODY_8BITS,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Luis Machado writes: > On 11/29/22 08:27, Luis Machado wrote: >> Hi Andrew, >>=20 >> This seems to have broken armhf on Ubuntu 22.04. >>=20 >> https://builder.sourceware.org/buildbot/#/builders/169/builds/1163 >>=20 > > I haven't investigated this. I only spotted it in the sourceware buildbot= page. But I'd guess it is something to do > with thumb mode detection early in the startup. > > Ubuntu has moved to not stripping ld.so for armhf because the probe mecha= nism is not capable of conveying the thumb mode > information, so gdb has to rely on symbols instead. If the changes have t= ouched this fragile area, it may have broken the > delicate balance. I somehow missed this last week. I'll take a look today. Sorry for the breakage. Andrew > > >> On 11/28/22 17:18, Andrew Burgess via Gdb-patches wrote: >>> >>> Thanks you all for your review feedback. >>> >>> I've now pushed this version of the patch (inc Pedro's suggested typo >>> fix). >>> >>> Thanks, >>> Andrew >>> >>> >>> Andrew Burgess writes: >>> >>>> Simon Marchi writes: >>>> >>>>> On 11/22/22 10:09, Andrew Burgess via Gdb-patches wrote: >>>>>> =C2=A0From glibc 2.35 and later, the "map_failed" stap probe is no l= onger >>>>>> included in glibc.=C2=A0 The removal of the probe looks like an acci= dent, >>>>>> but it was caused by a glibc commit which meant that the "map_failed= " >>>>>> probe could no longer be reached; the compiler than helpfully >>>>>> optimised out the probe. >>>>>> >>>>>> In GDB, in solib-svr4.c, we have a list of probes that we look for >>>>>> related to the shared library loading detection.=C2=A0 If any of the= se >>>>>> probes are missing then GDB will fall back to the non-probe based >>>>>> mechanism for detecting shared library loading.=C2=A0 The "map_faile= d" >>>>>> probe is include in the list of required probes. >>>>>> >>>>>> This means that on glibc 2.35 (or later) systems, GDB is going to >>>>>> always fall back to the non-probes based mechanism for detecting >>>>>> shared library loading. >>>>>> >>>>>> I raised a glibc bug to discuss this issue: >>>>>> >>>>>> =C2=A0=C2=A0 https://sourceware.org/bugzilla/show_bug.cgi?id=3D29818 >>>>>> >>>>>> But, whatever the ultimate decision from the glibc team, given there >>>>>> are version of glibc in the wild without the "map_failed" probe, we >>>>>> probably should update GDB to handle this situation. >>>>>> >>>>>> The "map_failed" probe is already a little strange, very early >>>>>> versions of glibc didn't include this probe, so, in some cases, if >>>>>> this probe is missing GDB is happy to ignore it.=C2=A0 In this commi= t I >>>>>> just expand this logic to make the "map_failed" probe fully optional= . >>>>>> >>>>>> With this commit in place, then, when using a glibc 2.35 or later >>>>>> system, GDB will once again use the stap probes for shared library >>>>>> detection. >>>>>> --- >>>>>> =C2=A0 gdb/solib-svr4.c | 13 +++++++++---- >>>>>> =C2=A0 1 file changed, 9 insertions(+), 4 deletions(-) >>>>>> >>>>>> diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c >>>>>> index 6acaf87960b..87cd06f251a 100644 >>>>>> --- a/gdb/solib-svr4.c >>>>>> +++ b/gdb/solib-svr4.c >>>>>> @@ -2205,10 +2205,15 @@ svr4_find_and_create_probe_breakpoints (svr4= _info *info, >>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 probes[i] =3D find_probes= _in_objfile (os->objfile, "rtld", name); >>>>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 /* The "map_failed" probe did not ex= ist in early >>>>>> -=C2=A0=C2=A0=C2=A0=C2=A0 versions of the probes code in which the p= robes' >>>>>> -=C2=A0=C2=A0=C2=A0=C2=A0 names were prefixed with "rtld_".=C2=A0 */ >>>>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (with_prefix && streq (name, "rtl= d_map_failed")) >>>>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 /* The "map_failed" probe did not ex= ist in early versions of the >>>>>> +=C2=A0=C2=A0=C2=A0=C2=A0 probes code in which the probes' names wer= e prefixed with >>>>>> +=C2=A0=C2=A0=C2=A0=C2=A0 "rtld_". >>>>>> + >>>>>> +=C2=A0=C2=A0=C2=A0=C2=A0 Additionally, the "map_failed" probe was a= ccidentally removed >>>>>> +=C2=A0=C2=A0=C2=A0=C2=A0 from glibc 2.35 and later, when changes in= glibc meant the probe >>>>>> +=C2=A0=C2=A0=C2=A0=C2=A0 could no longer be reached.=C2=A0 In this = case the probe name doesn't >>>>>> +=C2=A0=C2=A0=C2=A0=C2=A0 have the "rtld_" prefix.=C2=A0 */ >>>>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (streq (probe_info[i].name, "map_= failed")) >>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 continue; >>>>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 /* Ensure at least one pr= obe for the current name was found.=C2=A0 */ >>>>>> >>>>>> base-commit: 84f9fbe90e5429adb9dee68f04f44c92fa9e2345 >>>>>> --=20 >>>>>> 2.25.4 >>>>> >>>>> Hi, >>>>> >>>>> I looked at this separately, and this was one of the fixes I consider= ed. >>>>> >>>>> Another option was to make GDB not give up on the probes interface if >>>>> failing to look up a probe whose action is DO_NOTHING.=C2=A0 Probes w= ith that >>>>> action are not used by GDB for solib bookkeeping, but can be used to >>>>> stop on solib events, with "set stop-on-solib-events".=C2=A0 I was ju= st >>>>> worried if there was some cases where a probe would be missing, but t= he >>>>> corresponding event could be caught if using the original interface.= =C2=A0 In >>>>> that case, using the probes interface would be a regression.=C2=A0 Bu= t it's >>>>> probably not worth wondering about.=C2=A0 If that happens it's just a= bug >>>>> that needs to be fixed.=C2=A0 In the case we are looking at, if the >>>>> map_failed probe gets optimized out, then surely the corresponding ca= ll >>>>> to the r_brk function would also be optimized out. >>>> >>>> I also considered just ignoring any probe was (a) missing, and (b) had= a >>>> DO_NOTHING action.=C2=A0 The reason I didn't post this patch was becau= se, at >>>> the time, my thinking was: if we don't care about any probe with a >>>> DO_NOTHING action, why even look for those probes, why not just remove >>>> them from the list? >>>> >>>> I think you've (partially) convinced me that the user might be >>>> interested in seeing a stop at these probes even if GDB's action is >>>> DO_NOTHING. >>>> >>>> I say partially above because GDB doesn't really do anything to tell t= he >>>> user which probe we stopped at, e.g. was is "init_start", "map_start", >>>> "map_failed", etc.=C2=A0 The user might be able to figure it out from = the >>>> backtrace, but I still think it's not going to be trivial in all cases= , >>>> e.g. "map_start" and "map_failed" are both located in the same functio= n, >>>> so I think the user would need to lookup the probe address in the ELF, >>>> then compare that to the stop address.=C2=A0 Not impossible, but, I su= spect, >>>> the complexity is an indication that users are not doing this much. >>>> Thus, I suspect, in reality, nobody really cares about the DO_NOTHING >>>> probes. >>>> >>>> However, I think there is enough of a justification there for keeping >>>> the probes in the list, and just skipping any DO_NOTHING probes that >>>> don't exist. >>>> >>>> Below then, is an alternative patch.=C2=A0 I don't have a strong prefe= rence >>>> between this one, and the original[1], but I thought I'd post this for >>>> discussion.=C2=A0 If this is preferred then I can just merge this. >>>> >>>> [1] I'll also post an update to the original patch shortly that >>>> addresses Lancelot's feedback. >>>> >>>> Thanks, >>>> Andrew >>>> >>>> --- >>>> >>>> commit 11be1f25f446e68c23d0709cde46e32ff24b7eb9 >>>> Author: Andrew Burgess >>>> Date:=C2=A0=C2=A0 Tue Nov 22 12:45:56 2022 +0000 >>>> >>>> =C2=A0=C2=A0=C2=A0=C2=A0 gdb: relax requirement for the map_failed sta= p probe to be present >>>> =C2=A0=C2=A0=C2=A0=C2=A0 From glibc 2.35 and later, the "map_failed" s= tap probe is no longer >>>> =C2=A0=C2=A0=C2=A0=C2=A0 included in glibc.=C2=A0 The removal of the p= robe looks like an accident, >>>> =C2=A0=C2=A0=C2=A0=C2=A0 but it was caused by a glibc commit which mea= nt that the "map_failed" >>>> =C2=A0=C2=A0=C2=A0=C2=A0 probe could no longer be reached; the compile= r than helpfully >>>> =C2=A0=C2=A0=C2=A0=C2=A0 optimised out the probe. >>>> =C2=A0=C2=A0=C2=A0=C2=A0 In GDB, in solib-svr4.c, we have a list of pr= obes that we look for >>>> =C2=A0=C2=A0=C2=A0=C2=A0 related to the shared library loading detecti= on.=C2=A0 If any of these >>>> =C2=A0=C2=A0=C2=A0=C2=A0 probes are missing then GDB will fall back to= the non-probe based >>>> =C2=A0=C2=A0=C2=A0=C2=A0 mechanism for detecting shared library loadin= g.=C2=A0 The "map_failed" >>>> =C2=A0=C2=A0=C2=A0=C2=A0 probe is include in the list of required prob= es. >>>> =C2=A0=C2=A0=C2=A0=C2=A0 This means that on glibc 2.35 (or later) syst= ems, GDB is going to >>>> =C2=A0=C2=A0=C2=A0=C2=A0 always fall back to the non-probes based mech= anism for detecting >>>> =C2=A0=C2=A0=C2=A0=C2=A0 shared library loading. >>>> =C2=A0=C2=A0=C2=A0=C2=A0 I raised a glibc bug to discuss this issue: >>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 https://sourceware.org/bugzilla/s= how_bug.cgi?id=3D29818 >>>> =C2=A0=C2=A0=C2=A0=C2=A0 But, whatever the ultimate decision from the = glibc team, given there >>>> =C2=A0=C2=A0=C2=A0=C2=A0 are version of glibc in the wild without the = "map_failed" probe, we >>>> =C2=A0=C2=A0=C2=A0=C2=A0 probably should update GDB to handle this sit= uation. >>>> =C2=A0=C2=A0=C2=A0=C2=A0 The "map_failed" probe is already a little st= range, very early >>>> =C2=A0=C2=A0=C2=A0=C2=A0 versions of glibc didn't include this probe, = so, in some cases, if >>>> =C2=A0=C2=A0=C2=A0=C2=A0 this probe is missing GDB is happy to ignore = it.=C2=A0 This is fine, the >>>> =C2=A0=C2=A0=C2=A0=C2=A0 action associated with this probe inside GDB = is DO_NOTHING, this means >>>> =C2=A0=C2=A0=C2=A0=C2=A0 the probe isn't actually required in order fo= r GDB to correctly detect >>>> =C2=A0=C2=A0=C2=A0=C2=A0 the loading of shared libraries. >>>> =C2=A0=C2=A0=C2=A0=C2=A0 In this commit I propose changing the rules s= o that any probe whose >>>> =C2=A0=C2=A0=C2=A0=C2=A0 action is DO_NOTHING, is optional. >>>> =C2=A0=C2=A0=C2=A0=C2=A0 There is one possible downside to this change= , and that concerns 'set >>>> =C2=A0=C2=A0=C2=A0=C2=A0 stop-on-solib-events on'.=C2=A0 If a probe is= removed from glibc, but the >>>> =C2=A0=C2=A0=C2=A0=C2=A0 old style breakpoint based mechanism is still= in place within glibc >>>> =C2=A0=C2=A0=C2=A0=C2=A0 for that same event, then GDB will stop when = using the old style >>>> =C2=A0=C2=A0=C2=A0=C2=A0 non-probe based mechanism, but not when using= the probes based >>>> =C2=A0=C2=A0=C2=A0=C2=A0 mechanism. >>>> =C2=A0=C2=A0=C2=A0=C2=A0 For the map_failed case this is not a problem= , both the map_failed >>>> =C2=A0=C2=A0=C2=A0=C2=A0 probe, and the call to the old style breakpoi= nt location were >>>> =C2=A0=C2=A0=C2=A0=C2=A0 optimised out, and so neither event (probes b= ased, or breakpoint >>>> =C2=A0=C2=A0=C2=A0=C2=A0 based) will trigger.=C2=A0 This would only be= come an issue if glibc removed >>>> =C2=A0=C2=A0=C2=A0=C2=A0 a probe, but left the breakpoint in place (th= is would almost certainly >>>> =C2=A0=C2=A0=C2=A0=C2=A0 be a bug in glibc). >>>> =C2=A0=C2=A0=C2=A0=C2=A0 For now, I'm proposing that we just don't wor= ry about this.=C2=A0 Because >>>> =C2=A0=C2=A0=C2=A0=C2=A0 some probes have actions that are not DO_NOTH= ING, then we know the >>>> =C2=A0=C2=A0=C2=A0=C2=A0 user will always seem _some_ stops when a sha= red library is >>>> =C2=A0=C2=A0=C2=A0=C2=A0 loaded/unloaded, and (I'm guessing), in most = cases, that's all they >>>> =C2=A0=C2=A0=C2=A0=C2=A0 care about.=C2=A0 I figure when someone compl= ains then we can figure out >>>> =C2=A0=C2=A0=C2=A0=C2=A0 what the right solution is then. >>>> =C2=A0=C2=A0=C2=A0=C2=A0 With this commit in place, then, when using a= glibc 2.35 or later >>>> =C2=A0=C2=A0=C2=A0=C2=A0 system, GDB will once again use the stap prob= es for shared library >>>> =C2=A0=C2=A0=C2=A0=C2=A0 detection. >>>> >>>> diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c >>>> index 6acaf87960b..10e446af908 100644 >>>> --- a/gdb/solib-svr4.c >>>> +++ b/gdb/solib-svr4.c >>>> @@ -2205,15 +2205,34 @@ svr4_find_and_create_probe_breakpoints (svr4_i= nfo *info, >>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 probes[i] =3D find_probes_i= n_objfile (os->objfile, "rtld", name); >>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 /* The "map_failed" probe did not exis= t in early >>>> -=C2=A0=C2=A0=C2=A0=C2=A0 versions of the probes code in which the pro= bes' >>>> -=C2=A0=C2=A0=C2=A0=C2=A0 names were prefixed with "rtld_".=C2=A0 */ >>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (with_prefix && streq (name, "rtld_= map_failed")) >>>> -=C2=A0=C2=A0=C2=A0 continue; >>>> - >>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 /* Ensure at least one prob= e for the current name was found.=C2=A0 */ >>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (probes[i].empty ()) >>>> -=C2=A0=C2=A0=C2=A0 return false; >>>> +=C2=A0=C2=A0=C2=A0 { >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 /* The "map_failed" probe did not exis= t in early versions of the >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 probes code in which= the probes' names were prefixed with >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 "rtld_". >>>> + >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Additionally, the "m= ap_failed" probe was accidentally removed >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 from glibc 2.35 and = later, when changes in glibc meant the >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 probe could no longe= r be reached, and the compiler optimized >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 the probe away.=C2= =A0 In this case the probe name doesn't have the >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 "rtld_" prefix. >>>> + >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 To handle this, and = give GDB as much flexibility as possible, >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 we make the rule tha= t, if a probe isn't required for the >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 correct operation of= GDB (i.e. it's action is DO_NOTHING), >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 then we will still u= se the probes interface, even if that >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 probe is missing. >>>> + >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 The only (possible) = downside of this is that, if the user has >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 'set stop-on-solib-e= vents on' in effect, then they might get >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 fewer events using t= he probes interface than with the classic >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 non-probes interface= .=C2=A0 */ >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (prove_info[i].action =3D=3D DO_NOT= HING) >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 continue; >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 else >>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return false; >>>> +=C2=A0=C2=A0=C2=A0 } >>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 /* Ensure probe arguments c= an be evaluated.=C2=A0 */ >>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 for (probe *p : probes[i]) >>> >>=20