Отладка Python и C++ вместе с надстройкой
Я могу отлаживать код Python, используя ddd -pydb prog.py
, Все аргументы командной строки Python могут быть переданы тоже после prog.py
, В моем случае, многие классы были реализованы в C++, которые подвергаются воздействию Python, используя boost-python
, Я хотел бы отладить код Python и C++ вместе. Например, я хочу установить точки останова следующим образом:
break my_python.py:123
break my_cpp.cpp:456
cont
Конечно, я пробую это после компиляции кодов C++ с опцией отладки, но отладчик не пересекает границу форсирования. Там в любом случае?
РЕДАКТИРОВАТЬ: я видел http://www.boost.org/doc/libs/1_61_0/libs/python/doc/html/faq/how_do_i_debug_my_python_extensi.html. Я следовал за этим, и я могу делать отладку как для Python, так и для C++. Но я предпочтительно хочу сделать визуальную отладку с DDD
но я не знаю, как дать команду 'target exec python' внутри DDD
, Если нет (просто с помощью gdb
как в ссылке) Я должен быть в состоянии отладить для сценария Python, не давая интерактивные команды Python, как в ссылке.
2 ответа
Я узнал, как отлаживать часть C++ при запуске Python. (осознал это, читая об обнаружении идентификатора процесса в книге Python..).
Сначала вы запускаете программу на python, которая включает в себя программы на C++. В начале программы на python используйте raw_input(), чтобы заставить программу ждать вашего ввода. Но как раз перед этим делаю print os.getpid()
(конечно, вы должны были импортировать пакет ОС). Когда вы запустите программу 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
,
Теперь предположим, что разделяемой библиотекой C++ является _caffe.so (это мой случай. Эта библиотека _caffe.so содержит все коды C++ и улучшенные функции оболочки Python). 27352 это пид. Затем в другой оболочке запустить GDB, как
gdb caffe-fast-rcnn/python/caffe/_caffe.so 27352
или если вы хотите использовать графическую отладку, используя как DDD, сделайте
ddd caffe-fast-rcnn/python/caffe/_caffe.so 27352
Затем вы увидите, как запускается GDB, и ждите с подсказкой. Программа python прерывается gdb и ждет в режиме остановки (она ждала ввода с вашего ключа, но теперь она действительно находится в режиме остановки, и ей требуется команда 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++ и использовать другие функции отладки в каждом окне (хотелось бы, чтобы я знал об этом пару месяцев назад. Это должно было бы помочь.).
РЕДАКТИРОВАТЬ: чтобы получить pid, вы можете сделать ps -aux | grep python
вместо. Этот pid - следующий из pdd ddd.
У меня была похожая проблема, но я не смог найти решения в ответе Чана на работу (в MAC OS X 10.12.4). Вместо этого у меня сработало следующее.
- Написать скрипт на Python
test.py
который импортирует и использует модуль boost.Python. запустить python в отладчике
lldb python3 test.py
дающий
> 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>
Нет необходимости получать pid и запускать отладчик из отдельного окна или устанавливать какие-либо точки останова.