- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尝试编写 GDB 的 Python 扩展,它能够漂亮地打印以下 C++ 类:
class Vector {
double* myElements;
unsigned int length;
}
pretty-print 输出应该在哪里,例如。 {0.1, 0.2, 0.3}
其中数组 myElements
的长度为 length
。
在 gdb 中,我可以简单地执行 *myVec.myElements@myVec.length
但是我想创建 Python pretty-print ,它做同样的事情。
我目前的尝试如下所示:
class VectorPrinter:
def __init__(self, val):
self.val = val
def to_string(self):
length = self.val['length']
elmts = self.val['myElements']
result = []
for i in range(0, length):
result.append(elmts[i])
return str(result)
class FailPrinter:
def __init__(self, val):
self.val = val
def to_string(self):
return "Value: " + str(self.val.type)
def lookup_type(val):
if(str(val.type) == 'Vector'):
return VectorPrinter(val)
return FailPrinter(val)
gdb.pretty_printers.append(lookup_type)
然而这只是输出:
$1 = [<gdb.Value object at 0x000000000367d470>, <gdb.Value object at 0x000000000367d4b0>, ...,
<gdb.Value object at 0x000000000367d8f0>, <gdb.Value object at 0x000000000367d930>]
最佳答案
当你的类型是某种“某种数组”时,最好保持 to_string
方法简单(不处理元素)并且 一个 children
方法返回一个检索元素的生成器,以及一个 display_hint
方法。此 display_hint
方法必须返回字符串“array”以指示 gdb 应使用 children
方法获取元素。
to_string
方法可以很简单,只需返回一个简单的字符串,例如“vector”,但我发现包含 vector 的大小很有用。
我已经为你的类(class)创建了以下 pretty-print
class VectorPrinter:
def __init__(self, val):
self.val = val
self.length = int(val['length'])
self.mem = self.val['myElements']
def to_string(self):
return f"Vector with {self.length} elements"
def next_element(self):
for i in range(self.length):
yield str(i), (self.mem + i).dereference()
def children(self):
return self.next_element()
def display_hint(self):
return "array"
请注意 next_element
方法实际上是一个生成器,因为它使用 yield
而不是 return。
但是,当我尝试使用这个 pretty-print 时,每个元素都被打印为 Value: double,
。问题是因为 FailPrinter
。您注册 pretty-print 的方式意味着除了 Vector 类之外,其他所有内容 都是使用 FailPrinter
打印的,包括每个单独的元素。你并不真的需要(或想要)一台“失败”的打印机。
因此,只需使用我提供的类并将其注册到
def lookup_type(val):
if(str(val.type) == 'Vector'):
return VectorPrinter(val)
gdb.pretty_printers.append(lookup_type)
让我们看看这台 pretty-print 是如何工作的。考虑下面的 main.cpp 文件
class Vector {
public:
double* myElements;
unsigned int length;
public:
Vector(unsigned int length) : length(length) {
myElements = new double[length];
for (unsigned int i = 0; i < length; i++) {
myElements[i] = i;
}
}
~Vector() {
delete[] myElements;
}
};
int main(int argc, char *argv[])
{
Vector v(10);
return 0;
}
如果我们在 gdb 中打印 v
,我们会得到
注意:如果您有兴趣,我在 armadillo 中为 vector 、矩阵和立方体类创建了一些 pretty-print 库以及 std::complex
。这些 pretty-print 可用here .查看代码可能会帮助您创建其他 pretty-print 。
关于python - 包含双数组的 GDB pretty-print 自定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58612140/
我正在尝试使用内联汇编进行试验,我正在尝试在内联汇编中添加十进制数(不,不是整数)。问题是,当我调用以下函数时: inline double ADD(double num1, double num2)
我有一个名为“a”的数据类型为 double 的数字,当这个数字小于 0.5 时,说b = 1 - a没有错误。但是当 a > 0.5 时,我说b = 1 - a代码中的该点存在错误(执行该特定行之前
我需要将双数添加到 ol 列表中。一个例子是: 欢迎访客1.1.介绍1.2.更多信息1.3.更多信息1.4.更多信息1.5.更多信息 另一个OL2.1.更多信息2.2.更多信息2.3.更多信息 我知道
我正在尝试将一些代码从 C++ 转换为 JavaScript,但我对 int、doubles、NaN 和解析 float 感到非常困惑。我想!? Z = T - 14 - (1); while (Z
我是一名优秀的程序员,十分优秀!