使用带gdb的glm :: vec3类调试我的C ++程序时,向量类很难处理:
我在manual中读过,可以编写调试助手 我设法让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;
}
这是我的调试助手:
from dumper import *
def qdump__glm__vec3(d, value):
d.put("Yay, vec3 works :)")
def qdump__Foo(d, value):
d.put("Yay, Foo works :)")
vec3代码似乎没有任何明显的效果。对于foo,它似乎做了一些事情,但qtcreator只显示Yay, Foo works :)
而不是打印<not accessible>
。请参阅以下屏幕截图:
答案 0 :(得分:4)
以下是调试助手的最低示例:
C ++代码:
class Foo
{
};
int main(int, char**)
{
Foo foo;
(void)foo;
return 0;
}
debug-helper:
from dumper import *
def qdump__Foo(d, value):
d.putNumChild(0)
d.putValue("Yay, Foo works :)")
结果:
你混淆了put
和putValue
。引用link you've provided:
put(self,value) - 低级函数直接附加到输出字符串。这也是追加输出的最快方式。
put
是一个低级函数,需要非常具体的格式化,因此可能不是最小示例的最佳起点。
改为使用putValue
,此函数可用于打印变量的值。
以下是glm :: vec3的工作示例:
C ++代码:
#include <glm/glm.hpp>
int main(int, char**)
{
glm::vec3 vec3(42, 64, 256);
(void)vec3;
return 0;
}
debug-helper:
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"])
vec3没有显示的原因是glm::vec3
不是类型,而只是typedef。 glm :: tvec3是您正在寻找的类型:
typedef tvec3<float, highp> highp_vec3;
// [...]
typedef highp_vec3 vec3;
因此,将def qdump__glm__vec3(d, value):
替换为def qdump__glm__tvec3(d, value):
,gdb将能够找到您的功能。
要访问成员本身,例如成员x
,请使用value["x"]
。这样,您可以使用d.putValue
获得令人满意的输出
为了以可扩展的方式显示成员本身,我使用了link you've provided中的示例。
答案 1 :(得分:1)
更新2020
从glm 0.9.9.7(2020)开始,typedef似乎已更改:
typedef vec<3, float, defaultp> vec3;
因此,调试助手应更新为:
from dumper import *
#debugging helper for glm::(b|i|u|d)?vec[2-4]
def qdump__glm__vec(d, value):
dim = value.type.templateArgument(0)
d.putNumChild(dim)
keys = ["x", "y", "z", "w"][0:dim]
d.putValue("[" + ", ".join([str(value[key].value()) for key in keys]) + "]")
if d.isExpanded():
with Children(d):
for key in keys:
d.putSubItem(key, value[key])
产生的结果与以前相同。