草庐IT

python - 一起调试boost暴露的Python和C++

coder 2023-05-26 原文

我可以使用 ddd -pydb prog.py 调试 Python 代码。所有 python 命令行参数也可以在 prog.py 之后传递。在我的例子中,许多类已经用 C++ 实现,它们使用 boost-python 暴露给 python。我希望我可以一起调试 python 代码和 C++。例如我想设置这样的断点:

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

当然,我在使用调试选项编译 c++ 代码后尝试它,但调试器不会越过 boost 边界。有什么办法吗?

编辑: 我看到了 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 进行可视化调试,但我不知道如何在 DDD 中给出“target exec python”命令。如果不是(仅使用链接中的 gdb),我应该能够调试 Python 脚本,而不是像链接中那样以交互方式提供 python 命令。

最佳答案

我发现了如何在运行 python 时调试 C++ 部分。 (在阅读Python书籍中的进程ID检测时意识到这一点..)。
首先,您运行包含 C++ 程序的 python 程序。在 python 程序开始时,使用 raw_input() 让程序等待你输入。但在此之前执行 print os.getpid() (当然你应该已经导入了 os 包)。当你运行 python 程序时,它会打印你正在运行的 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

或者,您可以使用 import pdb, pdb.set_trace() 作为下面的注释。(感谢@AndyG)并查看 EDIT* 以使用 ps -aux 获取 pid。

现在,假设 C++ 共享库是 _caffe.so(这是我的情况。这个 _caffe.so 库包含所有 C++ 代码和 boost python 包装函数)。 27352 是 pid。然后在另一个 shell 中像

一样启动 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)

当您在第二个 gdb 窗口(保存程序)中发出 continue 命令时,python 代码将再次运行。当然,您应该在第一个 gdb 窗口中输入一个键以使其继续。
现在至少您可以在运行 python 程序的同时调试 C++ 代码(这就是我想要做的)!

我后来检查了我是否可以同时进行 python 和 C++ 调试并且它可以工作。您像 ddd -pydb prog1.py options.. 一样启动调试器(DDD)并使用上述方法附加另一个 DDD。现在您可以为 python 和 C++ 设置断点,并在每个窗口中使用其他调试功能(我希望几个月前我就知道这一点。它应该有帮助。)。

编辑:要获取 pid,您可以执行 ps -aux | grep python 代替。这个 pid 是 ddd 的下一个 pid。

关于python - 一起调试boost暴露的Python和C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38898459/

有关python - 一起调试boost暴露的Python和C++的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  5. ruby-on-rails - 无法让 rspec、spork 和调试器正常运行 - 2

    GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'

  6. ruby - JetBrains RubyMine 3.2.4 调试器不工作 - 2

    使用Ruby1.9.2运行IDE提示说需要gemruby​​-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall

  7. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  8. ruby-on-rails - 如何调试 cucumber 测试? - 2

    我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element

  9. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  10. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

随机推荐