在使用带有 gdb 的 glm::vec3 类调试我的 C++ 程序时,使用 vector 类非常麻烦:
我在 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,它似乎做了一些事情,但不是打印
Yay, Foo works :)
, qtcreator 只是显示 <not accessible>
。请参阅以下屏幕截图:最佳答案
简短的回答:一个最小的例子
这是调试助手的最小示例:
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
。引用 link you've provided :put
是一个低级函数,需要非常具体的格式,因此可能不是最小示例的最佳起点。改用
putValue
,此函数可用于打印变量的值。glm::vec3 的简短回答
这是 glm::vec3 的工作示例:
C++代码:
#include <glm/glm.hpp>
int 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"])
结果:
并匹配您用于调试光线的第一个屏幕截图:
解释
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 中的示例。
关于c++ - 如何为 qtcreator 编写调试助手?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34354573/