3
ԼYw                 @   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j	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j| dd}tj|}|s<tjdtt jj| f  tj	 \}}t j
|d}z|j| |jtjd |rvnht jj| dd}t|}	z|	j }
W d |	j  X |jd|
  |jdjd	d
 |D  |jtjd W d |j  X |S )NZcython_debugzcython_debug_info_*z.%s.
No debug files were found in %s. Aborting.waV              # 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
            # 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
            end
            interpreterzfile %s

c             s   s   | ]}d | V  qdS )zcy import %s
N ).0fnr   r   e/home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python3.6/site-packages/Cython/Debugger/Cygdb.py	<genexpr>J   s    z$make_command_file.<locals>.<genexpr>a                  python
                import sys
                try:
                    gdb.lookup_type('PyModuleObject')
                except RuntimeError:
                    sys.stderr.write(
                        'Python was not compiled with debug symbols (or it was '
                        'stripped). Some functionality may not work (properly).\n')
                end

                source .cygdbinit
            )ospathjoinglobsysexitusageabspathtempfilemkstempfdopenwritetextwrapdedentopenreadclose)path_to_debug_infoZprefix_code	no_importpatternZdebug_filesfdtempfilenamefr   Zinterpreter_filer   r   r   r	   make_command_file   s6    



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krdt|dkr^|d
 } ntj} |dkrx|dd }| dkrd}tj	}|j
dkrtj}|j
dkrtj}tj|d tjd|j
 tjd|| tjd| | t| |d}tjd|j|| t|}tjd||j  tjd|j tj|jd|g| }	tjd|j|	j xJy*tjd|	j |	j }
tjd|	j|
 W n tk
r   Y nX P qRW tjd|j  W dQ R X tjd| tj| tj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&   N   z--T   )levelzverbosity = %rzoptions = %r; args = %rzIDone parsing command-line options. path_to_debug_info = %r, gdb_argv = %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basicConfigloggerinfodebugr"   r#   r   r   
subprocessPopenpidwaitKeyboardInterruptfilenoremove)r   Zgdb_argvr   parseroptionsargsZlogging_levelr    r   pretr   r   r	   main_   s\    





rG   )r   F)NNF)__doc__r   r   r   r   r   r;   r-   r3   	getLogger__name__r8   r"   r   rG   r   r   r   r	   <module>   s   

D