如何为 qtcreator 编写调试助手?
How to write a debugging helper for qtcreator?
当使用 glm::vec3 class 和 gdb 调试我的 C++ 程序时,向量 classes 使用起来非常麻烦:
我在 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(self, value) - Low level function to directly append to the output string. That is also the fastest way to append output.
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.
中的示例
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])
这会产生与之前相同的结果。
当使用 glm::vec3 class 和 gdb 调试我的 C++ 程序时,向量 classes 使用起来非常麻烦:
我在 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(self, value) - Low level function to directly append to the output string. That is also the fastest way to append output.
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.
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])
这会产生与之前相同的结果。