QT 自定义处理调试信息

QT 自定义处理调试信息,第1张

在QT中,我们经常使用 qDebug() 、 qInfo() 等来打印调试的信息,但是当打印信息过多时,很不利于查找阅读。所以本文介绍使用 QtMessageHandler 类中的 qInstallMessageHandler() 来自定义处理调试信息。

一、在主线程中注册调试信息处理回调

这里的 outputMessage 即为自定义的触发函数,当程序有调试信息时,将会调用此函数

二、实现触发函数

说明:此函数需要接受三个参数

QtMsgType type :表示调试信息类型,包括 QtDebugMsg (调试消息)、 QtInfoMsg (信息消息)、 QtWarningMsg (警告消息和可恢复的错误)、 QtCriticalMsg (关键错误和系统错误)、 QtFatalMsg (致命错误)

const QMessageLogContext &context :表示有关日志消息的其他信息,比如文件名 context.file 、行号 context.line 等等。

const QString &msg :表示原始的调试信息。

这样,我们就可以根据调试信息类型,自定义处理调试信息,并打印到日志文件等等。

但是有时候,我们会有这样的需求,有些类型如神的信息需要打印到屏幕,而有些类型的信息需要打印渣顷亏到日志。当注册了调试信息处理的回调,如何分类去处理呢?

查看QT文档中对于 qInstallMessageHandler() 的描述,可以知道该函数返回一个指向上一个消息处理程序,可以理解为上一个消息处理函数的指针。因此在使用 qInstallMessageHandler() 注册回调时,可以保存函数的返回,从而用之前的处理程序来处理调试信息

例如:

使用 s_messageHandler 来保存函数的返回值,即指向了上一个消息处理函数。在 outputMessage() 函数中使用 s_messageHandler

这样就实现了将Info等信息打印到日志,而debug信息打印到屏幕。

注: 以上写入日乎乱志文件的写法,并不是线程安全的,需要加锁来保证线程安全,这里就不再赘述。

正常的运行程序,日志内容如下:

实际项目中遇到了编译出的Release版本,日志输出没有文件信息、行数的问题。如下:

解决方法:

在.pro文件中添加宏

一定要先删除掉之前编译的中间文件,重新qmake!这样就可以在Release版本中正确输出日志信息。

在Qt调试过程中,如果需要手动给一个list赋值,可以按照以下步骤进行 *** 作:

1. 在代码中定义一个list,例如:QList<int>myList

2. 在需要赋值的地方,使用append()函数向list中添加元素,例如:myList.append(1)myList.append(2)myList.append(3)

3. 如果需要在list的指定位置插入元素,可以使用insert()函数,例如:myList.insert(1, 4)/慧前/ 在第二个位置插入元素源孝4

4. 如果需要修改list中某个元素的值,可以使用下标 *** 作符[],例如:myList[0] = 0// 将第一个元素的值修改为0

5. 如果需要删除list中某个元素,可以使用removeAt()函数,例如:myList.removeAt(1)// 删除第二个元素

6. 如雹碧稿果需要清空list中所有元素,可以使用clear()函数,例如:myList.clear()

需要注意的是,如果在调试过程中手动赋值,可能会影响程序的运行结果,因此建议在调试完成后将手动赋值的代码删除或注释掉。

在Qt中调试std::string无法访问的问题,可能是由于Qt Creator的GDB调试器没有正确解析std::string类型的原因。可以通过以下方法解决:

在编译时添加-g选项以生成调试信息。例如,在.pro文件中添加以下内容:

plaintext

Copy code

QMAKE_CXXFLAGS += -g

在Qt Creator中设置GDB的调试器命令为gdb -i=mi。可以察哗在菜单栏中选择“工具”->“选项”->“调试器”中的“GDB”选项卡,将“调试器命令”设置为gdb -i=mi。稿没雹

在Qt Creator中添加std::string类型的显示支持。可以在菜单栏中选择“工具”->“选项”->“调试器”中的“GDB”选项卡,将“额外的GDB命令”设置为以下内容:

plaintext

Copy code

python from dumper import registerregister(std.string)

如果仍然无法访问std::string类型,可以在Qt Creator中添加自定义类型支持。可以在菜单栏中选择“工具”->“选项”->“调试器”中的“自定义类型”选项卡,点击“添加”按钮,输入类型名称和类型解析脚本,例如:

类型名称:std::string

类型解析脚本:

plaintext

Copy code

python import gdbclass QStringPrinter: def __init__(self, value): self.val = value def to_string(self): return self.val['std::basic_string<char, std::char_traits<char>, std::allocator<char>>::_M_dataplus']['_M_p'].string(encoding='utf-8', errors='replace') def display_hint(self): return 'string' def qstring_lookup(): return { 'std::basic_string<char, std::char_traits<char>, std::allocator<char>键帆 >': QStringPrinter } gdb.pretty_printers.append(qstring_lookup)

注意事项:

如果使用的是其他调试器,如LLDB,需要根据调试器的特点进行相应的设置。

如果仍然无法访问std::string类型,可以尝试使用其他类型,如QString。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12446292.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存