2016-08-11 3 views
16

Я могу отлаживать код Python с помощью ddd -pydb prog.py. Все аргументы командной строки python могут быть переданы также после prog.py. В моем случае многие классы были реализованы на C++, которые подвергаются воздействию python, используя boost-python. Хотелось бы, чтобы я мог отлаживать код Python и C++ вместе. Например, я хочу, чтобы установить точки останова, как это:Отладка Python и C++, подвергнутых сбору вместе

break my_python.py:123 
break my_cpp.cpp:456 
cont 

Конечно, я пытаюсь его после компиляции C++ коды с опцией отладки, но отладчик не пересекает границу наддува. Там в любом случае?

EDIT: Я видел 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, как в ссылке.

+0

Не совсем ответ, но может дать вам несколько идей: http://www.brendangregg.com/blog/2016-08-09/gdb-example-ncurses.html –

ответ

7

Я узнал, как отлаживать часть 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

EDIT: чтобы получить идентификатор процесса, вы можете сделать ps -aux | grep python вместо этого. Этот pid является следующим из pd ddd.

+0

pdb.set_trace(), вероятно, лучше способ заставить Python остановиться, но в конечном итоге они имеют тот же эффект. – AndyG

+0

@ AndyG ах, это тоже работает. Благодарю. –

2

У меня была аналогичная проблема, но мне не удалось найти решения в Chan's answer для работы (на MAC OS X 10.12.4). Вместо этого для меня работали.

  1. Написать сценарий python test.py, который импортирует и использует модуль boost.Python.
  2. запуска питона в отладчике

    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> 
    

Нет необходимости, чтобы получить ИДП и запустить отладчик из отдельного окна или устанавливать какие-либо точки останова.