当前位置:  开发笔记 > 编程语言 > 正文

如何为qtcreator编写调试助手?

如何解决《如何为qtcreator编写调试助手?》经验,为你挑选了1个好方法。

当使用带有gdb的glm :: vec3类调试我的C ++程序时,使用这些向量类非常麻烦:

我已经阅读了手册,可以编写调试助手。
我设法让qtcreator加载文件(如果我的python文件语法错误,调试器将立即退出并出现错误)。

如何编写简约的调试助手?

我已经尝试过的:

这是C ++代码

#include 

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只是显示而不是打印。请参见以下屏幕截图:



1> Random Citiz..:
简短的答案:最小示例

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

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

结果:

说明

你已经混了putputValue。引用您提供的链接:

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

put是低级函数,需要非常特定的格式,因此对于最小示例而言,它可能不是最佳起点。
改为使用putValue,此函数可用于打印变量的值。

glm :: vec3的简短答案

这是glm :: vec3的工作示例:

C ++代码:

#include 

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

结果:

并匹配您的第一个屏幕截图以调试ray:

说明

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

typedef tvec3     highp_vec3;
// [...]
typedef highp_vec3          vec3;

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

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

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有