问题标签 [gdb-python]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
349 浏览

python - 调试 Cython 时打印变量时出错

我正在尝试使用 gdb 调试一些 Cython 代码,这些代码包装了要从 Python 调用的 C++ 代码。我按照文档中的说明进行操作,但在调试时遇到了一些与我的代码无关的错误。例子:

我有时也会得到这个(通常在第一个之后):

为了调试代码,我使用 Docker 创建了一个环境:

我在 cython-users google 组中找到了两个相关的 帖子,但没有答案。

0 投票
1 回答
1535 浏览

python - pdb 是否具有像 gdb 这样的布局 src?

gdb中,我们可以使用layout src来获得一个相当不错的调试文本 UI。pdb(Python 调试器)是否有等价的东西?在pdb中,我只能看到将要执行的下一行,这很烦人。

gdb text ui如下图所示:

gdb 文本用户界面

0 投票
0 回答
164 浏览

ada - 在 GDB Python 脚本中,如果框架的语言是 Ada,则数组索引将失败

我有一个脚本来计算每个 FreeRTOS 任务中有多少可用堆栈空间。GDB 的语言设置为auto. 当前语言为 时脚本工作正常c,但当前语言为时失败ada

我在课堂Stacks上,

用于:

找到{Ada任务控制块}.Common.Thread,

转换为指向 FreeRTOS 任务控制块的指针,

找到堆栈的逻辑顶部

现在我需要在堆栈中进行逻辑循环,直到找到不等于初始化值的条目,

如果当前框架的语言是 ,则效果很好c,但如果是ada我得到

Python Exception <class 'gdb.error'> 不是数组或字符串:Python 命令中发生错误:不是数组或字符串

我已经将此追溯到表达式stk[free],它正在使用当前语言的规则进行解释(在 Ada 中,数组索引使用括号,所以它会是stk(free),这当然是非法的,因为 Python 将其视为函数调用)。

我已经解决了这个问题

但是不将语言设置回原来的样子似乎是错误的。

所以,

  • 有没有办法从 Python 检测当前的 GDB 语言设置?
  • 是否有另一种不依赖于当前 GDB 语言设置的索引方式?
0 投票
1 回答
2392 浏览

python - python-gdb 错误:Python 异常类型没有目标

我正在运行 python 3.6.6-debug(通过 pyenv 安装)并且我已经将关联的 libpython.py 从复制cpython/Tools/gdb/libpython.py~/.config/gdb(签出 v3.6.6 标记)。

在我的 .gdbinit 中,我有:

对于简单的过程,我可以毫无问题地使用py-list,等,但是我目前在 py.test 下测试的程序对于任何 python gdb 帮助器命令都会给我这个错误:py-bt

这个错误是什么意思,我该如何解决?

更新

我深入研究了 libpython.py 以确切了解py-list/py-bt做他们的事情,然后从 gdb 中手动运行相关的 gdb python 命令以重现问题并准确隔离 libpython.py 中问题发生的位置。在进行下面的调试后,我能够在 gdb 中获得更详细的回溯:

该问题在 libpython.py 第1158行触发,即

这澄清了一些事情:libpython.py 获取 PyUnicodeObject 的 Type 对象,然后尝试调用target它的方法,但是 PyUnicodeObject 的 Type 对象没有 target。根据gdb 文档

— 函数:Type.target()

返回一个新的 gdb.Type 对象,它表示该类型的目标类型。

对于指针类型,目标类型是指向对象的类型。对于数组类型(意思是类 C 数组),目标类型是数组元素的类型。对于函数或方法类型,目标类型是返回值的类型。对于复杂类型,目标类型是元素的类型。对于 typedef,目标类型是别名类型。

如果该类型没有目标,此方法将抛出异常。

这绝对看起来像一个错误,尽管我在其他任何在线、python 问题跟踪器或 python 提交历史中都找不到任何提及此问题的内容。我将在 python 跟踪器上打开一个问题,看看维护人员怎么说(除非有人之前遇到过这个问题并提交了答案)。

我是如何调试的

配置ptrace为允许在没有 sudo 的情况下进行调试

确定挂起(多处理)程序的父python进程

(我只是在上面猜对了,对我的程序使用任何正在运行的 python 进程的 pid 都可以)

附加到父进程

确定最近的python执行帧并切换到它

添加 python 源目录并用于tui enable获取一些上下文

gdb tui 截图

启动gdb的交互式python解释器,手动输入libpython行获取当前python脚本/行号

这重现了我用py-listand看到的异常py-bt,但这次我也得到了一个非常有用的回溯。

默认开启 gdb python 堆栈跟踪

set python print-stack full

毕竟,我偶然发现了上述选项的文档。设置默认打开堆栈跟踪打印并且可以避免进行所有手动调试的需要......所以事后看来我做了很多我不需要做的额外工作:)(虽然我确实学到了很多东西进行中)。

我现在已经将此添加到我的 gdbinit 中以备将来使用。

资源

0 投票
0 回答
133 浏览

c - 如何将通用链表中的数据类型传递给 GDB 打印命令?

我正在用 Python 为这个链表数据结构编写一个漂亮的 GDB 打印机:

数据字段是 void* 因为它是通用的,所以它会根据需要转换为适当的指针类型。下面是我漂亮的打印机,它可以很好地为某种类型(print_field_t)进行硬编码,但我正在寻找一种将所需类型作为参数传递给打印机的方法。据我所知,API 不支持此功能,但有没有办法实现此功能或等效功能?

0 投票
1 回答
88 浏览

gcc - 确定 C 结构是否已打包

我正在使用 gdb-python 提取和执行 C 结构布局。

我设法获取所有字段、偏移量、类型和大小。

尽管如此,当尝试重新生成结构的代码时,我没有任何迹象表明它是否标有 GCC 的attribute((__packed__)).

有没有办法从可执行文件中获取这些信息?(最好使用 gdb-python,但任何其他方式也可以)

0 投票
1 回答
246 浏览

c++ - 在 GDB 漂亮的打印机中显示特定的 std::vector 元素

假设我有一个简单的struct

我想为 GDB 编写一个漂亮的打印机,它会显示vec[index]类型为 的对象S

这就是我现在的做法:

有没有更简单的方法来访问给定的元素std::vector?是否可以调用operator[](在 GDB 中我可以做得到p s.vec[0]我想要的)?我希望我的打印机独立于std::vector.

0 投票
1 回答
150 浏览

c - 如何在 C 中将 gdb.TYPE_CODE_PTR 转换为 void *?

我可以从 gdb 的 Python 脚本调用 add() 而不会出现任何问题。但是,我在打电话时得到

如何print_root使用 gdb 变量调用root

根存在于 gdb 中:

0 投票
2 回答
506 浏览

gdb - 使用 GDB Python API 从符号名称中获取全局符号的地址

如果我通过 GDB Python API 知道全局符号的名称,有没有办法在我的二进制文件中获取全局符号的地址?

python print(gdb.parse_and_eval('symbol').address)获得这个值的正确方法是什么?

0 投票
1 回答
189 浏览

gdb - 为什么 GDB 不删除便利变量?

根据此处的文档,gdb 指出:

功能:gdb.set_convenience_variable (name, value)
[...] 如果 value 为 None,则移除便利变量。

但是当我执行

ashow conv在 gdb shell 中显示$foo = void. 预期的行为是 gdb 将完全删除该变量。在自定义命令中,我使用 uuids 作为 gdb 端的变量名来保存中间表达式结果(以避免名称冲突),因此保留这些变量并不理想。我在 gdb错误跟踪器中没有看到任何关于此的内容,并且通过代码它似乎没有实际删除便利变量的方法 - 只需将其设置为 void (此处)。