Отладка 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). Вместо этого у меня сработало следующее.

  1. Написать скрипт на Python test.py который импортирует и использует модуль boost.Python.
  2. запустить 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 и запускать отладчик из отдельного окна или устанавливать какие-либо точки останова.

Другие вопросы по тегам