Win11下Qt+PCL+OpenCV程序调试时MSCTF.dll断言失败求助
解决Win11下Qt Creator调试时MSCTF.dll断言失败问题
环境配置
- MSVC v142
- Win10 SDK(10.0.19041.0)
- PCL 1.12.1
- OpenCV 4.8.0
- Qt 5.15.2
问题现象
调试模式下运行程序时触发报错:
clientcore\windows\advcore\ctf\uim\tim.cpp(800)\MSCTF.dll!00007FFA625262B9:
(caller: 00007FFA62526EEC) LogHr(1) tid(267c) 8007029C
An assertion failure has occurred.
最小复现代码
头文件 minimal.h
#ifndef MINIMAL_H #define MINIMAL_H #include <QMainWindow> #include <pcl/io/pcd_io.h> #include <opencv2/opencv.hpp> QT_BEGIN_NAMESPACE namespace Ui { class Minimal; } QT_END_NAMESPACE class Minimal : public QMainWindow { Q_OBJECT public: Minimal(QWidget *parent = nullptr); ~Minimal(); private: bool readPcd(const QString &file, pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud); bool readImage(const QString &file, cv::Mat &image); Ui::Minimal *ui; }; #endif // MINIMAL_H
源文件 minimal.cpp
#include "minimal.h" #include "./ui_minimal.h" #include <QDebug> Minimal::Minimal(QWidget *parent) : QMainWindow(parent), ui(new Ui::Minimal) { ui->setupUi(this); pcl::PointCloud<pcl::PointXYZ>::Ptr cloud; readPcd("..\\example_data\\20210209152054.pcd", cloud); qDebug() << "cloud size is " << cloud->points.size(); cv::Mat image; readImage("..\\example_data\\20210209152054.jpg", image); qDebug() << "image size is " << image.cols << " x " << image.rows; } Minimal::~Minimal() { delete ui; } bool Minimal::readPcd(const QString &file, pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud) { cloud.reset(new pcl::PointCloud<pcl::PointXYZ>); if(pcl::io::loadPCDFile(file.toStdString(), *cloud) == -1) { std::cout << "read pcd file error " << std::endl; return false; } return true; } bool Minimal::readImage(const QString &file, cv::Mat &image) { image = cv::imread(file.toStdString()); return (!image.empty()); }
main.cpp
#include "minimal.h" #include <QApplication> #include <QLocale> #include <QTranslator> int main(int argc, char *argv[]) { QApplication a(argc, argv); QTranslator translator; const QStringList uiLanguages = QLocale::system().uiLanguages(); for (const QString &locale : uiLanguages) { const QString baseName = "Minimal_" + QLocale(locale).name(); if (translator.load(":/i18n/" + baseName)) { a.installTranslator(&translator); break; } } Minimal w; w.show(); return a.exec(); }
解决方案
该报错来自系统组件MSCTF.dll(文本服务框架),属于Win11调试环境与旧版Win10 SDK的兼容性问题,和业务代码逻辑无关,可通过以下方式解决:
禁用终端运行模式
进入项目的Run Settings,取消勾选Run in terminal,让程序使用Qt内置输出窗口替代系统控制台。调试器忽略断言错误
打开Tools > Options > Debugger > CDB,在Additional startup commands中添加:sxe -c "gn" 8007029C这条命令会让调试器忽略该特定错误码的断言,不中断程序执行。
升级Win10 SDK版本
尝试将Win10 SDK升级到10.0.22000.0及以上版本,新版SDK对Win11的兼容性更好,可修复底层框架的断言问题。切换Release模式验证
该断言仅在Debug模式下触发,Release模式通常不会出现此问题,可先切换模式确认程序功能正常。
内容的提问来源于stack exchange,提问作者user16138748
相关产品推荐
相关产品推荐

