如何为Qt Creator编写调试助手?

3
当我使用glm::vec3类和gdb调试我的C++程序时,向量类非常难以处理:
qtcreator中调试器的截图 我在手册中读到,可以编写调试助手。
我已经成功让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 :)”。请参见以下截屏:

my progress so far

2个回答

9

简短回答:最小示例

以下是一个调试助手的最小示例:

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 :)")

结果:

enter image description here

解释

您混淆了 putputValue。引用来自您提供的链接

put(self, value) - 用于直接附加到输出字符串的低级函数。这也是追加输出的最快方法。

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"])

结果:
glm::vec3的最终调试视图 为了匹配您第一个调试射线的截图:
现在调试射线更有趣了 ;) 解释:
原因是,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输出令人愉悦的结果。
为了以可展开的方式显示成员本身,我使用了您提供的链接中的示例。

1
如果你得到了类似于 Value(name='x',type=double,bsize=None,bpos=None,data=,address=0x1f59718) 这样的东西,你可能想使用 value['variable_name'].value() - KungPhoo

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])

这将产生与之前相同的结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接