问题标签 [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.
python - GDB 漂亮打印机:当父结构知道大小时打印一个数组
我在 C++ 中有一个类似这样的结构:
这些是框架的一部分,还有其他几个成员、助手等,但这些是重要的部分。我想在 Python GDB 漂亮打印机中显示这个,如下所示:
到目前为止,我未能让 HeapBlock 显示为一个单独的孩子。我已经成功地滥用了一个迭代器来产生:
这是通过从's方法db["size"]
返回的迭代器返回第一个结果,然后从下一个结果返回来完成的。DataBlockPrinter
children()
db["hb"]["data"]
size
我也尝试为 使用单独的打印机HeapBlocks
,但问题是 aHeapBlock
不知道它有多大:它存储在父级 ( DataBlock
) 中,因此HeapBlock
打印机也不知道何时停止迭代。
当它作为这里的一部分打印时,是否可以将size
字段发送到漂亮的打印机?HeapBlock
DataBlock
python - GDB 漂亮打印:从 children() 的迭代器返回字符串,但显示为 char[]
我有一个方便的类,我可以使用它轻松地将一组“summariser”函数添加到 GDB 漂亮的打印机(例如,一个Rect
类可以有一个 [ Area
] 字段,由 Python 计算)。然后它也会打印所有现有的孩子,所以你可以一次看到所有东西。
这对于返回数值的汇总器非常有效,但对于字符串,它最终显示为一个数组,所以我得到
这大概是因为来自的字符串
gdb.Value
当它由SummaryAndFieldIterator
's__next__
方法返回时,不会生成足够“字符串”的对象。调整的display_hint()
方法MyObjectPrinter
似乎没有任何效果(但我怀疑它会,因为这是孩子,而不是对象)。
任何人都知道如何从children()
迭代器返回字符串并将其显示为字符串?
python - GDB Python解析重载方法
如何使用 python 接口在 GDB 中查找重载方法?
我有一个类,它有几个名为“el”的方法,其中一个需要两个int
s。GDB 在断点处停止,_Dr
在下级进程的作用域中调用了一个成员变量。我这样做是为了得到一个 Pythongdb.Value
对象,它表示_Dr
:
现在我想获取el(int,int)
方法:
我如何告诉它解决重载的参数类型?
我试过这个:
和这个:
和这个:
这样做的正确方法是什么?
python - perl like Data::Dumper 替代 gdb
gdb 中是否存在类似 Data::Dumper 的东西?如何漂亮地打印复杂的 C 结构,例如,如果我有一个数组数组,哪些元素是一些结构?我读过关于用 python 编写 gdb 脚本但不知道它是否可以做到这一点?
python - 调试 C 程序时如何将 gdb 值转换为 python 数字对象
我在调试 C 程序时使用 python2.6 的 gdb 模块,并希望根据实例的“.Type”将 gdb.Value 实例转换为 python 数字对象(变量)。
例如,通过 将我的 C 程序SomeStruct->some_float_val = 1./6;
转换为 Python gdb.Value sfv=gdb.parse_and_eval('SomeStruct->some_double_val')
,但然后将其转换为双精度浮点 Python 变量——知道str(sfv.type.strip_typedefs())=='double'
它的大小为 8B——而不只是使用字符串转换,dbl=float(str(sfv))
而是Value.string()
像解包字节struct
用于获取正确的双精度值。
从我的搜索点返回的每个链接https://sourceware.org/gdb/onlinedocs/gdb/Values-From-Inferior.html#Values-From-Inferior,但我看不到如何将 Value 实例转换为 python变量干净,说 Value 甚至不在 C 内存中,而是表示 gdb.Value.address (所以不能使用Inferior.read_memory()
),如何在不转换字符串值的情况下将其转换为 Python int ?
python - 如何将参数传递给从命令行启动的 python gdb 脚本
我想将一些命令行参数传递给通过gdb
命令运行的 python 脚本,但是在 python 中导入 gdb 模块会从 sys.config 中删除 argv 属性。如何在示例中显示的 python 脚本中访问 arg1 和 arg2?
命令行执行:
一个.py:
引发的错误:
版本:
- GNU gdb (GDB) 7.2
- Python 2.6.6
编辑:
我要调试的最终目标是一个已经在运行的 C 可执行文件,所以我稍后会在脚本中附加它,所以gdb -x a.py --args python -arg1 -arg2
也不正确,因为该python
部分会打印一个 gdb 错误:Reading symbols from /usr/bin/python...(no debugging symbols found)...done.
...
multithreading - 使用多线程 python 扩展调试多线程程序时 GDB 挂起
我正在尝试开发一个 GDB python 扩展,它定义了一个启动新线程的命令,用户可以在其中检查任意类型的变量。我的 python 扩展的骨架是这样的:
可以看出,我在这里定义了一个绘图命令。当我尝试调试以下程序时,如果我出现以下情况,GDB 将挂起:
- 在procedure() 线程内的任意位置放置一个断点(例如,第9 行,在while 循环内)。
- 在 gdb 命中断点后运行命令plot 。
- 之后继续运行。
最奇怪的是,如果我将此代码更改为在不启动线程的情况下调用procedure(),GDB 永远不会挂起(并且占位符消息仍按我的预期打印)。
到目前为止,我已经尝试使用 GDB 版本 7.5.1 和 7.10 运行此过程,但我总是遇到相同的行为。
我究竟做错了什么?GDB不支持守护线程吗?这似乎不符合文档第 23.2.2.1 节的建议:GDB 可能不是线程安全的,但我认为在启动这样一个愚蠢的守护线程后它不应该挂起。
gdb - gdb Python API:异常消失?
有谁知道为什么在某些地方,gdb 中的 Python 代码不能正确处理异常?或者,为了澄清,异常消息可能会发送到 *gud 缓冲区以外的其他地方。gdb 没有像预期的那样将控制权返回给提示符。
(我在 Emacs (24.5.1) gud 模式下使用 GNU gdb (GDB) 7.11.50.20160212-git)
例如:
当处理“SomeEvent”时,它只会执行“__call__”直到错误的代码,返回,然后继续正常操作(如我所见)。
我在其他“回调”类型方法中注意到了这种行为,例如子类 gdb.Breakpoint 的 Stop()。
python - gdb python模块找不到它自己的任何功能
我从源代码编译并安装了 gdb(7.1.1) CC=gcc-6 ./configure --with-python=python3 && make
then sudo make install
。然后我像往常一样从 bash 调用 gdb。但是当我尝试通过做在gdb中加载我的python脚本时source asdf.py
,它抛出了一个错误说
AttributeError: 'module' object has no attribute 'execute'
我试图更改我的代码以尝试 gdb 模块中的更多功能,但我尝试执行的每个功能看起来都好像丢失了。我在 gdb 中调用了 python 解释器然后做了import gdb
然后dir(gdb)
查看 gdb 的内容,输出是
['__doc__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
所以确实有一个名为 gdb 的模块,但它的内容是空的。安装过程中可能出了什么问题?或者这是gdb中的一个错误?我怎样才能解决这个问题?
python-2.7 - 如何在 gdb-python 中退出 python 脚本?
我正在 GDB(v7.5.1-0.7.29) 中编写一个 python(v2.7) 脚本。当某些条件为假时,我想退出 python 脚本。但我不想退出 GDB。我尝试使用 sys.exit()、exit() 和 quit(),但在这种情况下,它们也会退出 GDB。有什么方法可以退出 python 脚本而不是 gdb。就像 ctrl + c 命令一样,但我希望仅在某个条件为假时才发生这种情况。