当使用带有gdb的glm :: vec3类调试我的C ++程序时,使用这些向量类非常麻烦:
我已经阅读了手册,可以编写调试助手。
我设法让qtcreator加载文件(如果我的python文件语法错误,调试器将立即退出并出现错误)。
如何编写简约的调试助手?
这是C ++代码
#includeclass 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来说,它似乎可以做些什么,但是Yay, Foo works :)
qtcreator只是显示而不是打印
。请参见以下屏幕截图:
这是调试助手的最小示例:
C ++代码:
class Foo { }; int main(int, char**) { Foo foo; (void)foo; return 0; }
调试助手:
from dumper import * def qdump__Foo(d, value): d.putNumChild(0) d.putValue("Yay, Foo works :)")
结果:
你已经混了put
和putValue
。引用您提供的链接:
put(self,value) -直接添加到输出字符串的低级函数。这也是追加输出的最快方法。
put
是低级函数,需要非常特定的格式,因此对于最小示例而言,它可能不是最佳起点。
改为使用putValue
,此函数可用于打印变量的值。
这是glm :: vec3的工作示例:
C ++代码:
#includeint main(int, char**) { glm::vec3 vec3(42, 64, 256); (void)vec3; return 0; }
调试助手:
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"])
结果:
并匹配您的第一个屏幕截图以调试ray:
vec3没有显示的原因是,这glm::vec3
不是类型,而只是typedef。glm :: tvec3是您要寻找的类型:
typedef tvec3highp_vec3; // [...] typedef highp_vec3 vec3;
因此,通过替换def qdump__glm__vec3(d, value):
为def qdump__glm__tvec3(d, value):
,gdb将能够找到您的函数。
要访问成员本身(例如成员)x
,请使用value["x"]
。这样,您就可以使用d.putValue
令人愉悦的输出。
为了以可扩展的方式显示成员本身,我使用了您提供的链接中的示例。