QT C++ C:\Windows\SYSTEM32\ntdll.dll错误异常

12 篇文章 0 订阅
5 篇文章 0 订阅

项目用Qt Creator 4.0.3+QT 5.6.3 MINGW windows下编写。

项目中使用多线程操作SqlServer数据库,编写完毕后本地测试验证无异常,发给客户使用。

客户处有多台工控机运行本软件,但是其中一台不定时的出现C:\Windows\SYSTEM32\ntdll.dll错误,表现就是运行过程中突然界面卡死,然后白屏崩溃。

研发本地进行多天的操作复现,没有复现出问题。

1、排查是否是ntdll库版本等问题(×)

2、排查是不是ntdll需要重新注册(×)

3、排查是否是ntdll关联库出现问题(×)

4、排查是否ntdll某些服务被杀毒软件杀掉(×)

5、排查是否是网络不稳定,导致使用的数据库连接出现问题(×)

6、排查是否是多台设备同时操作数据库出现问题(×)

7、排查是否存在数据越界、野指针等问题,拍完后无发现(×)

8、然后用heob排查是否是内存泄漏,排完也没出现内存泄漏问题(×)

就差管微软要ntdll源码来定位了!!!!!

最最最最后梳理数据库操作逻辑,发现有一处在批量修改数据库参数时,某一特定情况下会去重置数据库连接状态,正在操作中突然进行断开重连,有可能导致出现ntdll.dll异常,由于是业务逻辑导致的数据库操作问题,捕获的异常信息就是ntdll操作(理想状态是能定位到代码块,然而现实是抛出的库错误)(√)。

解决方案:修改这个不符合逻辑的操作,解决问题。

结论:

这个ntdll问题,在我本地完全没有复现出来,结合本地环境和生产环境,本地的设备配置甩生产环境N条街,生产环境可能是在设备某一时刻处理能力较差时,触发到了这个荒谬的逻辑导致界面卡死崩溃,归根结底也是在业务逻辑中没有处理好操作顺序(实际是很小很短的一串代码,没有引起关注)。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
可以使用Windows API函数GetFileVersionInfoSize和GetFileVersionInfo来获取指定DLL文件的版本信息,然后从中获取操作系统版本信息。 以下是一个示例代码,可以获取K:\WINDOWS\SYSTEM32\NTDLL.DLL文件的版本信息和操作系统版本信息: ```c++ #include <iostream> #include <windows.h> #pragma comment(lib, "Version.lib") // 需要链接Version库 int main() { // 获取NTDLL.DLL的文件版本信息大小 DWORD dwHandle; DWORD dwSize = GetFileVersionInfoSize("K:\\WINDOWS\\SYSTEM32\\NTDLL.DLL", &dwHandle); if (dwSize == 0) { std::cout << "GetFileVersionInfoSize failed." << std::endl; return -1; } // 获取NTDLL.DLL的文件版本信息 std::vector<char> buffer(dwSize); if (!GetFileVersionInfo("K:\\WINDOWS\\SYSTEM32\\NTDLL.DLL", dwHandle, dwSize, buffer.data())) { std::cout << "GetFileVersionInfo failed." << std::endl; return -1; } // 获取操作系统版本信息 VS_FIXEDFILEINFO* pFixedFileInfo = nullptr; UINT dwLen = 0; VerQueryValue(buffer.data(), "\\", (LPVOID*)&pFixedFileInfo, &dwLen); if (pFixedFileInfo == nullptr) { std::cout << "VerQueryValue failed." << std::endl; return -1; } // 输出操作系统版本信息 std::cout << "Operating System Version: " << ((pFixedFileInfo->dwProductVersionMS >> 16) & 0xffff) << "." << (pFixedFileInfo->dwProductVersionMS & 0xffff) << "." << ((pFixedFileInfo->dwProductVersionLS >> 16) & 0xffff) << "." << (pFixedFileInfo->dwProductVersionLS & 0xffff) << std::endl; return 0; } ``` 需要注意的是,需要确保程序运行时有足够的权限访问指定的DLL文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值