如何为qtcreator编写调试助手?

Ran*_*zen 2 c++ debugging gdb qt-creator glm-math

当使用带有gdb的glm :: vec3类调试我的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;
}
Run Code Online (Sandbox Code Playgroud)

这是我的调试助手:

from dumper import *

def qdump__glm__vec3(d, value):
    d.put("Yay, vec3 works :)")

def qdump__Foo(d, value):
    d.put("Yay, Foo works :)")
Run Code Online (Sandbox Code Playgroud)

vec3代码似乎没有任何可见的效果。对于foo来说,它似乎可以做些什么,但是Yay, Foo works :)qtcreator只是显示而不是打印<not accessible>。请参见以下屏幕截图:

到目前为止我的进步

Ran*_*zen 5

简短的答案:最小示例

这是调试助手的最小示例:

C ++代码:

class Foo
{
};

int main(int, char**)
{
  Foo foo;

  (void)foo;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

调试助手:

from dumper import *

def qdump__Foo(d, value):
    d.putNumChild(0)
    d.putValue("Yay, Foo works :)")
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明

说明

你已经混了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;
}
Run Code Online (Sandbox Code Playgroud)

调试助手:

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"])
Run Code Online (Sandbox Code Playgroud)

结果:
glm :: vec3的最终调试视图

并匹配您的第一个屏幕截图以调试ray:
现在调试光线更加有趣;)

说明

vec3没有显示的原因是,这glm::vec3不是类型,而只是typedef。glm :: tvec3是您要寻找的类型:

typedef tvec3<float, highp>     highp_vec3;
// [...]
typedef highp_vec3          vec3;
Run Code Online (Sandbox Code Playgroud)

因此,通过替换def qdump__glm__vec3(d, value):def qdump__glm__tvec3(d, value):,gdb将能够找到您的函数。

要访问成员本身(例如成员)x,请使用value["x"]。这样,您就可以使用d.putValue令人愉悦的输出。
为了以可扩展的方式显示成员本身,我使用了您提供链接中的示例。