如何为qtcreator编写调试帮助程序? < >使用GDB使用GLM::VEC3类调试我的C++程序时,向量类的工作相当繁琐:

如何为qtcreator编写调试帮助程序? < >使用GDB使用GLM::VEC3类调试我的C++程序时,向量类的工作相当繁琐: ,c++,debugging,gdb,qt-creator,glm-math,C++,Debugging,Gdb,Qt Creator,Glm Math,我在中读到,可以编写调试帮助程序。 我已经设法让qtcreator加载该文件(如果我的python文件有语法错误,调试器会立即退出并出错) 如何编写简约调试助手 我已经尝试过的: 这是C++代码 #include <glm/glm.hpp> class Foo { }; int main(int, char**) { glm::vec3 vec3(42, 64, 256); Foo foo; (void)vec3; (void)foo; return 0;

我在中读到,可以编写调试帮助程序。
我已经设法让qtcreator加载该文件(如果我的python文件有语法错误,调试器会立即退出并出错)

如何编写简约调试助手

我已经尝试过的: 这是C++代码

#include <glm/glm.hpp>

class Foo
{
};

int main(int, char**)
{
  glm::vec3 vec3(42, 64, 256);
  Foo foo;

  (void)vec3;
  (void)foo;

  return 0;
}
vec3代码似乎没有任何明显的效果。对于foo来说,它似乎做了些什么,但不是打印
Yay,foo工作:)
,qtcreator只是显示
。请参见以下屏幕截图:

简短的回答:一个最起码的例子 下面是调试助手的一个最低示例:

C++代码:

class Foo
{
};

int main(int, char**)
{
  Foo foo;

  (void)foo;

  return 0;
}
#include <glm/glm.hpp>

int main(int, char**)
{
  glm::vec3 vec3(42, 64, 256);

  (void)vec3;

  return 0;
}
调试帮助程序:

from dumper import *

def qdump__Foo(d, value):
    d.putNumChild(0)
    d.putValue("Yay, Foo works :)")
from dumper import *

def qdump__glm__tvec3(d, value):
    d.putValue("[{0}, {1}, {2}]".format(value["x"], value["y"], value["z"]))
    d.putNumChild(3)
    if d.isExpanded():
        with Children(d):
            d.putSubItem("x", value["x"])
            d.putSubItem("y", value["y"])
            d.putSubItem("z", value["z"])
结果是:

解释 你把
put
putValue
搞混了。引自:

put(self,value)-直接附加到输出字符串的低级函数。这也是附加输出的最快方式

put
是一个低级函数,需要非常具体的格式化,因此可能不是最简单示例的最佳起点。
改用
putValue
,此函数可用于打印变量的值

glm::vec3的简短答案 下面是glm::vec3的工作示例:

C++代码:

class Foo
{
};

int main(int, char**)
{
  Foo foo;

  (void)foo;

  return 0;
}
#include <glm/glm.hpp>

int main(int, char**)
{
  glm::vec3 vec3(42, 64, 256);

  (void)vec3;

  return 0;
}
结果:

要匹配调试光线的第一个屏幕截图:

解释 vec3没有出现的原因是,
glm::vec3
不是类型,只是一个typedef。glm::tvec3是您要查找的类型:

typedef tvec3<float, highp>     highp_vec3;
// [...]
typedef highp_vec3          vec3;
typedef tvec3 highp\u vec3;
// [...]
typedef highp_vec3 vec3;
因此,通过将
def qdump\u glm\u vec3(d,value):
替换为
def qdump\u glm\u tvec3(d,value):
,gdb将能够找到您的函数

要访问成员本身,例如成员
x
,请使用
value[“x”]
。这样,您可以使用
d.putValue
获得令人满意的输出。

为了以可扩展的方式显示成员本身,我使用了。

更新2020

自glm 0.9.9.7(2020)起,typedef似乎发生了变化:

typedef-vec-vec3;
因此,调试帮助程序应更新为:

从转储程序导入*
#glm的调试助手::(b | i | u | d)vec[2-4]
def qdump__glm__vec(d,值):
dim=value.type.templateArgument(0)
d、 putNumChild(dim)
键=[“x”、“y”、“z”、“w”][0:dim]
d、 putValue(“[”+”,“.join([str(value[key].value())表示键入键])+“]”)
如果d.isExpanded():
有子女(d):
对于键入键:
d、 putSubItem(键,值[键])

这将产生与以前相同的结果。

如果您获得类似于
值(name='x',type=double,bsize=None,bpos=None,data=,address=0x1f59718)
,您可能需要使用
值['variable\u name'].Value()