Depurando Python y C++ expuestos por impulso juntos
debugging boost (2)
Descubrí cómo depurar la parte de C ++ mientras ejecutaba Python. (se dio cuenta mientras leía sobre la detección de ID de proceso en el libro de Python ..).
Primero ejecutas el programa python que incluye programas C ++. Al inicio del programa python, use raw_input () para hacer que el programa le espere. Pero justo antes de eso, print os.getpid()
(por supuesto que debería haber importado el paquete os). Cuando ejecute el programa python, habrá impreso el pid del programa python que está ejecutando y estará esperando la entrada del teclado.
código de parada de python:
import os
def w1(str):
print (str)
wait = raw_input()
return
print os.getpid()
w1(''starting main..press a key'')
resultado:
27352
starting main..press a key
O bien, puede usar import pdb, pdb.set_trace () como comentario a continuación. (Gracias @AndyG) y ver EDIT * para obtener pid usando ps -aux
.
Ahora, supongamos que la biblioteca compartida de C ++ es _caffe.so (que es mi caso. Esta biblioteca _caffe.so tiene todos los códigos de C ++ y aumenta las funciones de envoltura de python). 27352 es el pid. Luego en otro shell comienza gdb como
gdb caffe-fast-rcnn/python/caffe/_caffe.so 27352
o si desea utilizar la depuración gráfica utilizando como DDD, haga
ddd caffe-fast-rcnn/python/caffe/_caffe.so 27352
Luego verás que gdb comienza y espera con un aviso. El programa python es interrumpido por gdb y espera en modo detenido (estaba esperando su entrada de clave, pero ahora está realmente en modo detenido, y necesita el comando gdb continue del segundo depurador para continuar con la tecla en espera).
Ahora puedes dar comando de punto de ruptura en gdb como
br solver.cpp:225
y puedes ver un mensaje como
Breakpoint 1 at 0x7f2cccf70397: file src/caffe/solver.cpp, line 226. (2 locations)
Cuando da continue
comando continue
en la segunda ventana de gdb (que estaba sosteniendo el programa), el código de Python se ejecuta de nuevo. Por supuesto, debe ingresar una entrada clave en la primera ventana de gdb para hacer que proceda.
Ahora, al menos, puedes depurar el código C ++ mientras ejecutas el programa Python (eso es lo que quería hacer).
Más tarde verifiqué si puedo hacer python y C ++ al mismo tiempo y funciona. ddd -pydb prog1.py options..
el depurador (DDD) como las ddd -pydb prog1.py options..
y adjunta otro DDD utilizando el método explicado anteriormente. Ahora puede establecer puntos de interrupción para Python y C ++ y usar otras funciones de depuración en cada ventana (me gustaría haberlo sabido un par de meses antes ... Debería haber ayudado a toneladas).
EDITAR: para obtener el pid, puedes hacer ps -aux | grep python
ps -aux | grep python
lugar. Este pid es el siguiente de pid de ddd.
Puedo depurar el código de Python usando ddd -pydb prog.py
Todos los argumentos de la línea de comando de python pueden pasarse también después de prog.py
En mi caso, se han implementado muchas clases en C ++ que están expuestas a python utilizando boost-python
. Me gustaría poder depurar el código de Python y C ++ juntos. Por ejemplo, quiero establecer puntos de ruptura como este:
break my_python.py:123
break my_cpp.cpp:456
cont
Por supuesto, lo estoy intentando después de compilar los códigos c ++ con la opción de depuración, pero el depurador no cruza el límite de refuerzo. ¿Hay alguna manera?
EDITAR : vi http://www.boost.org/doc/libs/1_61_0/libs/python/doc/html/faq/how_do_i_debug_my_python_extensi.html . Lo seguí y puedo hacer la depuración tanto de python como de C ++. Pero preferiblemente quiero hacer depuración visual con DDD
pero no sé cómo dar el comando ''target exec python'' dentro de DDD
. Si no (solo usando gdb
como en el enlace) debería poder depurar una secuencia de comandos de Python que no dé comandos de forma interactiva como en el enlace.
Tuve un problema similar, pero no logré que las soluciones de la respuesta de Chan funcionaran (en MAC OS X 10.12.4). En cambio lo siguiente funcionó para mí.
- Escriba un script de python
test.py
que importe y use el módulo boost.Python. iniciar python en el depurador
lldb python3 test.py
dando
> lldb python3 test.py (lldb) target create "python3" Current executable set to ''python3'' (x86_64). (lldb) settings set -- target.run-args "test.py" (lldb) run Process 46189 launched: ''/Users/me/anaconda/bin/python3'' (x86_64) test.cpython-36m-darwin.so was compiled with optimization - stepping may behave oddly; variables may not be available. Process 46189 stopped * thread #1, queue = ''com.apple.main-thread'', stop reason = EXC_BAD_ACCESS (code=1, address=0x10d4b3000) frame #0: 0x00000001019f49c2 test.cpython-36m-darwin.so`std::__1::enable_if<true, void>::type (anonymous namespace)::Render2D<double>::add_particle<true, 5ul>(float*, float, float, float, float) const [inlined] mylib::SSE::packed<8ul, float>::loadu( 944 { return {_mm256_load_ps(p)}; } 945 /// load from unaligned memory location 946 static __always__inline packed loadu(const element_type*p) noexcept -> 947 { return {_mm256_loadu_ps(p)}; } 948 /// load from aligned memory location, using template arg for alignment 949 template<bool aligned> 950 static __always_inline enable_if_t< aligned, packed>
No es necesario obtener el pid e iniciar el depurador desde una ventana separada o establecer puntos de interrupción.