ÿØÿà JFIF    ÿÛ „ !.%+&8&+/1555$;@;4?.451 4,$,44444444444414444444444444444444444444444444444444ÿÀ  á á" ÿÄ     ÿÄ ?    !1AQaq"2‘¡±ÁðBRbrÑá#‚’¢²3S CñÿÄ   ÿÄ !    !1QAa‘2ÿÚ   ? 5˜Z¯V¦cø)›t/? z¨±>Õ5€¶‹Á¤·¼z¼Ü¬+ñ®v¤¨_ˆR­BFn©—˜ý®ç̝P8gýt·ÉSTŦˆìät?þé¼íìN/Þa)ì–í6ô… Ï¿øÃj´¿KÇü]ÿ ªô¹-eKànëÕHTx}ýSÜ›ÿ ”7Ø×&µ<¦  ¥ÑO¶[Ù¯ä¨ÞÃÿ PZ-¬;#õ|•oaÿ ©CìÞz3˜öː/¤­ñTûIØ}š^ mÓ%ªxˆ¥ÉŸu=Z+ISe¿45™¼u;ú&WØ÷€æßQ™®{|íx*TC“#ZŠìZ§²‹ 6pv…³¿¡äª*áZÐ%ÒOáˆo"x«OHk w±æ+¬V(kMúŸ5Vö«$ ÁrÏbàb57/luR ¸ÑÛj Òµì`Мq­û žICÀÊ•©4€Âcà¨Ï€O´<èÐ:›ù(Ë^L8þ‘ÍÌ#¸Ð_Ì©ÙK(Öz 4¬û+¸;ü’V’84‘¬ÃŽ:[â‡ÔÌáõp¢~§ªlæ£ö{®G>J¼"°‡7¯ÆÉèßû ‹É‹§ÁòÃýâßî ^ƾÙõ‹×óH#«LP½ïX=xÑÍ$|W?•~• îëÔ©ª‹ {ÝT…Kÿ ”hûâá)J*ö˜–ÔU;iÇ€/ ÆþjóZ\ýwØ=Ìm ºèËL9 ýèÆð/¨’¥öo=nË.%Îì ŽÕ¯È|{Oj²ƒE6e/ßdÄõ²Ìâ1O®ò×TsəԸhOMýíMˆ¿¼H˜l²,7Â¥#MF/Úf°Ö½± ¸–dr‹NýÊ íjqx{œÉ ä-È ¦ øÄër¨q°ð †nцýÑÄÆ’mä…n<0È™;ÁÝá¯ÁZƒ7FÀmì­ É&9ˆîéi¶ùN§Y• ÃZãAâ?•‡©‰ , ó¾IŸŠc1 4â&y­&pŠ­6;M À 0¹qç»p.á …ŸÅáK@%6·y6ƒ‰3?”úºŽ‰éX5ªPT §µ!=Mž«Ú½‹ÅgÂSâÉaþÓoö–¯ÁÔìR>5éÿ üs¶ÆUcÌ kÇR ]ÿ ù¬¼«VŽ;Â|‡~¢¦”ÏŰæ {L™Õ°Óv¹ò¸írޡעCÃ!íVÕ {¶»sŒNPg/ "uÕbkm²“$ďå¿é¹§°½æz¯6 †s¿!s–wÚÝ“™Œ °.ûj>·+™Òa…©Œ&rÝÎtÛë긪Ît’LAVp%c Úý[ÄzJ¾ÇàXXç@˜ó<êL]·T˜¾¥1Ó©V‡g´æ½¦Ý@¹óø!_@´ÞâSÁ —S3™•& ]@JHÚý©ZŽ €×æÔr»Áf!‡yÞ4Mv*èÓã_{‘åóUuљØ«Oïé*®EvÑ Œ÷‡U \"㪒ÍK+À 4“M¡ï:0¥5í!'<@î´”>Ç»&Z–ïCCV˜Ì5Šo&îhè.žû |ÓK©h$s6KìŒëã)¹hI¦GïOåóI;ììü#É$Š0…Ææ¥TØ.5­¾gn´ “ÂÖ\:hœ89G)J@„}œ:’Ò{/Š"¦_Æ×7Æ3VÇŠÊa]ÚŒÙ€Ä–=®uÁßâACZƒ§§£ Qnâ:«,×{tyø¬iÛcœÜÄ€H½ÄÍCk´÷šß .W'b¤Íåh]÷€=,Žv×cÚEÚHXJX¶îo¨FÒtèöŸ>ªª6[J®Fµ£sGÁeqõfe\íjÒÐïÄÐGˆe1Ø‹.Ø”‘Ëuø Y­ˆÜ ŽG|zùªüMpDnQWÄ”%JŠ™)â*p@Örš«ÕT2Ð%ˆG#ª„ ·¤!°ŸOTÂT¸aÚ%4&h™LµšØüÐ.F¿²ÐÞ_Ç‚¾ÅÃaÜ÷09Æ q€öy˜v‡85õN÷]¬äѼóS{°_MެúÔ#°Ç¸0åÞè2ëôPcvÆw9®ií1Ä8F™˜à‰´+‰Ik1òÝ7“Ñ×ÒsÝ\x‚h`ÞÑ`ó"|µEcý£n˜h`}GÞ !±ù²Ápü²ß6 0ïi󜵩SÈÇ7˜-ÕURO˜¦´f$ªž-Í6(œ}<„ éc øs]ŽŽ„*—¾ ìdŽ„)méª\¿êÎIg¾ØÞ~I#C/¼¼´EÁÈŽi8“©õådô·>euä ƒ'Ê×लR1ÉJE1ÐAát`t;ÇР%Ý<‡¥„ÍÆ`×Oyó)õiI€ñQaŸ4Ûù\áàaÃÔ¹HÃu¹*k€¦<„e S‡&õÏ B!ŽhüÞ`yj}mªf×\¿ Ç~æ­9‡û\՞Ǖg²1Žû5V7 !àöšm° c`ܬøÇìµÒ'P"?…´Ö,"§^•õލsÔ)6˜sæéÍR¼ ò|Sl”‹7 nPW Gòú÷½§O¯‡„l¡kSÞŒr½PÊ@æ¢pŽ-mÿ #Ÿ˜Àº¶Áä¦;ïÔæ$1££`“Õ>„—·ž)ßð³ñ#Ï Ô$¶œ‰ÊE‹À;÷º ¯«P:Ñ”8–IÊtpÞ3ª“>ê“þës4ò2OÏÕ­±zô†Õ§‰.÷ä¸;¿˜“'œ›žª}«Œ{ª±Ì 9ÔóÞÕ‡0 $íWV3Üì¬ —@kÝ4@¿r¼±½¬™›?øØæ´'Áé®CË3-g$˜ö‡×auÚi´Žp/êÛ æF›Ú2v‹ã¿¿,nB1̨ƃqÞa5͝@&Æû“él÷ \C²½UÍc ¯k×¢U ÖéQå™—-r wô ÞÏ<Ò=&=ÿ Ôê Òêˈt,i—;LîÜ á¸*ÚÃ1$êL•LÍ <É)ýÐà’ ;F™{ƒ™˜€&'}‚ãÄK`¡ÞT@I;®žZóè‚s’7®°›+§O­Åq©é»²9<Ô J ¼9O’HL»Ùïì¸rk¼Ž_ý‘TŸu[²ßÚŒ·ü÷B%¯E ŸÔX5êO´ Ç•€’I0 ÉJX` ñ¹õ%;µŸD‘«´€àwÒ™U ûئžÖö\×®×´8 ½‡ºÐÆÓ§?Àkmœ=;d5*@-ì0F Rªýš[Ü6âö̃ڸr*KA9· u*µæ£?U¸Âêí†8@¦X4 e-ò„0s{ HâUpU?¼mñRa°®a%Ð'tÉ×’\¾ÊÉ]t›h>·(Ë@R¼¡Ãt h}’O÷au<+nT…Ö…MӐ??Óe95 q>í/;&JSû °¯ÊéÞ øƒ*Ã2½Ài&:nôUl=¾¿5eˆ3”ñc|Ú2V”>„»&eE;«ÚäC p¢Û úy 9š[ŒÌx¼擼A&DåÒ¯ˆ¤ÀÌ;"˜ ÏQä¸åhÊ}Ûq«Û0WžÒ|»€ø®öCm5•\ÇÀ§Pe3£]0ÃàLDÉ‰1øªxjgwT‚÷¿LΨK‹›ùs—xˆÜ±µ kæ¸f‰‰ÜGk/LÛØ6d9ò¶ùA{ƒA3š/¬D¬khÓk‰`˜"㯒r¿±Óã jx‡°e}<Ñø\3y:'À•/h½Í€Ç4~g ?Û(¼]v‘ªlKÎâ~?O‚W%{Ì:“'©úNq¾›úo(X’¥¯ˆ nFê{Ç€ü?º'ë ø‹ì Þ09ŒÌç9Æ —ËC`j@ÓÄ(+a‹un¸#ÂꟋ{K`‘ÑÍÍ'à´»/Û,KW;Þ4²þð ï Nm|~fGÏ(…³Ã)«1ö­Õ ¥‡¨©ƒÃ™ü-s=à=U66Ï«Ýc蓦W¹íž®›nÔ%êÇìŒ<#Ü×84ån®Ð ÒåOC` ñânÑs‡¢ç 1õ%Îhì½Ã½® e:ݼUZo™`  ÅZŸŒÊ«ê1ÏÄo$q¹Þ€©ˆhÐÉä¯ñ[!…Ú˜àJ:x2$Íß&PåT£6ç— ‡Í*4Ýšçjÿ ‰É nófÐ ó(L5C•åÆ\rMÒ@ò }y-W}™üýVù—ú¢=Ù”c®‘< M ž ´Phr ¦©TD ‘ù.$´÷O‡‘V2Æò.=IUŒ=ž‡â¬i™aþÓåÙ?òUø'ØÖ•.~* šTŒ!•-×áºTâ®ä#õü'´ eýlYÅÓeÕKÂrT"CÚ@u!Óxƒ{š3€}1¿(r}%«nËamjÑ%ÑNEò v ˜à  σöK³,*º.àzù¨™Ó ÚçâU¦*¿ 9{%Ö¹ njûdaXöb) kÛÆ±ûÓ\°M7ˆÂ=û›ç¿Ã‚­V»Cg–8ÙêE- j)k$º`Ã-ùEýeBÆÇ]c¡°ñty&Òd0nõ'¡W+ƒ*|–øµFa\GQªEAÔp5\Ǽ·¼Ç8·õ -â§Ú[ ‡ uZeÖ 3}×d'+¹:ð+K†Û®s!Ï$úe€<Û”x)1»a­¡LC]¸µík…ÚàA»AYº{†ªS[¦5HÒ7ù --,ísòDØ€èk ÞÀîÜ ò@â( ËNˆë›4ô½•/¦o‡€Û7 ê•ÆêòðÜy'Án½µ á˜ݦ ndeo…[ì¶Ê,¥R³Ä=À±—–ß;£™´ñSâ*g§”ïaið‘Jå~™ÓÞ ß³Õ¢»8x埒²52>AÊb&-÷\7´éÄù€T˜,w;3{ï˜k…à¹ÄqÀ«œ{€\ ˆ¾[´¨јr &Úé„Ívˆ±8†¿]|¬ņ4I×pÞS1ÈÖz‰#Ìv‡G!YNògñ:màTz¢Ý1ô©^O=~ë|5Bã™ç•¼µõ•bÆ@úÕS¬ÈŒ#¬zünrŸ û” Z²•èðV"ÁHÚý©wÝ €7¼Ìu1hÑa3Éä û f$o¿É ™Ú›ÝçnpÒ3äÌ3†Í§,Äï]$‰/pê †«À¼¸e9­Æê_C]žƒ·ý·frÁN«, E=›Çq -‰öŒ:aÏ¿±í&£Í:-} 84‘ÿ eƒQÑeëSsuiA ³g㟥ú£?ÿ ʼn*”“÷aühe:ÊWa@ÒÞk±eØ] F Ô—r.åä˜ @ö¥ªZoÐýYL·¥S²G/‡ñ <~*ZÆ´è>JlòàÛÆ½ÿ 窘ìGN¢:I®KšJp/`íIÁÀõ#Ä-€ö­šµŒoF4|ÆQØÆ@Ì|£Ô…¢À{9˜è½Üó›€ôYÒÎYsið;ís¤€à²ˆ‚4qÉVŒI$ ‰"° æµ8cXGjœˏ¡Aâý•ËÜ¢ûï e·çLx']á"oÅÎê3¯Ç—¹”ó0nå‚âg{Œñ> S´˜îè°g238‚ãköÝfÚd´6Ò€;ò÷±¢™¼›º ¢Æ'¥Ðx'e¬ç ]bÈÆV¢ó‹kýBO ðÊâ$Ÿ!×T 3Mýמ žìٍàÌü‘8÷€àæØ8æ©6‰©L´«…oãpð„~Çk‰!ñ;‹”ÛžÍ àž±z Ÿôû øŸÝužÏ;ÿ #|u6™Þ¬ÚˆÐõA4¶â|ôl|Ê2ŽÇ¤ÝÅÇY.<#Aí.k§hóF‚”Y; M½Ö4hŸ4&›­¿tès´%FìL¥£Ãk‰ÇT¤haÁ¤ÚxfÉ`ÑìË›>i 3t‚:,–+^÷´–{Û–Nxi"x‘Ûg î¨>¥Õ܁ùZH,2Û“:8xÊ¢Çí9.É-Ìâã-=çjwµS˜dütžçwýGòú®®ûº_ˆýx$–¡ãøO EÚÛÏ÷R„×w+3£Á£öUMyR²¹âŒ°š›¸Ñãò9§Ó_Dl+Ùßc›úšGÅÌc†Ž!Ko=¶.‘Îÿ c²(2®V mª.ÿ ¹B›¹å ù„öŸSV>™ü¯$y:G¢Z×àøúdî¹û­·ýÇ´:•c LÍõi_‹ö+ÎæGÊè>OŠ•äž´§Þ{X}¨1ÚTc›»Qþ•êô°t¿OP?eæ~É{5]•ÙR£r5†nZ\ã@ &îJõ ¾àC°þV>fé¥/ü5ñÊIº_é5 ;e­h<@ Ä&æÃëE%;X,ÒãÆÞ`Oò¦kŸm#˜!ÀyÄ¢| óLšò¥Ä` ¶R=|ÈCâh5ò3DˆïF†ðÒ#ÅìÛœ?¸yhBãœí ZxßÎÄhºRK„`Þödvײ™ÀÈÑÒgŒuY w³%†ƒÓzõ ÖÏp‚dH®¦A´ù§»ÓÇMæ~)ˆð‡û:ù&Ä •vGD´À n ݇¼Ö8Fö óáà£~Ë¥x`oK|Ä?fxiØü%pìR>éò+Û±éÎ>núlFŤ'tq8LZÏvÃ?„¡ß±È⽆¯³íü@x|PöUäèØã¡ð‚ŒAìÏ"vÍwóŸÍ{ ý0.z È•Ö{,N¡£¡ŸKÕÙž>Ýœþ ÍÀ°<×EA!Å‚D™IúOÍ¡>ôG}Â` ÍßkÜL™Ž Þð™ {IøF²¹òQ3&!ÃÂÞz.d&Ï-sH¸,Ôõ˜ŽP€ 77ˆÝ¼ÊëÜw =cÕ Ú,ØÐ5ÎYÐ)ì´öœgŒ[¤ßv㙑8心>h]§µháYš£²ºÑ.{Ï7Sð•?´~×SÃKýJÛ˜ ™Íäiúu<µX¶1õ^kâçIÑ£sZ4h>j*ÔšD:4­¿_ ÷¸ Õxæÿ ¸?Mù _•­ÊÐ ä ÷ý ÑwL œ­ïnTkÛUÍN©ë:¦fV ¶ÜÔÜMªÅâA½–¿R×TXš-%iTÊT•‡Ù‚JôϐZxWÑè‰f‰òG º ×Õû2aZ7OU3[“×AT–ÞŒ…-‘¤”Ì ì&(ˆ¿­•ƒkï’:ðY¦W‘ Å)“†‘˜³Åtcø˜ñTÂwÚÇ4|üLÇªí–v- qˆèU qPE.†â‘˜µ Æ,ÐÅs]8¾„oúÑ i>ÜxxÈó)ƒ ´æÁâØ$À‰vžŸf$Ž |ãw;ÀÁIJ»b` {¦Ó¤Ú$©YÀ‘n@Óïž«9J¼êG m¤ ܯ¹ÌW4€ÐÒÅÛ‡#褕Ÿn-?í|с¥÷Ú¹¬'´ÞÜ9ÓK `hê£SÄSà?7—Wí_´…óB›»:=Ãïq`<8ñÓŒÑlú2d¬ê³£hÖ[l|$vÝro~'R®‰§°ñmY ͧäP |PUª¹·:3Œ[Û{Xÿ ºâ@‚W–Äé u‚ ¯´*=íή.pûÒdt @G‰¬ s¸ ëÉücr ÞæÑ¨Ê@>¤¢Ö±. Þ'¯°ÌME[YéïĵÂCå½ Ué©Áû'Ê9%eÔðNU”ë‘ÌsD3/®+UI˜9h.WC”빓$#:pz:YÓ ¿xž* ³$Í +$kñAŠ‹†¢ Uê>¸)_š¬÷©ßAÂÔb9ÇU ¯¾á•9¯ÏÏ÷O÷¼¼Fähal1‰3Ì[Ïr•´UCksNÐ] R‘¸¥H+§Šé†c©vÖÞ0iÓ76s†î!§=ß ¼~Ô'°Ãmäoäš³ªøi1úÉ)³yV8 CLÄØÁ‘WYïi€H6ÖÑiámø^ÈY´°Ñ7¥Û*—Ñ©L«Qƒï—Ùrÿ ›£Ð*š¸ˆL©ˆ$ˆ ÷¾D§9È®«qbqC)–ˆïv´çñsÑVT­Ø, <àïºÀO«Jý·õ àfPìð .wFšir´þ’2_Y *Æ€x\« ì€9š@ Ž|F⇥ˆkZ@hÖÄ0t¿-<“‹qµ¾*ZL¤Ú)&BJpÓF5=$„at*Zš$’ÑtdûÝRI1 2މ$€$I$#‰SÞ’Hë¬ï;Á$¡t$’`<(ñÇt)$‡Ð.Êf¢X’Kt=Éé$‚ˆªè¢oÝëòI%Rgcª÷ŠyI%¡‰ÿ !ñ)´õ $¤ Ô’IIGÿÙa 3gp@sddlmZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z m Z ddl m Z ddlZddlZddlmZz ddlZWneydZYn0dZejdkZdd d Zd d ZeddZGdddejZedkredS))contextmanagerN)support) script_helper is_android)skip_if_sanitizer)dedentg?ntcCsL|}|d|7}|d|7}d|kr", line %s in func z& File "", line %s in r ^ $)Zlineno1Zlineno2header min_countregexr r 5/opt/python39/lib/python3.9/test/test_faulthandler.pyexpected_tracebacks   rcCsttd|S)Nz(raising SIGSEGV on Android is unreliable)unittestskipIfr)testr r rskip_segfault_on_android!s rc cs.t}z|VWt|n t|0dSN)tempfilemktemprunlinkfilenamer r rtemporary_filename&src@s2eZdZdddZdddddddddZdd d Zd d Zee j d dddZ e ddZddZddZee j dkdddZeedudeeedde ddZeedudeeed d!e d"d#Zd$d%Zd&d'Zee j d(d)eeed* d+d,d-Ze d.d/Zeddd0d1e d2d3Zee j dkd4eddd0d1e d5d6Ze d7d8Z e d9d:Z!d;d<Z"d=d>Z#d?d@Z$dAdBZ%dddCdDdEZ&dFdGZ'dHdIZ(ee j dkd4dJdKZ)dLdMZ*dNdOZ+dPdQZ,dRdSZ-ddddCdUdVZ.dWdXZ/dYdZZ0d[d\Z1d]d^Z2ee j dkd4d_d`Z3dadbZ4eeedc ddddedfZ5dgdhZ6didjZ7dkdlZ8ee j dkd4dmdnZ9dodpZ:dqdrZ;eee?dwdxdyZ@ee?dwdzd{ZAee?dwd|d}ZBee?dwd~dZCddZDdS)FaultHandlerTestsNc Csdt|}g}|dur"||tXtjd||d}|$|\}}|}Wdn1sj0YWdn1s0Y| dd}|r| |dt |d} | }Wdn1s0Y| dd}nj|durX| |dt |t jdt |dd d } | }Wdn1sB0Y| dd}||fS) a{ Run the specified code in Python (in a new child process) and read the output from the standard error or from a file (if filename is set). Return the output lines as a list. Strip the reference count from the standard error for Python debug build, and replace "Current thread 0x00007f8d8fbd9700" by "Current thread XXX". N-c)pass_fdsasciibackslashreplacerbrF)closefd)rstripappendrZSuppressCrashReportrZ spawn_python communicatewaitdecode assertEqualopenreadoslseekSEEK_SET splitlines) selfcoderfdr processoutputstderrexitcodefpr r r get_output/s,    D   &  ( zFaultHandlerTests.get_outputTF)r all_threads other_regexr4know_current_threadpy_fatal_errorcCs|r|rd} qd} nd} d} | r(|d7}t| j||| d} |rP| d|7} |j|||d\} } d | } || | || d d S) z Check that the fault handler for fatal errors is enabled and check the traceback from the child process output. Raise an error if the output doesn't match the expected format. zCurrent thread 0x[0-9a-f]+zThread 0x[0-9a-f]+ZStackz (?m)^{fatal_error} {header} \(most recent call first\): File "", line {lineno} in z" Python runtime state: initialized)lineno fatal_errorr|rr4r rN)rformatr&r:join assertRegexassertNotEqual)r2r3 line_numberr@rr;r<r4r=r>rrr6r8r r r check_errorPs&     zFaultHandlerTests.check_errorcKs2|rd||f}d|}|j|||fi|dS)Nz%s: %szFatal Python error: %srH)r2r3rG name_regexfunckwr@r r rcheck_fatal_errorts z#FaultHandlerTests.check_fatal_errorcKs"d|}|j|||fi|dS)NzWindows fatal exception: %srI)r2r3rGrJrLr@r r rcheck_windows_exceptionzsz)FaultHandlerTests.check_windows_exceptionZaixz5the first page of memory is a mapped read-only on AIXcCs&ts|dddn|ddddS)Nz import faulthandler faulthandler.enable() faulthandler._read_null() z4(?:Segmentation fault|Bus error|Illegal instruction)access violation) MS_WINDOWSrMrNr2r r rtest_read_null~s z FaultHandlerTests.test_read_nullcCs|ddddS)Nzs import faulthandler faulthandler.enable() faulthandler._sigsegv() rOSegmentation faultrMrRr r r test_sigsegvszFaultHandlerTests.test_sigsegvcCs|jddddddddS)Nz import faulthandler faulthandler.enable() faulthandler._fatal_error_c_thread() rOz in new threadFZfaulthandler_fatal_error_threadT)r=rKr>rUrRr r rtest_fatal_error_c_threadsz+FaultHandlerTests.test_fatal_error_c_threadcCs|ddddS)Nzs import faulthandler faulthandler.enable() faulthandler._sigabrt() rOZAbortedrUrRr r r test_sigabrtszFaultHandlerTests.test_sigabrtwin32z"SIGFPE cannot be caught on WindowscCs|ddddS)Nzr import faulthandler faulthandler.enable() faulthandler._sigfpe() rOzFloating point exceptionrUrRr r r test_sigfpeszFaultHandlerTests.test_sigfpezneed _testcapiSIGBUSzneed signal.SIGBUScCs|ddddS)Nz import faulthandler import signal faulthandler.enable() signal.raise_signal(signal.SIGBUS) z Bus errorrUrRr r r test_sigbusszFaultHandlerTests.test_sigbusSIGILLzneed signal.SIGILLcCs|ddddS)Nz import faulthandler import signal faulthandler.enable() signal.raise_signal(signal.SIGILL) r\zIllegal instructionrUrRr r r test_sigillszFaultHandlerTests.test_sigillcCs|jdddddddS)Nz[ import faulthandler faulthandler._fatal_error(b'xyz') xyzfaulthandler_fatal_error_pyTrKr>rUrRr r rtest_fatal_errors z"FaultHandlerTests.test_fatal_errorcCs|jdddddddS)Nza import faulthandler faulthandler._fatal_error(b'xyz', True) r`rarbTrcrUrRr r rtest_fatal_error_without_gils z.FaultHandlerTests.test_fatal_error_without_gilZopenbsdzVIssue #12868: sigaltstack() doesn't work on OpenBSD if Python is compiled with pthreadZ_stack_overflowz#need faulthandler._stack_overflow()cCs|jddddddS)Nzz import faulthandler faulthandler.enable() faulthandler._stack_overflow() rOz (?:Segmentation fault|Bus error)z unable to raise a stack overflow)r<rUrRr r rtest_stack_overflows z%FaultHandlerTests.test_stack_overflowcCs|ddddS)Nzw import faulthandler faulthandler.enable() faulthandler._sigsegv(True) rOrTrUrRr r rtest_gil_releasedsz#FaultHandlerTests.test_gil_releasedz0sanitizer builds change crashing process output.)ZmemoryZubreasoncCsHt.}|jdjt|ddd|dWdn1s:0YdS)Nz import faulthandler output = open({filename}, 'wb') faulthandler.enable(output) faulthandler._sigsegv() rrT)rrMrCreprr2rr r rtest_enable_filesz"FaultHandlerTests.test_enable_filez.subprocess doesn't support pass_fds on WindowscCsLtd.}|}|jd|dd|dWdn1s>0YdS)Nwb+z import faulthandler import sys faulthandler.enable(%s) faulthandler._sigsegv() rirTr4)r TemporaryFilefilenorM)r2r9r4r r rtest_enable_fds z FaultHandlerTests.test_enable_fdcCs|jddddddS)Nz import faulthandler faulthandler.enable(all_threads=False) faulthandler._sigsegv() rOrTFr;rUrRr r rtest_enable_single_thread)s z+FaultHandlerTests.test_enable_single_threadcCsHd}d}||\}}d|}|||vd||f||ddS)Nz import faulthandler faulthandler.enable() faulthandler.disable() faulthandler._sigsegv() zFatal Python errorr z%r is present in %rr)r:rD assertTruerF)r2r3Z not_expectedr7r8r r r test_disable4s   zFaultHandlerTests.test_disablecCstj}zztjt_t}zFt|tt|tW|rVtqxtn|rntnt0W|t_n|t_0dSr) sysr7 __stderr__ faulthandler is_enabledenablertdisableZ assertFalse)r2Z orig_stderrZ was_enabledr r rtest_is_enabledCs     z!FaultHandlerTests.test_is_enabledcCs0d}tjdd|f}t|}||ddS)N5import faulthandler; print(faulthandler.is_enabled())-ErFalse)rv executable subprocess check_outputr+rstrip)r2r3argsr6r r rtest_disabled_by_defaultYs z*FaultHandlerTests.test_disabled_by_defaultcCs`d}tdtjtjjrdndddd|f}tj}|ddt j ||d}| | d dS) Nr}r~r#z-XrxrPYTHONFAULTHANDLERenvTrue) filterrvrflagsignore_environmentr.environcopypoprrr+rr2r3rrr6r r rtest_sys_xoptionsas  z#FaultHandlerTests.test_sys_xoptionscCsd}tjd|f}ttj}d|d<d|d<tj||d}||dttj}d|d<d|d<tj||d}||d dS) Nr}rr#rZ PYTHONDEVMODErr1r) rvrdictr.rrrr+rrr r r test_env_varms   zFaultHandlerTests.test_env_varrBcCsld}|j||d}|rd}n|dur*d}nd}dd|d d g}||||\}}|||||d dS) z Explicitly call dump_traceback() function and check its output. Raise an error if the output doesn't match the expected format. a[ import faulthandler filename = {filename!r} fd = {fd} def funcB(): if filename: with open(filename, "wb") as fp: faulthandler.dump_traceback(fp, all_threads=False) elif fd is not None: faulthandler.dump_traceback(fd, all_threads=False) else: faulthandler.dump_traceback(all_threads=False) def funcA(): funcB() funcA() rB N Stack (most recent call first):z# File "", line %s in funcBz# File "", line 17 in funcAz& File "", line 19 in rrCr:r+)r2rr4r3r?expectedtracer8r r rcheck_dump_tracebacks$ z&FaultHandlerTests.check_dump_tracebackcCs |dSr)rrRr r rtest_dump_tracebacksz%FaultHandlerTests.test_dump_tracebackcCs6t}|j|dWdn1s(0YdSNr)rrrkr r rtest_dump_traceback_filesz*FaultHandlerTests.test_dump_traceback_filecCs>td }|j|dWdn1s00YdSNrmrn)rrorrpr2r9r r rtest_dump_traceback_fds z(FaultHandlerTests.test_dump_traceback_fdcCsdd}d|d}d|d}d}|j|d}dd|d g}||\}}|||||d dS) Nix2z...z import faulthandler def {func_name}(): faulthandler.dump_traceback(all_threads=False) {func_name}() ) func_namerz File "", line 4 in %sz% File "", line 6 in rr)r2maxlenrZ truncatedr3rrr8r r r test_truncates   zFaultHandlerTests.test_truncatecCspd}|jt|d}|||\}}d|}|r8d}nd}d}t|j|d}|||||dd S) z Call explicitly dump_traceback(all_threads=True) and check the output. Raise an error if the output doesn't match the expected format. a import faulthandler from threading import Thread, Event import time def dump(): if {filename}: with open({filename}, "wb") as fp: faulthandler.dump_traceback(fp, all_threads=True) else: faulthandler.dump_traceback(all_threads=True) class Waiter(Thread): # avoid blocking if the main thread raises an exception. daemon = True def __init__(self): Thread.__init__(self) self.running = Event() self.stop = Event() def run(self): self.running.set() self.stop.wait() waiter = Waiter() waiter.start() waiter.running.wait() dump() waiter.stop.set() waiter.join() rr  a ^Thread 0x[0-9a-f]+ \(most recent call first\): (?: File ".*threading.py", line [0-9]+ in [_a-z]+ ){{1,3}} File "", line 23 in run File ".*threading.py", line [0-9]+ in _bootstrap_inner File ".*threading.py", line [0-9]+ in _bootstrap Current thread 0x[0-9a-f]+ \(most recent call first\): File "", line {lineno} in dump File "", line 28 in $ )r?rN)rCrjr:rDrr&rEr+)r2rr3r6r8r?rr r rcheck_dump_traceback_threadss    z.FaultHandlerTests.check_dump_traceback_threadscCs|ddSr)rrRr r rtest_dump_traceback_threads sz-FaultHandlerTests.test_dump_traceback_threadscCs4t}||Wdn1s&0YdSr)rrrkr r r test_dump_traceback_threads_filesz2FaultHandlerTests.test_dump_traceback_threads_filer c Csttjtd}d}|jt|||||d}|||\}} d|}|s~|} |rX| d9} d|} tdd| | d } ||| n | |d | | d d S) a Check how many times the traceback is written in timeout x 2.5 seconds, or timeout x 3.5 seconds if cancel is True: 1, 2 or 3 times depending on repeat and cancel options. Raise an error if the output doesn't match the expect format. )Zsecondsa import faulthandler import time import sys timeout = {timeout} repeat = {repeat} cancel = {cancel} loops = {loops} filename = {filename!r} fd = {fd} def func(timeout, repeat, cancel, file, loops): for loop in range(loops): faulthandler.dump_traceback_later(timeout, repeat=repeat, file=file) if cancel: faulthandler.cancel_dump_traceback_later() time.sleep(timeout * 5) faulthandler.cancel_dump_traceback_later() if filename: file = open(filename, "wb") elif fd is not None: file = sys.stderr.fileno() else: file = None func(timeout, repeat, cancel, file, loops) if filename: file.close() )timeoutrepeatcancelloopsrr4r r`zATimeout \(%s\)!\nThread 0x[0-9a-f]+ \(most recent call first\):\n)rr#rN) strdatetimeZ timedeltaTIMEOUTrCr:rDrrEr+) r2rrrrr4Z timeout_strr3rr8countrrr r rcheck_dump_traceback_laters*   z,FaultHandlerTests.check_dump_traceback_latercCs |dSrrrRr r rtest_dump_traceback_laterRsz+FaultHandlerTests.test_dump_traceback_latercCs|jdddS)NT)rrrRr r r test_dump_traceback_later_repeatUsz2FaultHandlerTests.test_dump_traceback_later_repeatcCs|jdddS)NT)rrrRr r r test_dump_traceback_later_cancelXsz2FaultHandlerTests.test_dump_traceback_later_cancelcCs6t}|j|dWdn1s(0YdSr)rrrkr r rtest_dump_traceback_later_file[sz0FaultHandlerTests.test_dump_traceback_later_filecCs>td }|j|dWdn1s00YdSr)rrorrprr r rtest_dump_traceback_later_fd_s z.FaultHandlerTests.test_dump_traceback_later_fdcCs|jdddS)Nr`)rrrRr r rtest_dump_traceback_later_twiceesz1FaultHandlerTests.test_dump_traceback_later_twiceregisterzneed faulthandler.registerc Cstj}d}|j||||||d}|||\}} d|}|sf|rHd} nd} tdd| } ||| n ||d|r|| d n || d d S) a Register a handler displaying the traceback on a user signal. Raise the signal and check the written traceback. If chain is True, check that the previous signal handler is called. Raise an error if the output doesn't match the expected format. ax import faulthandler import os import signal import sys all_threads = {all_threads} signum = {signum} unregister = {unregister} chain = {chain} filename = {filename!r} fd = {fd} def func(signum): os.kill(os.getpid(), signum) def handler(signum, frame): handler.called = True handler.called = False if filename: file = open(filename, "wb") elif fd is not None: file = sys.stderr.fileno() else: file = None if chain: signal.signal(signum, handler) faulthandler.register(signum, file=file, all_threads=all_threads, chain={chain}) if unregister: faulthandler.unregister(signum) func(signum) if chain and not handler.called: if file is not None: output = file else: output = sys.stderr print("Error: signal handler not called!", file=output) exitcode = 1 else: exitcode = 0 if filename: file.close() sys.exit(exitcode) )r;signum unregisterchainrr4r z8Current thread 0x[0-9a-f]+ \(most recent call first\):\nz#Stack \(most recent call first\):\nr r#rN) signalSIGUSR1rCr:rDrrEr+rF) r2rr;rrr4rr3rr8rr r rcheck_registerhs, .   z FaultHandlerTests.check_registercCs |dSrrrRr r r test_registerszFaultHandlerTests.test_registercCs|jdddS)NT)rrrRr r rtest_unregistersz!FaultHandlerTests.test_unregistercCs6t}|j|dWdn1s(0YdSr)rrrkr r rtest_register_filesz$FaultHandlerTests.test_register_filecCs>td }|j|dWdn1s00YdSr)rrorrprr r rtest_register_fds z"FaultHandlerTests.test_register_fdcCs|jdddS)NTrrrrRr r rtest_register_threadssz'FaultHandlerTests.test_register_threadscCs|jdddS)NT)rrrRr r rtest_register_chainsz%FaultHandlerTests.test_register_chainccsftj}zRdt_|t}dVWdn1s40Y|t|jdW|t_n|t_0dS)Nzsys.stderr is None)rvr7Z assertRaises RuntimeErrorr+r exception)r2r7cmr r rcheck_stderr_nones $z#FaultHandlerTests.check_stderr_nonecCs|tWdn1s&0Y|tWdn1sV0Y|tdWdn1s0Yttdr|ttjWdn1s0YdS)NgMbP?r) rrxrzZdump_tracebackZdump_traceback_laterhasattrrrrrRr r rtest_stderr_Nones & & (  z"FaultHandlerTests.test_stderr_Nonezspecific to WindowscCs(dD]\}}|d|dd|qdS)N))ZEXCEPTION_ACCESS_VIOLATIONrP)ZEXCEPTION_INT_DIVIDE_BY_ZEROzint divide by zero)ZEXCEPTION_STACK_OVERFLOWzstack overflowz import faulthandler faulthandler.enable() faulthandler._raise_exception(faulthandler._) rO)rN)r2excnamer r rtest_raise_exceptions z&FaultHandlerTests.test_raise_exceptioncCsHdD]>}d|d}t|}||\}}||g|||qdS)N)lcs@lRC@z import faulthandler faulthandler.enable() faulthandler._raise_exception(z) rr:r+)r2Zexc_coder3r6r8r r rtest_ignore_exceptions z'FaultHandlerTests.test_ignore_exceptioncCsFdD]<}|d|dd\}}||g||||d@fqdS)N)rixV4i@i@ipiz{ import faulthandler faulthandler.enable() faulthandler._raise_exception(0xrri)r:r+ZassertIn)r2rr6r8r r rtest_raise_nonfatal_exceptions  z/FaultHandlerTests.test_raise_nonfatal_exceptioncCs2td}||\}}||g||ddS)Nz import faulthandler faulthandler.enable() faulthandler.disable() code = faulthandler._EXCEPTION_ACCESS_VIOLATION faulthandler._raise_exception(code) lrr2r3r6r8r r r test_disable_windows_exc_handler$s z2FaultHandlerTests.test_disable_windows_exc_handlercCs2td}||\}}||g||ddS)Nz` import faulthandler faulthandler.cancel_dump_traceback_later() rrrr r r.test_cancel_later_without_dump_traceback_later1s z@FaultHandlerTests.test_cancel_later_without_dump_traceback_later)NN)N)FFr )FFFFN)E__name__ __module__ __qualname__r:rHrMrNrrrvplatform startswithrSrrVrWrXrZ _testcapiZ skipUnlessrrr]r_rdrerxrfrgrrlrqrsrur|rrrrrrrrrrrrrrrrrrrrrrrrrrrrrQrrrrrr r r rr.s " $                  .  ; >   Q           r__main__)r ) contextlibrrrxr.rrrvrrZ test.supportrrrrrtextwraprr ImportErrorrrrQrrrZTestCaserrmainr r r rs>