我正试图在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获得不错的输出,因为如果我打印一个字符串,例如我得到无用的输出....
问候,亚历克斯
我正在尝试用gdb创建一个小单元测试,用于由OpenOCD控制的嵌入式mcu (这使我可以通过gdb服务器控制我的目标).
所以我想用gdb的一些脚本来自动执行此操作.
我想为gdb写一些或多或少的脚本:
有任何想法吗?
关于如何在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) 我正在尝试使用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 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) 在 中gdb,我们可以使用它layout src来获得一个非常好的调试文本 UI。pdb(Python 调试器)有等效的东西吗?在 中pdb,我只能看到将要执行的下一行,这很烦人。
gdb text ui如下图所示:
我正在运行 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 支持扩展的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 行。如何使用嵌套协程使其显示更完整的跟踪?
如何使用GDB在C级调试python脚本.给我一个简单的例子.我的主要目标是从我的python脚本中获取libc函数的跟踪.
我有一个方便的类,我使用它可以轻松地将一组“汇总器”函数添加到 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) 我有一个脚本可以计算出每个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)
但是,如果不将语言重新设置为原来的语言,这似乎是错误的。
所以,
gdb-python ×10
gdb ×9
python ×7
debugging ×4
pdb ×2
python-3.x ×2
ada ×1
c++ ×1
cython ×1
eclipse ×1
eclipse-cdt ×1
freertos ×1
openocd ×1
pretty-print ×1
python-2.7 ×1
scripting ×1
unit-testing ×1