Я узнал, как отлаживать часть C++ во время работы python. (понял это, читая об обнаружении идентификатора процесса в книге Python ..).
Сначала вы запускаете программу python, которая включает в себя программы на C++. В начале программы python используйте raw_input(), чтобы программа ожидала ввода данных. Но перед этим сделайте print os.getpid()
(конечно, вы должны были импортировать пакет os). Когда вы запустите программу python, она напечатает pid программы python, в которой вы работаете, и будет ждать ввода вашей клавиатуры.
питон код остановки:
import os
def w1(str):
print (str)
wait = raw_input()
return
print os.getpid()
w1('starting main..press a key')
результат:.
27352
starting main..press a key
Или, вы можете использовать импорт PDB, pdb.set_trace() как комментарий ниже (спасибо @AndyG) и посмотреть EDIT * для получения pid с использованием ps -aux
.
Предположим, что общая библиотека C++ - это _caffe.so (это мой случай. Эта библиотека _caffe.so имеет все коды на C++ и повышает функции оболочки python). 27352 - это pid. Затем в другой оболочке запуска GDB как
gdb caffe-fast-rcnn/python/caffe/_caffe.so 27352
или если вы хотите использовать графическую отладку, используя как DDD, сделать
ddd caffe-fast-rcnn/python/caffe/_caffe.so 27352
Тогда вы увидите, начинает GdB и ждать с подсказкой. Программа python прерывается gdb и ждет в остановленном режиме (он ждал ввода вашего ключа, но теперь он действительно находится в режиме stopeed, и ему требуется команда gdb continue от второго отладчика, чтобы продолжить ожидание ключа).
Теперь вы можете дать команду точки останова в GDB, как
br solver.cpp:225
и вы можете увидеть сообщение, как
Breakpoint 1 at 0x7f2cccf70397: file src/caffe/solver.cpp, line 226. (2 locations)
Когда вы даете continue
команды во втором окне GdB (которая держит программу), код python запускается снова. Конечно, вы должны дать ключевой ввод в первом окне gdb, чтобы оно продолжалось.
Теперь, по крайней мере, вы можете отлаживать код C++ во время работы программы python (вот что я хотел сделать)!
Позже я проверил, могу ли я работать с python и C++ в то же время, и он работает. Вы запускаете отладчик (DDD), например ddd -pydb prog1.py options..
, и присоединяете другой DDD, используя метод, описанный выше. Теперь вы можете установить точки останова для python и C++ и использовать другие функции отладки в каждом окне (хотелось бы, чтобы я знал это пару месяцев назад .. Это должно было помочь тоннам).
![enter image description here](https://i.stack.imgur.com/dSPHy.jpg)
EDIT: чтобы получить идентификатор процесса, вы можете сделать ps -aux | grep python
вместо этого. Этот pid является следующим из pd ddd.
Не совсем ответ, но может дать вам несколько идей: http://www.brendangregg.com/blog/2016-08-09/gdb-example-ncurses.html –