当前位置: 首页 > 知识库问答 >
问题:

如何在调试python C扩展时设置断点和执行其他gdb命令

沈俊晤
2023-03-14

我尝试使用gdb调试python C扩展。 特别是按照这个步骤,我运行gdb-ex r-args bash python mycode.py。 然而,在运行此代码时,我无法控制调试。 在gdb内部,执行并完成python代码。 我想设置一个断点,并在里面执行一些nextstepprint命令。 你知道怎么做吗?

共有1个答案

邹宣
2023-03-14

假设你有一个非常基本的代码。 示例如下:

https://github.com/mkowsiak/cython_hello_world

设置好所有内容后:

> virtualenv venv
> source venv/bin/activate
> pip install Cython
> python setup.py build_ext --inplace
> python ./script.py

您将能够像这样运行代码:

> python ./script.py
str: Hello world

它将从本机代码调用您的函数

#include <stdio.h>

void f(char *str) {
      printf("str: %s\n", str);
}

你现在要做的就是打电话:

> gdb -ex r --args python script.py
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-100.el7
Copyright (C) 2013 Free Software Foundation, Inc.
...
...
(gdb) break f
Breakpoint 1 at 0x2aaab22ade80: file /usr/include/bits/stdio2.h, line 104.
(gdb) run
Starting program: .../cython_hello_world/venv/bin/python script.py
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".

Breakpoint 1, f (str=0x2aaaaabd9924 "Hello world") at hello.c:5
5         printf("str: %s\n", str);
(gdb)

而你就在那里。 您可以查看整个堆栈跟踪。 如您所见,位于顶部的是您的c函数。

(gdb) bt
#0  f (str=0x2aaaaabd9924 "Hello world") at hello.c:5
#1  0x00002aaab22adeed in __pyx_f_12hello_caller_hello_world (__pyx_skip_dispatch=0, __pyx_v_str=<optimized out>) at hello_caller.c:1050
#2  __pyx_pf_12hello_caller_hello_world (__pyx_self=<optimized out>, __pyx_v_str=<optimized out>) at hello_caller.c:1094
#3  __pyx_pw_12hello_caller_1hello_world (__pyx_self=<optimized out>, __pyx_v_str=0x2aaaaabd9900) at hello_caller.c:1078
#4  0x00002aaaaadb3b22 in PyEval_EvalFrameEx () from /lib64/libpython2.7.so.1.0
#5  0x00002aaaaadb5efd in PyEval_EvalCodeEx () from /lib64/libpython2.7.so.1.0
#6  0x00002aaaaadb6002 in PyEval_EvalCode () from /lib64/libpython2.7.so.1.0
#7  0x00002aaaaadcf43f in run_mod () from /lib64/libpython2.7.so.1.0
#8  0x00002aaaaadd05fe in PyRun_FileExFlags () from /lib64/libpython2.7.so.1.0
#9  0x00002aaaaadd1889 in PyRun_SimpleFileExFlags () from /lib64/libpython2.7.so.1.0
#10 0x00002aaaaade2a3f in Py_Main () from /lib64/libpython2.7.so.1.0
#11 0x00002aaaab9e1c05 in __libc_start_main () from /lib64/libc.so.6
#12 0x000000000040071e in _start ()
 类似资料:
  • 是的,gdb确实支持这两个命令,虽然我没有想到它们有什么特别的用处。 也许,当你启动gdb之后,发现需要切换工作目录,但又不想退出gdb的时候: (gdb) pwd Working directory /home/xmj. (gdb) cd tmp Working directory /home/xmj/tmp. 详情参见 gdb手册

  • 你可以不离开gdb,直接执行shell命令,比如: (gdb) shell ls 或 (gdb) !ls 这里,"!"和命令之间不需要有空格(即,有也成)。 特别是当你在构建环境(build目录)下调试程序的时候,可以直接运行make: (gdb) make CFLAGS="-g -O0" 详情参见 gdb手册

  • 问题内容: 有时,当我检查我未编写的代码时,会以调试模式启动eclipse并使用数字来理解程序。例如,如果它们是从数据库中检索到的n个项目,那么知道服务中有n个已处理的项目等会很有趣。 当使用循环时,事情会变得更加复杂:如果我们处于“ while”循环中,则执行次数未定义,并且如果有替代方法,则执行流程可能会发生很大变化。 为此,我有时会在一部分代码中设置一个断点,并计算我们到达断点的次数。 当然

  • 如果项目在调试模式下运行,是否有办法有条件地禁用分叉: 然后在我的构建中:

  • 使用断点来暂停JavaScript代码,审查变量的值和在特定时刻所调用的堆栈。 一旦你设置了断点,你应该学习如何遍历你的代码,并审查你的变量和调用堆栈。 TL;DR 设置断点的最基本的方法是在特定的代码行上手动添加一个断点。您也可以将这些断点配置为仅在满足特定条件时触发。 您还可以设置在满足一般条件时触发的断点,例如事件,DOM更改或未捕获异常。 在代码特定行上设置断点 当您知道要审查的语句时,在

  • 本文向大家介绍pycharm在调试python时执行其他语句的方法,包括了pycharm在调试python时执行其他语句的方法的使用技巧和注意事项,需要的朋友参考一下 以前一直习惯用matlab,断点调试时可以进行各种操作。在这一点上python的便利性远不如matlab。不过pycharm这个软件却可以调试python,并且可以在中断的时候执行其他语句。我百度到的一些教程都是说让改下配置。但在我

  • 问题内容: 我已经在exit和_exit和我的程序(多线程应用程序,在linux 2.6.16.46-0.12 sles10上运行)上设置了断点,但仍以某种我无法找到的方式退出 退出函数驻留在libc中,因此没有延迟的负载共享库问题。有人知道其他无法捕获的神秘触发吗? 编辑:问题现在仅是学术性的。我尝试了二进制搜索调试,撤消了部分更改(问题消失了)。再次按顺序应用它们之后,即使恢复到原始状态,我也

  • 我有一个eclipse插件,创建了一个新的扩展点,所有设置都显示在链接中:http://www.vogella.com/tutorials/EclipseExtensionPoint/article.html 现在使用这个扩展点创建了一个带有扩展的新插件,也显示在上面的链接中。现在,当我在调试环境中运行它时,一切正常,但当我将这两个插件从Eclipse导出到插件jar文件,并将其用于我的应用程序时