U
    †µ“eÿ  ã                   @   sj   d Z ddlZddlZddlZddlZddlZddlZddlZddlZe 	e
¡Zd
dd„ZdZddd	„ZdS )a  
The Cython debugger

The current directory should contain a directory named 'cython_debug', or a
path to the cython project directory should be given (the parent directory of
cython_debug).

Additional gdb args can be provided only if a path to the project directory is
given.
é    NÚ Fc                 C   s  |s<t j | dd¡}t |¡}|s<t dtt j | ¡f ¡ t 	¡ \}}t  
|d¡}z²| |¡ | t dttƒ d ¡¡ |r‚n‚|sÄt j | dd¡}	t|	ƒ}
z|
 ¡ }W 5 |
 ¡  X | d| ¡ | d	 d
d„ |D ƒ¡¡ |sú| t d| d ¡¡ | d¡ W 5 | ¡  X |S )NZcython_debugzcython_debug_info_*z.%s.
No debug files were found in %s. Aborting.Úwa              # This is a gdb command file
            # See https://sourceware.org/gdb/onlinedocs/gdb/Command-Files.html

            set breakpoint pending on
            set print pretty on

            python
            try:
                # Activate virtualenv, if we were launched from one
                import os
                virtualenv = os.getenv('VIRTUAL_ENV')
                if virtualenv:
                    path_to_activate_this_py = os.path.join(virtualenv, 'bin', 'activate_this.py')
                    print("gdb command file: Activating virtualenv: %s; path_to_activate_this_py: %s" % (
                        virtualenv, path_to_activate_this_py))
                    with open(path_to_activate_this_py) as f:
                        exec(f.read(), dict(__file__=path_to_activate_this_py))
                from Cython.Debugger import libcython, libpython
            except Exception as ex:
                from traceback import print_exc
                print("There was an error in Python code originating from the file z¢")
                print("It used the Python interpreter " + str(sys.executable))
                print_exc()
                exit(1)
            end
            Úinterpreterzfile %s
Ú
c                 s   s   | ]}d | V  qdS )zcy import %s
N© )Ú.0Úfnr   r   ú9/tmp/pip-unpacked-wheel-7k3cqui1/Cython/Debugger/Cygdb.pyÚ	<genexpr>V   s     z$make_command_file.<locals>.<genexpr>zý                    python
                    import sys
                    try:
                        gdb.lookup_type('PyModuleObject')
                    except RuntimeError:
                        sys.stderr.write(
                            "z² was not compiled with debug symbols (or it was "
                            "stripped). Some functionality may not work (properly).\n")
                    end
                zsource .cygdbinit)ÚosÚpathÚjoinÚglobÚsysÚexitÚusageÚabspathÚtempfileÚmkstempÚfdopenÚcloseÚwriteÚtextwrapÚdedentÚstrÚ__file__ÚopenÚread)Úpath_to_debug_infoZprefix_codeÚ	no_importÚskip_interpreterÚpatternZdebug_filesÚfdÚtempfilenameÚfr   Zinterpreter_filer   r   r   r	   Úmake_command_file   sN    þ
 
ÿ

ëë

ùù
r%   z0Usage: cygdb [options] [PATH [-- GDB_ARGUMENTS]]c              	   C   sö  t jtd}|jddddd |jdddd	d
dd |jdddddd | ¡ \}}| dkrxt|ƒdkrr|d
 } ntj} |dkrŒ|dd… }| dkr˜d}tj	}|j
dkr®tj}|j
dkr¾tj}tj|d |j}t d|j
¡ t d||¡ t d| |¡ t| ||d}t d|j||¡ t|ƒ¨}	t d||	 ¡ ¡ t d|j¡ t |jd |g| ¡}
t d!|j|
j¡ z*t d"|
j¡ |
 ¡ }t d#|
j|¡ W n tk
r¬   Y nX q¶qlt d$|	 ¡ ¡ W 5 Q R X t d%|¡ t |¡ t d&|¡ dS )'ab  
    Start the Cython debugger. This tells gdb to import the Cython and Python
    extensions (libcython.py and libpython.py) and it enables gdb's pending
    breakpoints.

    path_to_debug_info is the path to the Cython build directory
    gdb_argv is the list of options to gdb
    no_import tells cygdb whether it should import debug information
    )r   z--gdb-executableÚgdbz$gdb executable to use [default: gdb])ÚdestÚdefaultÚhelpz	--verbosez-vÚ	verbosityÚcountr   z8Verbose mode. Multiple -v options increase the verbosity)r'   Úactionr(   r)   z--skip-interpreterr    FÚ
store_truez]Do not automatically point GDB to the same interpreter used to generate debugging information)r'   r(   r,   r)   Né   z--Té   )Úlevelzverbosity = %rzoptions = %r; args = %rzIDone parsing command-line options. path_to_debug_info = %r, gdb_argv = %r)r   r    z3Launching %s with command file: %s and gdb_argv: %sz%Command file (%s) contains: """
%s"""zSpawning %s...z-commandzSpawned %s (pid %d)z#Waiting for gdb (pid %d) to exit...z3Wait for gdb (pid %d) to exit is done. Returned: %rz%Closing temp command file with fd: %szRemoving temp command file: %szRemoved temp command file: %s)ÚoptparseÚOptionParserr   Ú
add_optionÚ
parse_argsÚlenr   ÚcurdirÚloggingÚWARNr*   ÚINFOÚDEBUGÚbasicConfigr    ÚloggerÚinfoÚdebugr%   r&   r   r   Ú
subprocessÚPopenÚpidÚwaitÚKeyboardInterruptÚfilenoÚremove)r   Zgdb_argvr   ÚparserÚoptionsÚargsZlogging_levelr    r#   r   ÚpÚretr   r   r	   Úmainm   s‚    
 þ  þ  þ


 ÿþ  ÿ

rK   )r   FF)NNF)Ú__doc__r   r   r   r   r   r?   r1   r7   Ú	getLoggerÚ__name__r<   r%   r   rK   r   r   r   r	   Ú<module>   s   
    ÿ
Q