标签: gdb-python

如何在Eclipse CDT中为C++ STL对象启用gdb漂亮打印?

我正试图在eclipse cdt中为STL对象添加漂亮的打印.我试着按照这里描述的步骤:

http://sourceware.org/gdb/wiki/STLSupport

我检查了python文件夹,但我似乎无法完成这个...

我创建了一个gdbinit并为我的调试配置选择,但每当我尝试开始调试时,我都会收到以下错误:

Error while executing Python code.
!STACK 0
java.lang.Exception: /home/lizardking/workspace/eu.sofia.kpi.cpp.x86.testapp/.gdbinit:6: Error in sourced command file:
Error while executing Python code.
        at org.eclipse.cdt.dsf.mi.service.command.AbstractMIControl$RxThread.processMIOutput(AbstractMIControl.java:824)
        at org.eclipse.cdt.dsf.mi.service.command.AbstractMIControl$RxThread.run(AbstractMIControl.java:662)
Run Code Online (Sandbox Code Playgroud)

如果我尝试在python shell中执行gdbinit的内容,我会收到此错误:

Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
import sys
sys.path.insert(0, '/home/Documents/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named libstdcxx.v6.printers
Run Code Online (Sandbox Code Playgroud)

似乎我没有这样的模块......我对Python没有任何线索所以我甚至不知道Python中的"模块"是什么....

有人可以帮我这个吗?能够看到真正的调试信息对我来说非常重要,或者对它来说非常重要.或者我甚至可以从控制台调试并从gdb获得不错的输出,因为如果我打印一个字符串,例如我得到无用的输出....

问候,亚历克斯

c++ eclipse gdb eclipse-cdt gdb-python

39
推荐指数
3
解决办法
4万
查看次数

如何编写gdb脚本(使用python)?示例添加断点,运行,我们遇到了什么断点?

我正在尝试用gdb创建一个小单元测试,用于由OpenOCD控制的嵌入式mcu (这使我可以通过gdb服务器控制我的目标).

所以我想用gdb的一些脚本来自动执行此操作.

我想为gdb写一些或多或少的脚本:

  1. 添加几个断点
  2. 启动该程序
  3. 当我们停止时,它停在哪里(获取帧信息)
  4. 放弃.

有任何想法吗?

关于如何在python gdb脚本中执行此操作的示例将是很好的.

谢谢约翰


注意:

假设我们有这个基本结构,或多或少进入test_failed()或test_success(),具体取决于函数start_test()返回的内容.

void test_failed() {    
    while(1);    
}

void test_success() {    
    while(1);    
}

int main(void) {    
    int status = start_test();    

    if( status > 0 ) {    
        test_failed();    
    }    
    test_success();

    while(1);    
}
Run Code Online (Sandbox Code Playgroud)

在gdb中手动执行此操作是非常紧张的,

(gdb) break test_success
Breakpoint 1 at 0x20: file src/main.c, line 9.
(gdb) break test_failed
Breakpoint 2 at 0x18: file src/main.c, line 5.
(gdb) cont
Continuing.

Breakpoint 1, test_success () at src/main.c:9
9       while(1);
(gdb) …
Run Code Online (Sandbox Code Playgroud)

scripting unit-testing gdb openocd gdb-python

13
推荐指数
2
解决办法
2万
查看次数

调试Cython时打印变量时出错

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

(gdb) cy print some_variable
Python Exception <type 'exceptions.AttributeError'> 'PyDictObjectPtr' object has no attribute 'items':
Error occurred in Python: 'PyDictObjectPtr' object has no attribute 'items'
Run Code Online (Sandbox Code Playgroud)

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

Python Exception <class 'gdb.error'> There is no member named ob_sval.:
Error occurred in Python command: There is no member named ob_sval.
Run Code Online (Sandbox Code Playgroud)

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

FROM debian

RUN apt-get update && apt-get upgrade -y && apt-get install -y \
  build-essential gdb-python2 python-dbg python-dev \
  python-pip python-numpy-dbg

RUN pip install cython pygments

CMD bash
Run Code Online (Sandbox Code Playgroud)

我在cython-users google …

python gdb cython gdb-python pdb

9
推荐指数
1
解决办法
202
查看次数

gdb.execute阻止python脚本中的所有线程

我用Python 2.7编写GDB脚本.

我只是踩着指示gdb.execute("stepi").如果调试的程序空闲并等待用户交互,gdb.execute("stepi")则不返回.如果出现这种情况,我想在不终止gdb的情况下停止调试会话.

为此,我创建了一个线程,如果当前指令运行超过x秒,它将终止调试过程:

from ctypes import c_ulonglong, c_bool
from os import kill
from threading import Thread
from time import sleep
import signal

# We need mutable primitives in order to update them in the thread
it = c_ulonglong(0) # Instructions counter
program_exited = c_bool(False)
t = Thread(target=check_for_idle, args=(pid,it,program_exited))
t.start()

while not program_exited.value:
    gdb.execute("si") # Step instruction
    it.value += 1

# Threaded function that will kill the loaded program if it's idling
def check_for_idle(pid, it, program_exited): …
Run Code Online (Sandbox Code Playgroud)

python multithreading gdb gdb-python

8
推荐指数
1
解决办法
215
查看次数

pdb有像gdb一样的布局src吗?

在 中gdb,我们可以使用它layout src来获得一个非常好的调试文本 UI。pdb(Python 调试器)有等效的东西吗?在 中pdb,我只能看到将要执行的下一行,这很烦人。

gdb text ui如下图所示:

gdb 文本-ui

python debugging gdb gdb-python pdb

7
推荐指数
1
解决办法
3584
查看次数

python-gdb 错误:Python 异常 &lt;class 'RuntimeError'&gt; 类型没有目标

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

在我的 .gdbinit 我有:

source ~/.config/gdb/libpython.py
Run Code Online (Sandbox Code Playgroud)

对于简单的过程,我可以毫无问题地使用py-list,py-bt等,但是我目前正在 py.test 下测试的程序为我提供了任何 python gdb helper 命令的错误:

(gdb) py-list
Python Exception <class 'RuntimeError'> Type does not have a target.:
Error occurred in Python command: Type does not have a target.
Run Code Online (Sandbox Code Playgroud)

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

更新

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

Traceback (most recent call last):
  File "<stdin>", line 1, in …
Run Code Online (Sandbox Code Playgroud)

python debugging gdb python-3.x gdb-python

7
推荐指数
1
解决办法
2068
查看次数

如何在 Python 中调试卡住的 asyncio 协程?

我的生产代码中有很多协程,它们在处理请求时卡在未知位置。我将带有Python 支持扩展的gdb 附加到进程,但它没有显示协程中进程卡住的确切行,只显示主要堆栈跟踪。这是一个最小的例子:

import asyncio

async def hello():
    await asyncio.sleep(30)
    print('hello world')

asyncio.run(hello())
Run Code Online (Sandbox Code Playgroud)
(gdb) py-bt
Traceback (most recent call first):
  File "/usr/lib/python3.8/selectors.py", line 468, in select
    fd_event_list = self._selector.poll(timeout, max_ev)
  File "/usr/lib/python3.8/asyncio/base_events.py", line 2335, in _run_once
  File "/usr/lib/python3.8/asyncio/base_events.py", line 826, in run_forever
    None, getaddr_func, host, port, family, type, proto, flags)
  File "/usr/lib/python3.8/asyncio/base_events.py", line 603, in run_until_complete
    self.run_forever()
  File "/usr/lib/python3.8/asyncio/runners.py", line 299, in run
  File "main.py", line 7, in <module>
Run Code Online (Sandbox Code Playgroud)

GDB 显示了在第 7 行结束的跟踪,但代码显然卡在第 4 行。如何使用嵌套协程使其显示更完整的跟踪?

python gdb python-3.x gdb-python python-asyncio

7
推荐指数
1
解决办法
308
查看次数

如何使用GDB在C级调试python脚本.给我一个简单的例子

如何使用GDB在C级调试python脚本.给我一个简单的例子.我的主要目标是从我的python脚本中获取libc函数的跟踪.

python debugging gdb python-2.7 gdb-python

6
推荐指数
1
解决办法
570
查看次数

GDB 漂亮打印:从 children() 的迭代器返回字符串,但显示为 char[]

我有一个方便的类,我使用它可以轻松地将一组“汇总器”函数添加到 GDB 漂亮的打印机(例如,一个Rect类可以有一个 [ Area] 字段,由 Python 计算)。然后它也打印所有现有的孩子,所以你可以一次看到所有的东西。

class SummaryAndFieldIterator:
    """
    Iterator to first go through a list of summariser functions,
    then display all the fields in the object in order
    """
    def __init__ (self, obj, summaries):
        self.count = 0
        self.obj = obj;
        self.summaries = summaries;
        self.keys = sorted(obj.type.iterkeys())

    def __iter__(self):
        return self

    def __next__(self):

        if (self.count >= len(self.keys) + len(self.summaries)):
            raise StopIteration
        elif self.count < len(self.summaries):

            name, retVal = self.summaries[self.count](self.obj)
            # FIXME: this doesn't seem to …
Run Code Online (Sandbox Code Playgroud)

python debugging gdb pretty-print gdb-python

5
推荐指数
1
解决办法
646
查看次数

在GDB Python脚本中,如果框架的语言为Ada,则数组索引编制将失败

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

我,在班上Stacks

tcb_t = gdb.lookup_type("TCB_t")
int_t = gdb.lookup_type("int")
Run Code Online (Sandbox Code Playgroud)

过去曾:

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

thread = atcb["common"]["thread"]
Run Code Online (Sandbox Code Playgroud)

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

tcb = thread.cast(Stacks.tcb_t.pointer()).dereference()
Run Code Online (Sandbox Code Playgroud)

找到堆栈的逻辑顶部

stk = tcb["pxStack"].cast(Stacks.int_t.pointer())
Run Code Online (Sandbox Code Playgroud)

现在,我需要在逻辑上向下循环堆栈,直到找到与初始化值不相等的条目为止,

free = 0
while stk[free] == 0xa5a5a5a5:
    free = free + 1
Run Code Online (Sandbox Code Playgroud)

如果当前帧的语言是工作正常c,但如果这是ada我得到的

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

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

我已经为此工作了

def invoke(self, arg, from_tty):
    gdb.execute("set language c")
    ...
    gdb.execute("set language auto")
Run Code Online (Sandbox Code Playgroud)

但是,如果不将语言重新设置为原来的语言,这似乎是错误的。

所以,

  • 有没有一种方法可以从Python中检测当前的GDB语言设置?
  • 是否有不依赖于当前GDB语言设置的替代索引方式?

ada freertos gdb-python

5
推荐指数
0
解决办法
78
查看次数