如何为qtcreator编写调试助手?

时间:2015-12-18 11:25:36

标签: c++ debugging gdb qt-creator glm-math

使用带gdb的glm :: vec3类调试我的C ++程序时,向量类很难处理:
screenshot of the debugger within qtcreator

我在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>。请参阅以下屏幕截图:

my progress so far

2 个答案:

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

结果:

enter image description here

说明

你混淆了putputValue。引用link you've provided

  

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;
}

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

结果:
The final debugging view of a glm::vec3

并匹配您的第一个屏幕截图以调试光线:
Debugging a ray is now more fun ;)

说明

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

产生的结果与以前相同。