c++ - 如何为 qtcreator 编写调试助手?

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

当使用带有 gdb 的 glm::vec3 类调试我的 C++ 程序时, vector 类使用起来非常麻烦:
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,它似乎做了一些事情,但不是打印 Yay, Foo works :) , qtcreator 只显示 <not accessible> .请参见以下屏幕截图:

my progress so far

最佳答案

简短的回答:一个最小的例子

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

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。引用自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"])

结果:
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 中的示例.

关于c++ - 如何为 qtcreator 编写调试助手?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34354573/

相关文章:

c++ - array placement new 结合_aligned_malloc,删除的正确方法是什么?

c++ - 使用头文件和cpp文件在c++中解析字符串

c++ - 在 main() 之前崩溃

gdb - 让 GDB 显示完整的多行语句

c - GDB - 不显示调用命令的结果

c++ - 复制构造函数混淆

java - 在Eclipse中调试java应用程序时,如何配置它不关闭调试器打开的文件?

如果尚未调用方法,Python 会发出警告

debugging - 查看/拦截所有 emacs lisp 函数调用

c++ - 卡在跟踪 SIGFPE/算术异常