a „oeÇFã@sdZddlZddlZddlZddlZddlZddlZddlZddlZ ddl m Z m Z m Z ddlmZddlmZmZmZdd„Zzejd dZWney¨dZYn0eZeZer¾e Ze ZGd d „d ƒZd d „Zdadd„ZGdd„dejejƒZ dd„Z!dS)zQThe glue between the Python debugger interface and the Active Debugger interface éN)Ú_wrapÚ _wrap_removeÚtrace)Úunwrapé)ÚaxdebugÚgatewaysÚ stackframecGsdS©N©)Úargsr r ú8C:\Program Files\Certbot\pkgs\win32comext\axdebug\adb.pyÚfnullsrZ DEBUG_AXDEBUGc@s$eZdZdd„Zdd„Zdd„ZdS)ÚOutputReflectorcCs||_||_dSr )Ú writefuncÚfile)Úselfrrr r r Ú__init__%szOutputReflector.__init__cCs t|j|ƒSr )Úgetattrr©rÚnamer r r Ú __getattr__)szOutputReflector.__getattr__cCs| |¡|j |¡dSr )rrÚwrite)rÚmessager r r r,s zOutputReflector.writeN)Ú__name__Ú __module__Ú __qualname__rrrr r r r r$srcCs<|dur dSd}|jdurd}dt|ƒ|jj|j|fSdS)Nzz (with trace!)z **No Trace Set **z Frame at %d, file %s, line: %d%s)Úf_traceÚidÚf_codeÚ co_filenameÚf_lineno)ÚframeZaddnr r r Ú_dumpf1s ür#cCs\zB|j ¡}ddl}dd|j ¡|f|j|<t ||||d¡Wnt ¡Yn0dS)Nrr) Z codeContainerZ GetFileNameÚ linecacheZGetTextÚcacheÚg_adbÚ_OnSetBreakPointÚ tracebackÚ print_exc)Ú codeContextZbreakPointStateÚlineNoZfileNamer$r r r ÚOnSetBreakPointCs r,c@seZdZdd„Zdd„Zdd„ZdBdd „Zd d „Zd d „Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„ZdCd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„Zd2d3„Zd4d5„Zd6d7„Zd8d9„Zd:d;„Zdd?„Z!d@dA„Z"dS)DÚAdbcCsvd|_d|_d|_d|_|_d|_d|_d|_d|_d|_d|_ d|_ d|_ g|_ t j |¡t ¡|_| ¡dSr )ÚdebugApplicationÚdebuggingThreadÚdebuggingThreadStateHandleÚstackSnifferCookieÚ stackSnifferÚcodeContainerProviderÚ breakFlagsÚ breakReasonÚ appDebuggerÚappEventConnectionÚlogicalbotframeÚ currentframeÚ recursiveDataÚbdbÚBdbrÚ_threadÚ allocate_lockÚ_threadprotectlockÚreset©rr r r rPs    z Adb.__init__cCs|ddkr|Stj ||¡S)Nrú<)r;r<Úcanonic)rÚfnamer r r rCbs z Adb.canoniccCstdƒtj |¡dS)Nz adb.reset)Ú traceenterr;r<r@rAr r r r@gsz Adb.resetNcCsN||jvrg|j|<|j|}||vr*dS| |¡|durJ||j||f<dS)Nz$There is already a breakpoint there!)ÚbreaksÚappendZcbreaks)rÚfilenameÚlinenoZcondÚlistr r r Z__xxxxx__set_breakks    zAdb.__xxxxx__set_breakcCs0tdt|ƒt|jƒƒ||jur$dStdƒdS)NÚ stop_hererzstop_here said 'No'!r)rEr#Ú stopframeÚtracev©rr"r r r rKvs  z Adb.stop_herecCs†td|jt|ƒƒd|_|jtjkr.tj|_nN|jtjkrDtj|_n8|jtj krZtj |_n"t d|j ƒt j ||¡r|tj|_|jduS)NÚ break_herezCalling base 'break_here' with)rEr4r#r5rÚAPPBREAKFLAG_DEBUGGER_HALTÚBREAKREASON_DEBUGGER_HALTZAPPBREAKFLAG_DEBUGGER_BLOCKZBREAKREASON_DEBUGGER_BLOCKZAPPBREAKFLAG_STEPÚBREAKREASON_STEPÚprintrFr;r<rOZBREAKREASON_BREAKPOINTrNr r r rO�s       zAdb.break_herecCsJtdt|ƒƒ|jtjkr&tj|_dStj  ||¡}t dt|ƒd|ƒ|S)NÚbreak_anywhererZ returning) rEr#r4rrPrQr5r;r<rTrM)rr"Úrcr r r rT�s zAdb.break_anywherecCsHtdt|ƒ|ƒ|j|ur0tdƒt d¡dS|j|_tj   |||¡S)NÚdispatch_returnz#dispatch_return resetting sys.trace) rEr#r8rMÚsysÚsettraceÚf_backr9r;r<rV©rr"Úargr r r rV™s  zAdb.dispatch_returncCs~tdt|ƒt|jƒƒ||jurBtdt|ƒdƒt |j¡|jS|j  |j j ¡durjtdt|ƒdƒdS||_ t j ||¡S)NÚ dispatch_linez for bottom frame returing tracerz!dispatch_line has no document forú- skipping trace!)rEr#Úbotframer8rrWrXÚtrace_dispatchr3Ú FromFileNamerr r9r;r<r\rNr r r r\¤s   ÿÿzAdb.dispatch_linecCsbtdt|ƒƒt ¡|jd<||jur4tdƒ|jS|j  |j j ¡dur\tdt|ƒdƒdS|jS)NÚ dispatch_callÚ__axstack_address__z1dispatch_call is self.botframe - returning tracerz!dispatch_call has no document forr]) rEr#rÚGetStackAddressÚf_localsr^rr_r3r`rr rZr r r raºs  ÿzAdb.dispatch_callcCs:tdt|ƒ||ƒ|jdur(tdƒdStj ||||¡S)Nr_z"trace_dispatch has no application!)rEr#r.rr;r<r_)rr"Zeventr[r r r r_Îs  zAdb.trace_dispatchcCs>tdt|ƒƒ|jdkr:|j}|dur,tj}| |d|¡dS)NÚ user_liner)rEr#r!r5rrRÚ_HandleBreakPoint)rr"r5r r r reÛs  z Adb.user_linecCstj |||¡dSr )r;r<Ú user_return)rr"Z return_valuer r r rgäszAdb.user_returncCstj |||¡dSr )r;r<Úuser_exception)rr"Úexc_infor r r rhèszAdb.user_exceptionc Cstd|dt|ƒƒtdt|jƒƒz|j |¡}td|ƒWn6tjyr}ztj }t d|ƒWYd}~n d}~00g|_ d|_ |tj kr”| ¡n~|tj kr°tdƒ| ¡nb|tjkrÌtdƒ| ¡nF|tjkrêtd ƒ| |¡n(|tjk�r td ƒ| |¡ntd ƒ‚d|_dS) Nz$Calling HandleBreakPoint with reasonzat framez Current frame iszHandleBreakPoint returned with zHandleBreakPoint FAILED withrzresume action is continuezresume action is stepzresume action is nextzresume action is stop outzunknown resume action flags)rEr#r9r.ZHandleBreakPointrMÚ pythoncomÚ com_errorrZBREAKRESUMEACTION_CONTINUErÚstackZcurindexZBREAKRESUMEACTION_ABORTÚset_quitZ set_continueZBREAKRESUMEACTION_STEP_INTOZset_stepZBREAKRESUMEACTION_STEP_OVERZset_nextZBREAKRESUMEACTION_STEP_OUTZ set_returnÚ ValueErrorr5)rr"ÚtbÚreasonZ resumeActionZdetailsr r r rfìs8 ÿ            zAdb._HandleBreakPointcCstj|_tj |¡dSr )rZBREAKREASON_LANGUAGE_INITIATEDr5r;r<Ú set_tracerAr r r rqsz Adb.set_tracecCs¶tdƒ| ¡d|_|jdurVz|j |j¡Wn"tjyTtd|jƒYn0|j rft |j ƒd|_|_ |j durŒ|j   ¡d|_ d|_d|_ |jdur²|j ¡d|_dS)NZ ClosingAppz(*** Could not RemoveStackFrameSniffer %d)rEr@r8r1r.ZRemoveStackFrameSnifferrjrkrr2rr7Z Disconnectr6r3ÚCloserAr r r ÚCloseApps. ÿÿ       z Adb.CloseAppcCsJ||_||_tt |¡tjƒ|_| |j¡|_ t j j   |j|tj¡|_dSr )r3r.rr ZDebugStackFrameSnifferrZIID_IDebugStackFrameSnifferr2ZAddStackFrameSnifferr1Úwin32comZclientZconnectZSimpleConnectionZ!IID_IRemoteDebugApplicationEventsr7)rr.r3r r r Ú AttachApp,s ÿÿ ÿz Adb.AttachAppcCs†td|dt|jƒƒt ¡|jkr.tdƒdSt|jƒdkrXd|_d|_d|_d|_ dS|jd\|_ |_ |_|_ |jdd…|_dS)NÚResetAXDebuggingz with refcountz'ResetAXDebugging called on other threadrr) rEÚlenr:Úwin32apiÚGetCurrentThreadIdr/rr8r9r0Z logbotframerLrAr r r rv=s"ûzAdb.ResetAXDebuggingcCsâ|dur|}nt ¡|jd<td|ƒ|j ¡zht ¡}|jdurL||_n@|j|krnt dƒW|j  ¡dS|j   d|j |j|j|jf¡W|j  ¡n |j  ¡0t dt|ƒƒ||_||_||_ d|_t ¡|_| ¡dS)ziGet ready for potential debugging. Must be called on the thread that is being debugged. NrbÚSetupAXDebuggingz2SetupAXDebugging called on other thread - ignored!rz"SetupAXDebugging has base frame as)rrcrdrEr?Úacquirerxryr/rÚreleaser:Úinsertr8rLr9r0r#r^ZGetThreadStateHandleÚ_BreakFlagsChanged)rZ baseFrameZ userFrameZ thisThreadr r r rzSs<     ôüþ  zAdb.SetupAXDebuggingcs<tdˆƒˆ|_‡fdd„}ttj|ƒt_ttj|ƒt_dS)NÚOnConnectDebuggercs ˆ |¡Sr )Z onDebugOutput)Ús©r6r r Ú„óz'Adb.OnConnectDebugger..)rEr6rrWÚstdoutÚstderr)rr6rr r�r r€s   zAdb.OnConnectDebuggercCsFtdƒttjtƒrtjjt_ttjtƒr4tjjt_d|_| ¡dS)NÚOnDisconnectDebugger) rEÚ isinstancerWr„rrr…r6rmrAr r r r†ˆs    zAdb.OnDisconnectDebuggercCstd|ƒdS)NÚ OnSetName©rErr r r rˆ’sz Adb.OnSetNamecCstd|ƒdS)NÚ OnDebugOutputr‰)rÚstringr r r rŠ•szAdb.OnDebugOutputcCs tdƒdS)NÚOnCloser‰rAr r r rŒ˜sz Adb.OnClosecCstd|ƒdS)NÚOnEnterBreakPointr‰©rÚrdatr r r r�›szAdb.OnEnterBreakPointcCstd|ƒdS)NÚOnLeaveBreakPointr‰rŽr r r r�žszAdb.OnLeaveBreakPointcCstd|ƒdS)NÚOnCreateThreadr‰rŽr r r r‘¡szAdb.OnCreateThreadcCstd|ƒdS)NÚOnDestroyThreadr‰rŽr r r r’¤szAdb.OnDestroyThreadcCstd||ƒ||_| ¡dS)NzDebugger OnBreakFlagChange)rEr4r~)rZabfr�r r r ÚOnBreakFlagChange§s zAdb.OnBreakFlagChangecCs¦td|j|jt ¡fƒtd|jƒt|jƒs6|jrt|jrXtdt |jƒƒ|j |j_ ntdƒ|j durt|j |j _ |j dur¢|jr¢|jt ¡kr¢t |j |j ¡dS)NzH_BreakFlagsChanged to %s with our thread = %s, and debugging thread = %sz_BreakFlagsChanged has breakszBreakFlagsChange with bot framez&BreakFlagsChanged, but no bottom frame)rEr4r/rxryrrFrwr8r#r_rrLr0rZSetThreadStateTracerAr r r r~¬s,ÿÿ    ÿþ ýÿzAdb._BreakFlagsChangedcCshtd|||||ƒ|tjkrD| ||¡}|r6td|ƒtd|jƒn | ||¡| ¡td|jƒdS)Nr'z*** set_break failed -z+_OnSetBreakPoint just set BP and has breaksz$_OnSetBreakPoint leaving with breaks) rErZBREAKPOINT_ENABLEDZ set_breakrSrrFZ clear_breakr~)rÚkeyr*Zbpsr+Zproblemr r r r'Ïs    zAdb._OnSetBreakPoint)N)NN)#rrrrrCr@Z_Adb__xxxxx__set_breakrKrOrTrVr\rar_rergrhrfrqrsrurvrzrr†rˆrŠrŒr�r�r‘r’r“r~r'r r r r r-Os@      " - #r-cCstdurtƒatSr )r&r-r r r r ÚDebuggerÜsr•)"Ú__doc__r=r;ÚosrWr(rjrxZwin32com.client.connectrtZwin32com.axdebug.utilrrrZwin32com.server.utilrÚrrr rÚenvironZ debuggingÚKeyErrorrErMrr#r&r,r<ZRemoteDebugApplicationEventsr-r•r r r r Ús>