如何为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()