From c11964c5122646cb5c21b9e06ca9f42ded5b6f13 Mon Sep 17 00:00:00 2001 From: not-matthias Date: Mon, 1 Jun 2026 17:21:00 +0200 Subject: [PATCH 1/7] fix(mac): don't SIGKILL Apple toolchain binaries under `samply record` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit samply injects DYLD_INSERT_LIBRARIES + SAMPLY_BOOTSTRAP_SERVER_NAME into the whole descendant tree. Each descendant that loads samply-mac-preload runs a dyld initializer that sends its mach task-self port to samply so it can be profiled. For an Apple *platform binary* (CS_PLATFORM_BINARY) the task-self port is immovable. Transferring an immovable port to another process raises a fatal EXC_GUARD / GUARD_TYPE_MACH_PORT (ILLEGAL_MOVE) and the kernel SIGKILLs the process — inside the preload's mach_msg, before main(). This is not specific to dsymutil: the entire Xcode toolchain is affected (clang, ld, nm, strip, lipo, dsymutil, ... all confirmed killed by signal 9; clang++, swift(c), ar, ranlib, otool, dwarfdump, objdump, llvm-* share the same CS_PLATFORM_BINARY + non-restricted property). dsymutil was just the binary the original report hit (Go's linker invokes it). Any compile/link step run under `samply record` breaks as soon as a build tool invokes a toolchain binary by absolute path (the norm); going through the restricted /usr/bin shims hides it because they strip DYLD_*. Symptom: "running dsymutil failed: signal: killed". Confirmed via the crash report (EXC_GUARD "ILLEGAL_MOVE on mach port 515", port 515 == mach_task_self()) and by probing csops(2): the only distinguishing bit between a killed platform binary and a surviving locally-built binary is CS_PLATFORM_BINARY. Fix: in the preload, detect platform binaries via csops(getpid(), CS_OPS_STATUS) and skip the task handoff for them. samply cannot profile a platform binary through this mechanism anyway (its task port is protected), so nothing is lost; the process runs normally instead of being killed. Descendant profiling of all normal binaries is unchanged. Includes a regression test (samply/tests/dsymutil_sigkill.rs). Preload rebuilt for x86_64/arm64/arm64e. Co-Authored-By: Claude Opus 4.8 --- .../binaries/libsamply_mac_preload.dylib | Bin 150992 -> 151024 bytes .../libsamply_mac_preload_arm64.dylib | Bin 52928 -> 52880 bytes .../libsamply_mac_preload_arm64e.dylib | Bin 52688 -> 52720 bytes .../libsamply_mac_preload_x86_64.dylib | Bin 15512 -> 15480 bytes samply-mac-preload/src/lib.rs | 45 +++++++ .../resources/libsamply_mac_preload.dylib.gz | Bin 15951 -> 15209 bytes samply/tests/dsymutil_sigkill.rs | 122 ++++++++++++++++++ 7 files changed, 167 insertions(+) create mode 100644 samply/tests/dsymutil_sigkill.rs diff --git a/samply-mac-preload/binaries/libsamply_mac_preload.dylib b/samply-mac-preload/binaries/libsamply_mac_preload.dylib index 0c1fc39461f46599186d94514c48e42658b23c9d..a0e0f7168e09281fb2b193b3b94a50bde0e3a38a 100755 GIT binary patch delta 12521 zcmbVS3tUuH{y*o=pn$*(G9dDh5%B?*&imnu83h@1d?BW#HOx~;6y%Ynxr`#|h$wj7 zZdMkyTOqY8X(nzD$Fd|X!?s$jRIbE-LGojzO5nKI(ea^r-|lva!4xi-%2ON8sY`^rcfZlGwj6Z@v)}Cf=B^fkwkcL!<R`w8^6Fc1eB#iqP zB|-}5lYvYoYPJfYF;Je;BGd@eJb=g`lN3jDP&W<+9HIcljD|TeY)5RUyt<)Yy=t-g zf#yBC4;p!CA*>VK@4ydJ`Ve7(Q&$IesL6St6kUy)d=-2{ZX=1N60u^nijhUb#)6S5fU$S$$e zX1Dr6?7+Prl1Ca!=KI;q1ZS!wo!_Fqov-lQ?T_#z4UUS_KnYpv-fCpuN*G-A7Mz2` z-Mt{Je(N>RnkrfU0x*`knm2)~t!ss6%?A|&y(-mg;N$D~C%Cn8lLU z=k#OeB_`%nq+06MGzIR1ci&Q5+1fMWLDaX?*TE|68A;9G|J~hv{wH_@_JHysc!g15 z9#E2$EI9odlNR9?_D0hE=1L^~vA!LTP$FQf9li@`DIe8u~U}p>| z8viHu&Y{lJ>L(}u&0uTgufm< zvJtCDihE!(C|l}gW0r3`iPvo@Z@bj{|B(#YZtQq#DuC7Afx8}R(PkMhe@ekkGv#8oc4SIyD&OcVEJEl)VF_-E(7v<7(nW>TeMI~Z z{0TToiZ>_|O1{Po^sT-mDT4k;kWzi3b!as30rJTdWtmkIP+ zgmwt@SA@P#psx^mnm{MP8+v|{Ku_dpmB3gDGeV#j5;{Sk3ke-1&?^Yd@HCj@)4s;^ z1$Yd6A<-x*AthOENZ5`=_~e2ROfIbCTShWmOTTy~X+$WxhyP$8MjnDhuxgASW>g-A zumTQHQv||YaNO=I7~LXnC|FQsA(t~q`LrycWic&R(sDg5>uLE6Et_ch8ZG^_{E(KX zX!#FXcG2>>P>x5T^s+3YrJR=c&@y-@H<9J%yUq*$>u33buUA6 zmbc@2lWnQpS!k=UmoKrEyNf+G3X!-Wh<|!bl4n4%Utd<KyqQ2t5EKM@=e zcDVbI z)B&0B!M*l8`@xhHyp^+O;gsmpPziPLC!|acgIHN9$a=)r`>2iXQyd7PlxHhhm=I5yJ1*ZBuUyP~NZ4vgb@u zI#(>_ZcfFy-0B=0A8pWT9ZsiH;dVMTTBpX7&9zTuMo6__x>&eWBgpblUX>yIt#28=NZ6o5RF$id-gAs;jap}S7*z&`)9z4u3{K))9QXP(W{_0v(CT$sqtRecyNpJylRKP? z6F7MeBa=7{9*@Ro)N9=yk6Y>FMuFQ>jX~koDm@OD!J*W;9d<$giiL@lIz1Y#Qm0nw z!I)8@=c^1-l}Dpd8TA^iUaN39^ai0p%5*G~x{Y>&TBTI#oG#FE>$xqtc$n1g@#u{n zwcZ1>>@cYHq=BAWMH;A;dacK<(&*H7rvgSusuH<{)36-Ip;S5a4u#ue*D38rEg9lS zsnV`hf(e7xuGhGgMh&}b`omI(OQ%%3RBnUPqfn^z8o{I1>3E1#rE(G@2BSu;)Tp(z z>W>yYGD_{x*cD(&r&K9biUSQ#;mYB!79>S&^UCl7Hr87n+e9uJkdDw}h42i!Q#yWN z@SD*kD4^na_FM0y*hTat52f!2;e|j+A&quSqBVpU1p_57CJJVPffAnY36vb6we_?w z!t;R=%R2eM1>|}F$s!bJK@z)aT{D)k!>f-&sOMsJB3$hw*N={E^a>hssz`X=f%X`A ztREPX;Pc5R!t<4KnH;yVr`OwXJ!`D_p8_R`?9Q4g?AaP2SkiU)_F#$W9U)lK_8xo+ z;FN|V>^}!f-ubns;`T!_7Sg(7sdDSc~R==wjG6%IfLH;&nySGep?Wrh1t>m%$zU&`QDs5>2^ zLCuXoKLYd7A&P7Mn!V_YNqz|=-k-a*XOF>PLJ{2Ry?Oa?>)xI!YIuqrx+w_{WhZS) zjQ_}V5GGJ#fhv5`bZ{+QzRm3NO}6A^V8qYBst+<9Oc{)q7ceOQTbQx)iKc@^?Dv}z zC&3p`n;wFe@9OT(hp)42KW$Iu)J9ym(5)qlWcgS3{><*~L6+sHAq<<0nb5}E%}%OK zg;1ouc1k?D-ksm*#3#kjh%ADspEqv+l&pWV7oT9wb%i*UZLUiJw~y5&Mu6KXU}CKp z<->UERt!ALpzUN32nKNuTzm(!tF~l_IS_-1WcIx+^YMHzGnTb(&HXh~i^0@%c2xa6 z16_U0K+lqtsgPLc7EjDel zJS`p?-dKHT_YD}P4dG4ziurIM>uiG3hD4o(P_m_LyfPKTx)=VRAteMWHv8E;_`k22R+)3G!CM)$|i0yRrIklV4=}obZ1`a6EzRoQP@u6i&14Y&(|}1-HiS zKML=9J(|c~<1+9U+(%E~4e`f#eX_KZVQI~^r9T0hMCOQnh))bkfWZ*@L!ieA^yv5xfU(eu_ko^I>34y4QQ8l5 zIc77SPT6OFdI^pqmlG=(CK;|HUpzD7-U2ZaYXBC%5{g1J0E-&|QN%}}e)34f$N&iB zOA$_ik0hWVaewySog>q&KMT+?c!5D#QPQl4Wa+bbClk*6BO*nb6@||HJ!`+hj)&t*%NG;g5^dtJnUQf~GmhpK zPGtu41L*>gc4XthVxS9Hr8%A{E9A^(JX}-?HHWjAgo#kIlDAb{T;e2_yqK`=rOwhv z3A>T7JjMp5o-pMVWyKH^0QO1lkQt|PXU#aF>Z=qaLZ8avzIYohZ<2I`21MV9R&K<_ zzlb+7m$6?Q5fLGU96{zs0w)4NtHJy4mjp}#AIjGv6iIpV>j6n_u~7dNo&VFceU$~? zXp&x}0zbvuEH%&u=MG8j)WDmu0zU;hBOP9+aClMB0UAp4OB?jT`k(vYtPZE8&Up9ILegv@xd<*5p zq&@;pem@obgBXPAYNPxI(2n5muV@J44CRAcnA}UD8vcZ|m0J#Imn+S}(r7rBZ>yUq z!1HoJzo*HyK5FTG>SOK>&v*A}=IX;&_c61Yhv!^;79+)%{##6*&;5|iIJiGg#o2w) zxrLpb6VC0Q#>7kY8oN%T*Q!)1kK5>Sd3qsEjYp|8Y86HRqzaEy!B+{`(yAeC6b_}+ zu2vfrF4upB$6a>2L+5enTnd-bsdEt^nqc`0Gq6ei=Vj$jmrECnxOc?q?Hh~niS5_j z!@oMV>LW$yXFonQ%uvVqXW#<)CnJ&hswHR3Gl$*{tXh^HRUqA0HhlGjtDTdR=kD46 z&;dbf|AsdXT`77m^}YvJ{d41h&o)ovmdzHIM2-6T;;x#;oyz;+b5yE)!i!~0Xg@B_ zi_4-daIlbcgdUw1Zig3VMn}+t&qUwm2<|+H2U_Xz1*Z+4tnu8qwRlqOY$^{%7YN@I zUD!guqQU3_&-2lRVp%A6eJw7AKtWh_Vi-M);d1o%b;F_?O+p`V5#v)M8(kfPN3nJ5 z1|PVv4u@l=E0P^olkmU%^F$)|;Ceho1=tvQ`GNc42Ob!zn(~3ew?_#K?;tc9yx7d0 zT#tvbS&t`$1dafBr~foDcE#22XN5H>uGIYHiQ%8bt&aSyaRAS7Ff0edTy&0-|H?r}KMv_JlaTqrXh~5#0@xT}KiZ~F&ZUBH6KNqgA zfX0dLP`Kmgir8ZtMlf?l?4=EMf zaWC-yYZ#&xI{8guh}=We9TJ9U0Xi6l_#RLbar3pFh=8p5O{l+XP+}cwc#1o`5zk_F zF>KkUhmzNVrvHDAJXDZ={@chy1T-21*#wb?R493z?*^hT&TkNKe#eblIDbBm)9;S+ z!KQ%ov+uAK+q_)B`F`G(fb;cWi^uutzY*tG{T7_>?}hV^03Ae)y)iyupyRnHbb2~q z`V@>i!lRsrEfJ3Ju^fK7rQXiNczf0JbL>zpltpW!MbFA&RXFDZuZItvdne zF9D$c9RU3Z0Q%qe0R3W7Y01Jm6S8mL8WdlI9aU9d$g4iE0Mizv&Pj z(}VMypq-q@_~Y*m@;d-7!s&Vk$X^Mg4}$zkA>v_7B@vG~41xQSAyD4~_mx@fzqxe$ zm4Np@0Z87#hjMP=eK@!Uy#Lcs0q^e`dOP0ljq$;uo|#wl!tQX9?veM60|3hHse>;@ z58c@d@56u7aL^CndDNf)%pV<|a^MFJ55)s{se=hh|CSWaj(Ixqz?>a;|A>Zy0N2lt zp9~N4(=VZk!pExv_w??C!s5s26JDTadOr5 zBtUkT;WKqRvTKVVxUM6VAiIssFJg-9cx(s$piBy+g4d23$}3=+Nzzc3pkIYPq=Mztz$wa4ryd3tIlK>Q@=~=u%OslOK|C2K?(sc3D|TS?=AZK<_MB_K3TzLNm3jWNC4>#skH# zjQuzKOpR=JU9>UNnM9dj^$w3?33^TbwOSbmC^?nOp2|$_3;svmt*a+2OyaMsk2wb? z#t|oS@7z^M7CdBdp1JU0y)7?qZejKvUdk*8!ghS9?QVOIpBiJSeOZxnNzt;!TArfQ zc;_yN=L)9dqzSg-5EZVO(-EAVQLeh{Qcvi;)H<6|IjcOk)H&Bp z{&PoD4#o6`6}Ifj2HUU9yo~(fFXeVjXC{mNx1nZJOaEEBjW5r?_>FgC>9Cj=TDM9* zdU@gE_96LOYnEPG`Q$T4Z#HCoc*b3ao?*XU{P?%|$-@i#U9vPhf7ns^;+y|kBcNv4 z$yp1h>FrHjb1zmbIdneir7P2GBsIs^&l&&6m1isazaik^G29Q@;*@{x4U;v`IQ{fH zJN~qAnt$JzH?vzG+52qVhkL|=R{HhNzRbycZ}!#9lP`-t9Q(!_kFI>+X6p}+sV96{ KGgvv}?f(Z{*ao}+ delta 12545 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 OqIGq;di=T4b^i%F$MY%x diff --git a/samply-mac-preload/binaries/libsamply_mac_preload_arm64.dylib b/samply-mac-preload/binaries/libsamply_mac_preload_arm64.dylib index efa29040470dea9fe080f5d77e8b9442c654011a..c7fa6bce7fac1a05ae23de793a8cedadeb2d99e4 100755 GIT binary patch delta 4194 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 delta 4493 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 CZP5t; diff --git a/samply-mac-preload/binaries/libsamply_mac_preload_arm64e.dylib b/samply-mac-preload/binaries/libsamply_mac_preload_arm64e.dylib index 500af622c5aaf0714675a2fd6113e24ceb2fb4fb..fa8bb2051109f27767225b576785f7d8cdd19125 100755 GIT binary patch delta 3946 zcmZ`+3s{s@8vf4z&)_g17a48?!hn}R4H*RiGZ{e?yio(2-JX8NVRR;t8D>Vq&6ZK4 z+|A1I_-tuCt=iVYv~8}~KCrnmCX@uKG=bZH2PqccjHOTGIFqr>ARU?9>Q?)|E8%BlnjD5MEi zCD4UraqJzkc(JU@Fi)dHl4vv0#XglNX-}1nL`)Cz@pO>5$pLEPl8A;jakHZj7$g;y zta*Ueb1@`?UL=XFmpC;cSLhI*RML#gETSAuRG#}Qm&NItYqnRr92QIUD3i6(yqd`|Qv z1?(*a*bSM6_VYY=|3ece&sH4bVJ{j@rIyKSxn6>X$GOLNG};`!3zxdAv3uOp6&@r zPg{&uSjU`i0jrH#=lK|4I%@IYnId|mAA~G#oP%0@sPX=AK-SXul2B$qtOd~Q+aBY? zIvj@lnO-IHNZ{yqJoq|xB(^cHhh8MT+tBMg=7&H|Mxg4wet@InBSzr5KMr!;KmHVl z@X)xoZzzz{%fVi@sRKLiX=9r?&&T>cM42BGn~rnpDX3pE5~z$Fu6hqohUPmAtVQ|) z*REqSo=}gG!vNnSuVTq&E*-(7M`E{sRNA{R_=nkxa_BIS+B_5-dhoR=or;Vyd|KhZULHo|ET}Er& zt4?bxv~8yMs8Y*1f!_# z4pbg6liqMNibpbpc#P>d(|&bwoCTSFtZ&~m@N!DlBaP1sR2!z9(>D@$rVm?o9{0NT z2IDoz$M{AbUfMEPUfgnhZBa|0n0V2rhE}Pk$CcdVE7n&JbiY~~LopCu#SBbpmd%vUoCh!kA;R=R7uK~E3G z%_5)Bcj6vTI0wv}b-oBYzXUsfviSrSn&xXZao?rU*EH$e!L-)*G%u0HV3DKICdgw> zqkJ}YKPbmf_^2E&^eA7Y^cW|N!T7-+T^k7eWdA?pG0qh|2i|PXFchs$ZM__yMy80u zbzD&RuVgh%Nla?JGx7DA^su&{h8Uhzhx#@6F~MPIJ*c(JXg#d`Hc>Yi!6Yg`2W&QM zm9hLnkE%9mC+kqbigXMKUod~|?N#_R)go<0!ZS$@Ae}-QM4Cx}tU-DT=}n|_NEeVU zA>BZlL;vQVp)|Yf4%dqx`AH)>MJqviWd*C&A)4&ue% z5jTF~Gi#)^qGX6|nzrx;B9Dk4^TSe+sudR-aSSUw5WV zxl7I}Xm&qGeVuoa>6CQEkXbak>o$p3&O(hD)YO%;Ofat5yvAMZvgzF$jCVV7>PZ_70c7-WsRC|AfSu5ddSxa~|33^2}&esWqH8(jNYzVziY(`ko4nO^VGO<`e+ zUHL^dci&s#Si9Q3OrYCNYZmDj2!gH7ZE-s6E{h=D#&MTc7EbISLZ3U<0iE$ydIHnD z+qD39cyqwU{Ea5FRj@hC;{FO&BPwBKEStCRz8?5 zloaKQekMApRQGli-Pc{D^y@eX$N%}vq#-@C42Hv#%3BIvS$p*h&rZj*n3vj~j(q2p z`!<|SseHO=OFK~-KLk1efbD=^cZxS z-tzlaf`?hsgZ_e delta 4123 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 PTB+$?smz?*=UwxE>Ft`} diff --git a/samply-mac-preload/binaries/libsamply_mac_preload_x86_64.dylib b/samply-mac-preload/binaries/libsamply_mac_preload_x86_64.dylib index 646f38df80fab34198701e3d0ce71d1fa984375e..7397b9aa502fda2720d77559bf9b38cd58cadf5a 100755 GIT binary patch delta 4419 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 diff --git a/samply-mac-preload/src/lib.rs b/samply-mac-preload/src/lib.rs index 894dbe9f..b74385d9 100644 --- a/samply-mac-preload/src/lib.rs +++ b/samply-mac-preload/src/lib.rs @@ -35,7 +35,52 @@ static __SETUP_SAMPLY_CONNECTION: unsafe extern "C" fn() = { __load_samply_lib }; +/// Returns true if the current process is an Apple "platform binary" +/// (`CS_PLATFORM_BINARY`). Such processes are given an *immovable* task-self +/// mach port by the kernel: any attempt to transfer that port to another +/// process — which is exactly what samply's task handoff below does — raises a +/// fatal `EXC_GUARD` (`ILLEGAL_MOVE`) and the kernel SIGKILLs the process. +/// +/// This is how `samply record -- ` would otherwise kill `dsymutil` (and +/// other Apple toolchain binaries) that a build invokes: they inherit samply's +/// `DYLD_INSERT_LIBRARIES`, load this preload, and crash in the handoff. +/// +/// samply cannot profile platform binaries through this mechanism regardless +/// (their task port is protected), so detecting this case and skipping the +/// handoff loses nothing and keeps the process alive. +fn is_platform_binary() -> bool { + // `csops(getpid(), CS_OPS_STATUS, &flags, sizeof(flags))` reports the + // process's code-signing status flags. It works on the calling process + // without any privilege. CS_PLATFORM_BINARY == 0x04000000. + const CS_OPS_STATUS: u32 = 0; + const CS_PLATFORM_BINARY: u32 = 0x0400_0000; + extern "C" { + fn csops( + pid: libc::pid_t, + ops: u32, + useraddr: *mut libc::c_void, + usersize: libc::size_t, + ) -> libc::c_int; + } + let mut flags: u32 = 0; + let r = unsafe { + csops( + libc::getpid(), + CS_OPS_STATUS, + &mut flags as *mut u32 as *mut libc::c_void, + core::mem::size_of::() as libc::size_t, + ) + }; + r == 0 && (flags & CS_PLATFORM_BINARY) != 0 +} + fn set_up_samply_connection() -> Option<()> { + // Don't hand our task port to samply if we're a platform binary: the port + // is immovable and sending it would get us SIGKILLed. See + // `is_platform_binary`. + if is_platform_binary() { + return None; + } let (tx0, rx0) = channel().ok()?; // Safety: // - b"SAMPLY_BOOTSTRAP_SERVER_NAME\0" is a nul-terminated c string diff --git a/samply/resources/libsamply_mac_preload.dylib.gz b/samply/resources/libsamply_mac_preload.dylib.gz index e80855880f10a8bffbf575ec87c6b2c5703d164d..ec139f14cb8b35101132751d01ff8a10a58d5b2d 100644 GIT binary patch literal 15209 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 DN^|*x literal 15951 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 R9>0g6#Mo4}%_u@c{a;Y)uVerK diff --git a/samply/tests/dsymutil_sigkill.rs b/samply/tests/dsymutil_sigkill.rs new file mode 100644 index 00000000..c8a5b43a --- /dev/null +++ b/samply/tests/dsymutil_sigkill.rs @@ -0,0 +1,122 @@ +//! Regression test for: `samply record` SIGKILLs `dsymutil`. +//! +//! samply injects `DYLD_INSERT_LIBRARIES` (+ `SAMPLY_BOOTSTRAP_SERVER_NAME`) into +//! the *entire* descendant process tree it launches. Any descendant that loads +//! the preload hands its mach task port to samply and lets it "control us +//! completely" (see `samply-mac-preload`). For `dsymutil` this takeover ends in a +//! deterministic `SIGKILL`, which breaks builds run under `samply record` on +//! macOS (the linker invokes `dsymutil` and reports `running dsymutil failed: +//! signal: killed`). +//! +//! This test launches, under the built `samply` binary, a small locally-built +//! "spawner" that execs `dsymutil` on a Mach-O with DWARF, and asserts that +//! `dsymutil` is NOT killed (the desired behaviour). +//! +//! macOS-only (`cfg(target_os = "macos")`), so it compiles out elsewhere. It +//! needs Xcode's `dsymutil` and a working `cc`, both present on `macos-latest` +//! CI runners. Launch-mode profiling does not need `task_for_pid` entitlements +//! (the child volunteers its task port), so no `samply setup` is required. +//! +//! Run with: +//! cargo test -p samply --test dsymutil_sigkill -- --nocapture +#![cfg(target_os = "macos")] + +use std::path::Path; +use std::process::Command; + +fn cc(args: &[&str]) { + let status = Command::new("cc").args(args).status().expect("failed to run cc"); + assert!(status.success(), "cc {args:?} failed"); +} + +fn xcrun_dsymutil() -> String { + let out = Command::new("xcrun") + .args(["-f", "dsymutil"]) + .output() + .expect("failed to run xcrun"); + assert!(out.status.success(), "xcrun -f dsymutil failed"); + String::from_utf8(out.stdout).unwrap().trim().to_string() +} + +#[test] +fn dsymutil_is_not_killed_under_samply() { + let samply = env!("CARGO_BIN_EXE_samply"); + let dsymutil = xcrun_dsymutil(); + + let tmp = std::env::temp_dir().join(format!("samply_dsym_repro_{}", std::process::id())); + std::fs::create_dir_all(&tmp).unwrap(); + + // A Mach-O with enough DWARF that dsymutil does real work. + let src = tmp.join("big.cpp"); + { + use std::fmt::Write as _; + let mut s = String::from("#include \n"); + for i in 0..1200 { + writeln!(s, "template struct S{i} {{ int v[N%7+1]; int f(int x){{return x*{i}+N;}} }};").unwrap(); + writeln!(s, "int g{i}(int x){{ S{i}<{}> s; return s.f(x)+{i}; }}", i % 9 + 1).unwrap(); + } + s.push_str("int main(){int t=0;"); + for i in 0..1200 { + write!(s, "t+=g{i}(t);").unwrap(); + } + s.push_str("printf(\"%d\\n\",t);return 0;}\n"); + std::fs::write(&src, s).unwrap(); + } + let macho = tmp.join("bigcpp"); + cc(&["-g", "-O0", "-o", macho.to_str().unwrap(), src.to_str().unwrap()]); + + // A locally-built (non-restricted) parent that execs dsymutil and reports + // how the child died via its own exit code: 0 = clean, 1 = killed by signal. + let spawner_src = tmp.join("spawner.c"); + std::fs::write( + &spawner_src, + r#" +#include +#include +#include +#include +int main(int argc, char** argv){ + pid_t pid = fork(); + if(pid==0){ execl(argv[1],"dsymutil","-f",argv[2],"-o",argv[3],(char*)0); _exit(127); } + int st=0; waitpid(pid,&st,0); + if(WIFSIGNALED(st)){ fprintf(stderr,"dsymutil killed by signal %d\n", WTERMSIG(st)); return 1; } + fprintf(stderr,"dsymutil exited code %d\n", WEXITSTATUS(st)); return 0; +} +"#, + ) + .unwrap(); + let spawner = tmp.join("spawner"); + cc(&["-O0", "-o", spawner.to_str().unwrap(), spawner_src.to_str().unwrap()]); + + let out_dwarf = tmp.join("out.dwarf"); + let profile = tmp.join("profile.json.gz"); + + // samply record --save-only -o -- + let status = Command::new(samply) + .args(["record", "--save-only", "-o"]) + .arg(&profile) + .arg("--") + .arg(&spawner) + .arg(&dsymutil) + .arg(&macho) + .arg(&out_dwarf) + .status() + .expect("failed to run samply"); + + // The spawner exits 0 iff dsymutil completed normally. Under the bug it exits + // 1 because dsymutil was SIGKILLed by samply. + let killed = !status.success(); + let produced_output = Path::new(&out_dwarf).exists(); + + // Clean up only after we've inspected the results (out.dwarf lives in `tmp`). + let _ = std::fs::remove_dir_all(&tmp); + + assert!( + !killed, + "dsymutil was killed when run under `samply record` \ + (spawner exit = {:?}). samply must not SIGKILL build subprocesses it \ + injects into.", + status.code() + ); + assert!(produced_output, "dsymutil did not produce its output"); +} From 5dd5e68a37ebca640e97a544ce0fb39c88771fb8 Mon Sep 17 00:00:00 2001 From: not-matthias Date: Thu, 4 Jun 2026 13:05:17 +0200 Subject: [PATCH 2/7] build(mac-preload): make build.sh portable across Xcode setups Resolve SDKROOT via `xcrun --show-sdk-path` instead of a hardcoded Xcode.app path, and pin clang as the linker for the arm64e -Zbuild-std target so the build works outside the default toolchain. --- samply-mac-preload/build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samply-mac-preload/build.sh b/samply-mac-preload/build.sh index 2612e3d6..bf45529b 100755 --- a/samply-mac-preload/build.sh +++ b/samply-mac-preload/build.sh @@ -1,9 +1,9 @@ -export SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk +export SDKROOT="$(xcrun --show-sdk-path)" MACOSX_DEPLOYMENT_TARGET=10.12 cargo build --release --target=x86_64-apple-darwin mv target/x86_64-apple-darwin/release/libsamply_mac_preload.dylib binaries/libsamply_mac_preload_x86_64.dylib MACOSX_DEPLOYMENT_TARGET=11.0 cargo build --release --target=aarch64-apple-darwin mv target/aarch64-apple-darwin/release/libsamply_mac_preload.dylib binaries/libsamply_mac_preload_arm64.dylib -MACOSX_DEPLOYMENT_TARGET=11.0 RUSTC_BOOTSTRAP=1 cargo build --release --target=arm64e-apple-darwin -Zbuild-std=core +MACOSX_DEPLOYMENT_TARGET=11.0 RUSTC_BOOTSTRAP=1 CARGO_TARGET_ARM64E_APPLE_DARWIN_LINKER=clang cargo build --release --target=arm64e-apple-darwin -Zbuild-std=core mv target/arm64e-apple-darwin/release/libsamply_mac_preload.dylib binaries/libsamply_mac_preload_arm64e.dylib lipo binaries/libsamply_mac_preload_* -create -output binaries/libsamply_mac_preload.dylib gzip -cvf binaries/libsamply_mac_preload.dylib > ../samply/resources/libsamply_mac_preload.dylib.gz From 8afa002c526e41cf8938039674b706ea39dcd427 Mon Sep 17 00:00:00 2001 From: not-matthias Date: Thu, 4 Jun 2026 13:05:36 +0200 Subject: [PATCH 3/7] feat(mac-preload): add opt-in stderr logging via SAMPLY_PRELOAD_DEBUG Add a no-alloc stderr logger (heapless fixed buffer, no allocator in a preload) installed from the constructor only when SAMPLY_PRELOAD_DEBUG is set. Makes it possible to see whether the preload loaded and completed the samply handoff in a given process. --- samply-mac-preload/Cargo.lock | 41 ++++++++++++++++++++++++++++++- samply-mac-preload/Cargo.toml | 2 ++ samply-mac-preload/src/lib.rs | 4 +++ samply-mac-preload/src/logging.rs | 38 ++++++++++++++++++++++++++++ 4 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 samply-mac-preload/src/logging.rs diff --git a/samply-mac-preload/Cargo.lock b/samply-mac-preload/Cargo.lock index cfb93c6d..df63d53a 100644 --- a/samply-mac-preload/Cargo.lock +++ b/samply-mac-preload/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "autocfg" @@ -8,6 +8,31 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32", + "stable_deref_trait", +] + [[package]] name = "libc" version = "0.2.127" @@ -24,11 +49,19 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "log" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "113b30b4cd05f7c06868fdb2854f66a7b9fece9a48425351cd532e810d74024f" + [[package]] name = "samply-mac-preload" version = "0.1.0" dependencies = [ + "heapless", "libc", + "log", "spin", ] @@ -46,3 +79,9 @@ checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" dependencies = [ "lock_api", ] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" diff --git a/samply-mac-preload/Cargo.toml b/samply-mac-preload/Cargo.toml index 87595aa7..67f6d9ca 100644 --- a/samply-mac-preload/Cargo.toml +++ b/samply-mac-preload/Cargo.toml @@ -20,5 +20,7 @@ panic = 'abort' [dependencies] libc = { version = "0.2", default-features = false } +heapless = { version = "0.8", default-features = false } +log = { version = "0.4", default-features = false } spin = "0.9.8" diff --git a/samply-mac-preload/src/lib.rs b/samply-mac-preload/src/lib.rs index b74385d9..8842bbe4 100644 --- a/samply-mac-preload/src/lib.rs +++ b/samply-mac-preload/src/lib.rs @@ -5,6 +5,7 @@ use libc::{c_char, c_int, mode_t, FILE}; use core::ffi::CStr; +mod logging; mod mach_ipc; mod mach_sys; @@ -30,6 +31,7 @@ fn panic(_panic: &core::panic::PanicInfo<'_>) -> ! { #[cfg_attr(target_os = "macos", link_section = "__DATA,__mod_init_func")] static __SETUP_SAMPLY_CONNECTION: unsafe extern "C" fn() = { unsafe extern "C" fn __load_samply_lib() { + logging::init(); let _ = set_up_samply_connection(); } __load_samply_lib @@ -79,6 +81,7 @@ fn set_up_samply_connection() -> Option<()> { // is immovable and sending it would get us SIGKILLed. See // `is_platform_binary`. if is_platform_binary() { + log::debug!("samply_preload: skipping handoff (platform binary)"); return None; } let (tx0, rx0) = channel().ok()?; @@ -109,6 +112,7 @@ fn set_up_samply_connection() -> Option<()> { let mut recv_buf = [0; 256]; let result = rx0.recv(&mut recv_buf).ok()?; assert_eq!(b"Proceed", &result); + log::debug!("samply_preload: ready"); Some(()) } diff --git a/samply-mac-preload/src/logging.rs b/samply-mac-preload/src/logging.rs new file mode 100644 index 00000000..b64f9ab1 --- /dev/null +++ b/samply-mac-preload/src/logging.rs @@ -0,0 +1,38 @@ +use core::fmt::Write; +use libc::c_void; + +struct StderrLogger; + +impl log::Log for StderrLogger { + fn enabled(&self, _: &log::Metadata) -> bool { + true + } + + fn log(&self, record: &log::Record) { + // Format into a fixed stack buffer — there is no allocator in a preload. + // Messages are short; on overflow we just write the truncated prefix. + let mut buf = heapless::String::<512>::new(); + let _ = writeln!(buf, "{}", record.args()); + unsafe { + libc::write( + libc::STDERR_FILENO, + buf.as_ptr() as *const c_void, + buf.len(), + ); + } + } + + fn flush(&self) {} +} + +static LOGGER: StderrLogger = StderrLogger; + +/// Install the stderr logger iff `SAMPLY_PRELOAD_DEBUG` is set. Idempotent +/// (a second `set_logger` simply fails and is ignored). Call once, early, from +/// the preload constructor; if never called the max level stays `Off`. +pub(crate) fn init() { + let enabled = unsafe { !libc::getenv(c"SAMPLY_PRELOAD_DEBUG".as_ptr()).is_null() }; + if enabled && log::set_logger(&LOGGER).is_ok() { + log::set_max_level(log::LevelFilter::Trace); + } +} From 4d855a94be91f3f69f21ab6b174b3df2ae168016 Mon Sep 17 00:00:00 2001 From: not-matthias Date: Thu, 4 Jun 2026 13:05:57 +0200 Subject: [PATCH 4/7] feat(mac): expose preload path as SAMPLY_DYLD_INSERT_LIBRARIES SIP strips DYLD_* when execing a protected system binary, killing the preload for that subtree. Publish the preload path under a second, non-DYLD-prefixed alias that survives stripping, so a downstream choke point (e.g. CodSpeed's node.sh shim) can restore DYLD_INSERT_LIBRARIES and re-arm the preload. --- samply/src/mac/process_launcher.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/samply/src/mac/process_launcher.rs b/samply/src/mac/process_launcher.rs index 071b5dae..b9fd8fe7 100644 --- a/samply/src/mac/process_launcher.rs +++ b/samply/src/mac/process_launcher.rs @@ -162,6 +162,17 @@ impl TaskAccepter { add_env("DYLD_INSERT_LIBRARIES", preload_lib_path.as_os_str()); add_env("SAMPLY_BOOTSTRAP_SERVER_NAME", OsStr::new(&server_name)); + // Expose the preload path under a second, non-`DYLD_`-prefixed name. + // macOS SIP strips every `DYLD_*` variable when execing a protected + // system binary (`/usr/bin/env`, `/bin/sh`, …). + // + // This alias survives the stripping, so a script closer to the process + // under observation can re-enable `DYLD_INSERT_LIBRARIES`. + added_env.push(( + "SAMPLY_DYLD_INSERT_LIBRARIES".into(), + preload_lib_path.as_os_str().to_owned(), + )); + Ok(TaskAccepter { server, added_env, From 34be321e22be2035d97c6700cef787609f28dcf7 Mon Sep 17 00:00:00 2001 From: not-matthias Date: Thu, 4 Jun 2026 13:06:05 +0200 Subject: [PATCH 5/7] feat(mac-preload): warn when exec targets a SIP-protected binary MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Interpose execve/posix_spawn{,p} to detect when a process is about to exec a SIP-protected Apple system binary (directly or via a shebang interpreter). macOS strips DYLD_* on that exec, so the preload — and samply's visibility — silently dies for the whole subtree. We don't modify the exec; we only print a warning naming the binary, emitted as a ::warning:: annotation under GitHub Actions. Rebuild the bundled preload dylibs with the new code. --- .../binaries/libsamply_mac_preload.dylib | Bin 151024 -> 154528 bytes .../libsamply_mac_preload_arm64.dylib | Bin 52880 -> 56048 bytes .../libsamply_mac_preload_arm64e.dylib | Bin 52720 -> 56224 bytes .../libsamply_mac_preload_x86_64.dylib | Bin 15480 -> 27080 bytes samply-mac-preload/src/lib.rs | 10 ++ samply-mac-preload/src/sip_warn/detect.rs | 150 ++++++++++++++++++ samply-mac-preload/src/sip_warn/mod.rs | 78 +++++++++ .../resources/libsamply_mac_preload.dylib.gz | Bin 15209 -> 32291 bytes 8 files changed, 238 insertions(+) create mode 100644 samply-mac-preload/src/sip_warn/detect.rs create mode 100644 samply-mac-preload/src/sip_warn/mod.rs diff --git a/samply-mac-preload/binaries/libsamply_mac_preload.dylib b/samply-mac-preload/binaries/libsamply_mac_preload.dylib index a0e0f7168e09281fb2b193b3b94a50bde0e3a38a..fcbc14fd52c3cf421ce61b87434c573db9af128c 100755 GIT binary patch literal 154528 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 XbuVX}SXX)W72PMVmt>xub@u-N(6GmP delta 14074 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 DS;z$+ diff --git a/samply-mac-preload/binaries/libsamply_mac_preload_arm64.dylib b/samply-mac-preload/binaries/libsamply_mac_preload_arm64.dylib index c7fa6bce7fac1a05ae23de793a8cedadeb2d99e4..63d5d1ad988f5983be6a78647a59d01cf088f715 100755 GIT binary patch literal 56048 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 ar=Q=w{DtZ@vYL?8D>wJ<=zK-9?tcMIv|euj diff --git a/samply-mac-preload/binaries/libsamply_mac_preload_arm64e.dylib b/samply-mac-preload/binaries/libsamply_mac_preload_arm64e.dylib index fa8bb2051109f27767225b576785f7d8cdd19125..93c2255ebc9cf157a04c54b3e82a0b054bae0337 100755 GIT binary patch literal 56224 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 diff --git a/samply-mac-preload/binaries/libsamply_mac_preload_x86_64.dylib b/samply-mac-preload/binaries/libsamply_mac_preload_x86_64.dylib index 7397b9aa502fda2720d77559bf9b38cd58cadf5a..5c1daec54d641c6f2d1cf9afae61562346149479 100755 GIT binary patch literal 27080 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 literal 15480 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 diff --git a/samply-mac-preload/src/lib.rs b/samply-mac-preload/src/lib.rs index 8842bbe4..4deb2a94 100644 --- a/samply-mac-preload/src/lib.rs +++ b/samply-mac-preload/src/lib.rs @@ -8,6 +8,7 @@ use core::ffi::CStr; mod logging; mod mach_ipc; mod mach_sys; +mod sip_warn; use mach_ipc::{channel, mach_task_self, OsIpcChannel, OsIpcSender}; @@ -208,6 +209,15 @@ pub struct InterposeEntry { _old: *const (), } +impl InterposeEntry { + pub const fn new(new: *const (), old: *const ()) -> Self { + InterposeEntry { + _new: new, + _old: old, + } + } +} + #[used] #[allow(dead_code)] #[allow(non_upper_case_globals)] diff --git a/samply-mac-preload/src/sip_warn/detect.rs b/samply-mac-preload/src/sip_warn/detect.rs new file mode 100644 index 00000000..00661e46 --- /dev/null +++ b/samply-mac-preload/src/sip_warn/detect.rs @@ -0,0 +1,150 @@ +//! Decide whether an exec will drop into a SIP-protected (un-injectable) +//! process, and if so warn the user. We never modify the exec — we only observe +//! and print. +//! +//! The warning explains *why* the process can't be profiled (SIP strips the +//! `DYLD_*` variable samply relies on) and what the user can do about it, and is +//! emitted as a GitHub Actions `::warning::` annotation when running in CI so it +//! surfaces in the workflow log. + +use core::ffi::{c_void, CStr}; +use core::fmt::Write; +use libc::{c_char, c_int}; + +/// Called from the exec/posix_spawn interposers. If SIP is active and the +/// effective binary (the target itself, or — for a `#!` script — its shebang +/// interpreter) is SIP-protected, print a warning. Always returns; the caller +/// then performs the real, unmodified exec. +pub(super) unsafe fn check_and_warn(path: *const c_char) { + // If SIP is off, DYLD_* survives even for protected binaries, so the preload + // still loads and there's nothing to warn about. + if path.is_null() || !sip_enabled() { + return; + } + let path = CStr::from_ptr(path); + + if is_sip_protected(path) { + warn(path); + return; + } + + // Not a protected binary itself — but it may be a script whose shebang + // interpreter is one (e.g. `pnpm` -> `#!/usr/bin/env node`). The kernel + // execs that interpreter, and that's where DYLD_* gets stripped. + let mut buf = [0u8; libc::PATH_MAX as usize]; + if let Some(interp) = shebang_interpreter(path, &mut buf) { + if is_sip_protected(interp) { + warn(interp); + } + } +} + +/// Is System Integrity Protection enabled? +fn sip_enabled() -> bool { + // `csr_check(mask)` returns 0 when the active configuration *allows* the + // operation in `mask` (i.e. that protection is off); non-zero means the + // protection is active. If unrestricted filesystem access is not allowed, + // SIP is on. + const CSR_ALLOW_UNRESTRICTED_FS: u32 = 1 << 1; + extern "C" { + fn csr_check(mask: u32) -> c_int; + } + unsafe { csr_check(CSR_ALLOW_UNRESTRICTED_FS) != 0 } +} + +/// Is `path` a SIP-protected system binary? Such binaries carry the restricted +/// file flag, which is what makes the kernel strip `DYLD_*` on exec. +unsafe fn is_sip_protected(path: &CStr) -> bool { + const SF_RESTRICTED: u32 = 0x0008_0000; // from + let mut st: libc::stat = core::mem::zeroed(); + if libc::stat(path.as_ptr(), &mut st) != 0 { + return false; + } + st.st_flags & SF_RESTRICTED != 0 +} + +const SHEBANG_READ_SZ: usize = 256; + +/// If `path` is a regular file with a `#!` shebang, return the interpreter path +/// (written into `buf`). Only the interpreter is needed — we don't rebuild argv. +unsafe fn shebang_interpreter<'a>(path: &CStr, buf: &'a mut [u8]) -> Option<&'a CStr> { + // Only regular files can be scripts (also resolves relative paths via CWD). + let mut st: libc::stat = core::mem::zeroed(); + if libc::stat(path.as_ptr(), &mut st) != 0 || (st.st_mode & libc::S_IFMT) != libc::S_IFREG { + return None; + } + + // Read the first bytes looking for a shebang. `libc::open` here is NOT routed + // back through our own interpose hook: dyld does not re-interpose an image's + // references to symbols it itself interposes. + let mut read_buf = [0u8; SHEBANG_READ_SZ]; + let fd = libc::open(path.as_ptr(), libc::O_RDONLY); + if fd < 0 { + return None; + } + let nread = libc::read(fd, read_buf.as_mut_ptr() as *mut c_void, read_buf.len()); + libc::close(fd); + if nread < 2 || read_buf[0] != b'#' || read_buf[1] != b'!' { + return None; + } + + // Parse "#! [] \n" — we only want . + let line = match read_buf[..nread as usize].iter().position(|&b| b == b'\n') { + Some(pos) => &read_buf[..pos], + None => return None, // truncated / no newline within the window + }; + + let mut start = 2; + while start < line.len() && (line[start] == b' ' || line[start] == b'\t') { + start += 1; + } + if start >= line.len() { + return None; + } + let interp_end = line[start..] + .iter() + .position(|&b| b == b' ' || b == b'\t') + .map(|p| start + p) + .unwrap_or(line.len()); + + let interp = &line[start..interp_end]; + if interp.is_empty() || interp.len() >= buf.len() { + return None; + } + buf[..interp.len()].copy_from_slice(interp); + buf[interp.len()] = 0; + CStr::from_bytes_with_nul(&buf[..=interp.len()]).ok() +} + +/// Print the warning to stderr, as a GitHub Actions annotation when in CI. +unsafe fn warn(binary: &CStr) { + let bin = core::str::from_utf8(binary.to_bytes()).unwrap_or(""); + + let mut msg = heapless::String::<1024>::new(); + let prefix = if in_github_actions() { + "::warning title=CodSpeed cannot profile a system process::" + } else { + "[CodSpeed] warning: " + }; + + const SIP_DOCS_URL: &str = "https://codspeed.io/docs/instruments/walltime/macos-profiling"; + + let _ = writeln!( + msg, + "{prefix}CodSpeed could not profile the system process `{bin}`. System Integrity Protection (SIP) removes the DYLD_INSERT_LIBRARIES \ + environment variable that samply uses to attach to a process whenever a protected Apple system binary is executed, so this process and its children \ + are invisible to the profiler. See {SIP_DOCS_URL} for more information." + ); + + libc::write( + libc::STDERR_FILENO, + msg.as_ptr() as *const c_void, + msg.len(), + ); +} + +/// True iff `GITHUB_ACTIONS=true` in the environment. +unsafe fn in_github_actions() -> bool { + let v = libc::getenv(c"GITHUB_ACTIONS".as_ptr()); + !v.is_null() && CStr::from_ptr(v).to_bytes() == b"true" +} diff --git a/samply-mac-preload/src/sip_warn/mod.rs b/samply-mac-preload/src/sip_warn/mod.rs new file mode 100644 index 00000000..0ebbe50a --- /dev/null +++ b/samply-mac-preload/src/sip_warn/mod.rs @@ -0,0 +1,78 @@ +//! Interpose `execve` + `posix_spawn{,p}` to detect when a process is about to +//! exec a SIP-protected Apple system binary. +//! +//! macOS strips every `DYLD_*` environment variable when the kernel execs a +//! protected platform binary (`/usr/bin/env`, `/bin/sh`, system `python`, …). +//! Once stripped, this preload no longer loads into that process *or any of its +//! descendants*, so samply stops seeing the whole subtree. We can't keep the +//! preload alive across that boundary here — we only *observe* it and print a +//! warning naming the offending binary (see [`detect`]). The real exec then +//! proceeds completely unmodified. + +use libc::{c_char, c_int, pid_t, posix_spawn_file_actions_t, posix_spawnattr_t}; + +use crate::InterposeEntry; + +mod detect; + +unsafe extern "C" fn samply_sip_execve( + path: *const c_char, + argv: *const *const c_char, + envp: *const *const c_char, +) -> c_int { + detect::check_and_warn(path); + libc::execve(path, argv, envp) +} + +unsafe extern "C" fn samply_sip_posix_spawn( + pid: *mut pid_t, + path: *const c_char, + file_actions: *const posix_spawn_file_actions_t, + attrp: *const posix_spawnattr_t, + argv: *const *mut c_char, + envp: *const *mut c_char, +) -> c_int { + detect::check_and_warn(path); + libc::posix_spawn(pid, path, file_actions, attrp, argv, envp) +} + +unsafe extern "C" fn samply_sip_posix_spawnp( + pid: *mut pid_t, + file: *const c_char, + file_actions: *const posix_spawn_file_actions_t, + attrp: *const posix_spawnattr_t, + argv: *const *mut c_char, + envp: *const *mut c_char, +) -> c_int { + // `file` may be a bare name (e.g. "sh") that the real call resolves against + // `$PATH`. No need to resolve it here: libc's `posix_spawnp` funnels into + // `posix_spawn` with the resolved path, which hits our interposer above. + detect::check_and_warn(file); + libc::posix_spawnp(pid, file, file_actions, attrp, argv, envp) +} + +// We only interpose `execve` + `posix_spawn{,p}`: the other `exec*` wrappers +// (`execv`, `execvp`, `execl`, …) funnel through `execve` inside libc, and +// `posix_spawn{,p}` are the separate spawn syscalls used by libuv/Node and +// CPython. +#[used] +#[allow(non_upper_case_globals)] +#[link_section = "__DATA,__interpose"] +pub static mut _interpose_execve: InterposeEntry = + InterposeEntry::new(samply_sip_execve as *const (), libc::execve as *const ()); + +#[used] +#[allow(non_upper_case_globals)] +#[link_section = "__DATA,__interpose"] +pub static mut _interpose_posix_spawn: InterposeEntry = InterposeEntry::new( + samply_sip_posix_spawn as *const (), + libc::posix_spawn as *const (), +); + +#[used] +#[allow(non_upper_case_globals)] +#[link_section = "__DATA,__interpose"] +pub static mut _interpose_posix_spawnp: InterposeEntry = InterposeEntry::new( + samply_sip_posix_spawnp as *const (), + libc::posix_spawnp as *const (), +); diff --git a/samply/resources/libsamply_mac_preload.dylib.gz b/samply/resources/libsamply_mac_preload.dylib.gz index ec139f14cb8b35101132751d01ff8a10a58d5b2d..82a163de4f83b03f5aa7d0706009b788102a9298 100644 GIT binary patch literal 32291 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 literal 15209 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 DN^|*x From 5dd3f3211ad3a0536ba2deb278f372c1181637b8 Mon Sep 17 00:00:00 2001 From: Guillaume Lagrange Date: Mon, 8 Jun 2026 14:45:50 +0200 Subject: [PATCH 6/7] chore: run formatter --- samply/src/shared/jit_category_manager.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/samply/src/shared/jit_category_manager.rs b/samply/src/shared/jit_category_manager.rs index 47acf6db..560e4e14 100644 --- a/samply/src/shared/jit_category_manager.rs +++ b/samply/src/shared/jit_category_manager.rs @@ -231,9 +231,8 @@ impl JitCategoryManager { name: &str, profile: &mut Profile, ) -> (SubcategoryHandle, Option) { - static DISABLED: std::sync::LazyLock = std::sync::LazyLock::new(|| { - std::env::var("SAMPLY_DISABLE_JIT_CLASSIFICATION").is_ok() - }); + static DISABLED: std::sync::LazyLock = + std::sync::LazyLock::new(|| std::env::var("SAMPLY_DISABLE_JIT_CLASSIFICATION").is_ok()); if *DISABLED { return (self.generic_jit_category.get(profile).into(), None); } From 629e56811f2e8ba13a4e3c9bcb11e1bfcabe99b4 Mon Sep 17 00:00:00 2001 From: Guillaume Lagrange Date: Mon, 8 Jun 2026 14:46:21 +0200 Subject: [PATCH 7/7] feat: add stack read cache to better handle reads outside of sample range This is the strategy that HotSpot uses, and is mostly safe. If we need this, the call chain would have been truncated in the first place anyway. --- samply/src/linux_shared/converter.rs | 25 +++++++++++++++++++++---- samply/src/linux_shared/process.rs | 8 ++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/samply/src/linux_shared/converter.rs b/samply/src/linux_shared/converter.rs index ade6b740..2e671a66 100644 --- a/samply/src/linux_shared/converter.rs +++ b/samply/src/linux_shared/converter.rs @@ -273,6 +273,7 @@ where e, &process.unwinder, &mut self.cache, + &mut process.stack_read_cache, stack, self.fold_recursive_prefix, self.call_chain_return_addresses_are_preadjusted, @@ -402,6 +403,7 @@ where e, &process.unwinder, &mut self.cache, + &mut process.stack_read_cache, stack, self.fold_recursive_prefix, self.call_chain_return_addresses_are_preadjusted, @@ -514,6 +516,7 @@ where e, &process.unwinder, &mut self.cache, + &mut process.stack_read_cache, stack, self.fold_recursive_prefix, self.call_chain_return_addresses_are_preadjusted, @@ -565,6 +568,7 @@ where e, &process.unwinder, &mut self.cache, + &mut process.stack_read_cache, stack, self.fold_recursive_prefix, self.call_chain_return_addresses_are_preadjusted, @@ -620,6 +624,7 @@ where e: &SampleRecord, unwinder: &U, cache: &mut U::Cache, + stack_read_cache: &mut std::collections::HashMap, stack: &mut Vec, fold_recursive_prefix: bool, call_chain_return_addresses_are_preadjusted: bool, @@ -658,10 +663,22 @@ where let ustack_bytes = RawDataU64::from_raw_data::(user_stack); let (pc, sp, regs) = C::convert_regs(regs); let mut read_stack = |addr: u64| { - // ustack_bytes has the stack bytes starting from the current stack pointer. - let offset = addr.checked_sub(sp).ok_or(())?; - let index = usize::try_from(offset / 8).map_err(|_| ())?; - ustack_bytes.get(index).ok_or(()) + // Prefer this sample's freshly captured stack window. ustack_bytes + // has the stack bytes starting from the current stack pointer. + if let Some(value) = addr + .checked_sub(sp) + .and_then(|offset| usize::try_from(offset / 8).ok()) + .and_then(|index| ustack_bytes.get(index)) + { + // Remember it: the upper stack is stable across samples, so a + // later sample whose window doesn't reach this far can still + // satisfy the read. + stack_read_cache.insert(addr, value); + return Ok(value); + } + // The read is below sp or past the captured window. Fall back to + // a value seen in an earlier sample, if any. + stack_read_cache.get(&addr).copied().ok_or(()) }; // Unwind. diff --git a/samply/src/linux_shared/process.rs b/samply/src/linux_shared/process.rs index bdc1fc50..844628e3 100644 --- a/samply/src/linux_shared/process.rs +++ b/samply/src/linux_shared/process.rs @@ -1,3 +1,4 @@ +use std::collections::HashMap; use std::path::{Path, PathBuf}; use framehop::Unwinder; @@ -33,6 +34,12 @@ pub struct Process { pub jit_app_cache_mapping_ops: LibMappingOpQueue, pub jit_function_recycler: Option, marker_file_paths: Vec<(ThreadHandle, PathBuf, Vec)>, + /// Per-process cache of stack memory previously read during unwinding, + /// keyed by absolute stack address. The upper part of the stack (the frames + /// above the churning leaf) is stable across samples, so when an unwind + /// walks past the current sample's captured stack window we can satisfy the + /// read from a value seen in an earlier sample instead of truncating. + pub stack_read_cache: HashMap, pub prev_mm_filepages_size: i64, pub prev_mm_anonpages_size: i64, pub prev_mm_swapents_size: i64, @@ -80,6 +87,7 @@ where jit_app_cache_mapping_ops: LibMappingOpQueue::default(), jit_function_recycler, marker_file_paths: Vec::new(), + stack_read_cache: HashMap::new(), prev_mm_filepages_size: 0, prev_mm_anonpages_size: 0, prev_mm_swapents_size: 0,