Ответ 1
Я узнал, как отлаживать часть С++ во время запуска python. (понял это, читая об обнаружении идентификатора процесса в книге Python..).
Сначала вы запускаете программу python, которая включает в себя программы на С++. В начале программы python используйте raw_input(), чтобы программа ожидала ввода данных. Но перед этим сделайте print os.getpid()
(конечно, вы должны импортировать пакет os). Когда вы запустите программу python, она напечатает pid программы python, в которой вы работаете, и будет ждать ввода вашей клавиатуры.
код остановки 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
Или вы можете использовать import pdb, pdb.set_trace() в качестве комментария ниже (спасибо @AndyG) и посмотреть EDIT *, чтобы получить pid с помощью ps -aux
.
Теперь предположим, что общая библиотека С++ - это _caffe.so(это мой случай. Эта библиотека _caffe.so имеет все коды С++ и повышает функции оболочки 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, чтобы он продолжался.
Теперь, по крайней мере, вы можете отлаживать код С++ во время работы программы python (это то, что я хотел сделать)!
Я позже проверил, могу ли я одновременно выполнять отладку python и С++, и это работает. Вы запускаете отладчик (DDD), например ddd -pydb prog1.py options..
, и присоединяете другое DDD, используя метод, описанный выше. Теперь вы можете установить точки останова для python и С++ и использовать другие функции отладки в каждом окне (хотелось бы, чтобы я знал это пару месяцев назад.. Это должно было помочь тоннам).
EDIT: чтобы получить pid, вы можете сделать ps -aux | grep python
. Этот pid является следующим из ddd pid.