当前位置: 首页 > wzjs >正文

自己做网站 搜索功能开发教育培训机构网站

自己做网站 搜索功能开发,教育培训机构网站,node新闻网站开发的意义,建网站用什么服务器好目录 1.前言 2.PDB文件是什么? 3.Vs中生成PDB文件 4.使用回调函数生成Dump文件 5.WinDbg中动态调试生成Dump文件 6.任务管理器生成Dump文件 前言 之前的章节讲解了WinDbg和Dump文件的相关内容,本小节将针对Qt程序如何生成Dump文件进行讲解,当…

目录

        1.前言

        2.PDB文件是什么?

        3.Vs中生成PDB文件

        4.使用回调函数生成Dump文件

        5.WinDbg中动态调试生成Dump文件

        6.任务管理器生成Dump文件


前言

        之前的章节讲解了WinDbg和Dump文件的相关内容,本小节将针对Qt程序如何生成Dump文件进行讲解,当然C++程序也是如此,只是通过QT编写触发崩溃的界面。并且该小节还会讲解PDB文件是什么,在Vs中如何配置项目生成PDB文件


PDB文件是什么?

        PDB文件​​是 Windows 平台下由编译器生成的调试符号文件​​(也叫符号表文件),用于将二进制代码中的内存地址、机器指令与源代码中的变量名、函数名、行号等符号信息关联起来。每次生成的可执行文件都会产生一个对应的PDB文件。PDB文件包含程序的以下信息:

        1.符号表​:函数名、全局变量名、类名等

        2.源代码映射​:机器指令地址与源代码行号的对应关系

        3.类型信息​:数据结构的内存布局

        4.编译环境​:编译器版本、优化选项、代码生成参数

        每一个PDB文件都会对应生成的可执行文件,因为内部含有函数名,类名和参数等重要信息,所以一般不要泄漏PDB文件,并且每次生成的PDB文件都应该进行备份保留。在使用PDB文件之前你应该注意以下几点:

        1.Release模式下生成的PDB文件由于编译器优化,可能会导致函数和参数地址变换,影响调试
        2.PDB文件会因为程序的代码修改重新生成,每次执行的代码生成的PDB文件都会不一样
        3.PDB文件关联的程序名称要一致,如果修改了可执行程序的名称,可能会导致调试时链接不到PDB文件
        4.PDB文件生成的时间戳要和程序生成的时间戳一致

        PS:经验之谈....及时备份,崩溃时找不到PDB那该崩溃的是你了....


Vs中生成PDB文件

        在Vs中生成PDB文件只需要在项目属性中设置即可,具体如下:

图1.VS中设置生成PDB文件


Qt的PDB文件
        一般我们下载的QT源码都会含有对应PDB文件,如果在对应版本的编译器路径下的plugins文件没有找到PDB文件,那么我们可以在线下载。以下是下载链接:

Qt中PDB文件下载链接https://download.qt.io/online/qtsdkrepository/windows_x86/desktop/        例如博主的是Qt6.0.0版本,我需要下载一个MSVC的编译器符号表,并且是在Windows系统的64位环境下,那么对应的下载链接如下:
下载示例https://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt6_600/qt.qt6.600.win64_msvc2019_64/

        在进入到下载链接后,我们一般只需要下载后缀为.7z的文件即可,并且文件名称带qtbase的文件

图2.下载Qt中的PDB文件示例


使用回调函数生成Dump文件

        在Windows下,我们可以使用SetUnhandledExceptionFilter函数设置程序的异常回调,并且在激活的函数中使用MiniDumpWriteDump接口函数生成对应的dump文件,以下是生成Dump文件的代码,代码含有注释想清楚了解代码的可以通过注释或者文档查看。

        1.dump.h

#pragma once#include <windows.h>
extern LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo);

        2.dump.cpp

#include <stdio.h>
#include <windows.h>
#include <dbghelp.h>
#include <stdlib.h>#pragma comment(lib, "Dbghelp.lib")#include <DbgHelp.h>/*  生成MiniDump文件的核心函数
*   hFile:指定已有文件    pExceptionPointers:异常信息指针    pwAppName:应用程序名称
*/
int GenerateMiniDump(HANDLE hFile, PEXCEPTION_POINTERS pExceptionPointers, PWCHAR pwAppName)
{HANDLE hDumpFile = hFile;   //使用的文件BOOL bOwnDumpFile = FALSE;  //是否创建了文件MINIDUMP_EXCEPTION_INFORMATION ExpParam;    //异常信息结构typedef BOOL(WINAPI* MiniDumpWriteDumpT)(HANDLE,DWORD,HANDLE,MINIDUMP_TYPE,PMINIDUMP_EXCEPTION_INFORMATION,PMINIDUMP_USER_STREAM_INFORMATION,PMINIDUMP_CALLBACK_INFORMATION);MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL;HMODULE hDbgHelp = LoadLibrary("DbgHelp.dll");if (hDbgHelp) {pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");}if (pfnMiniDumpWriteDump){//创建新的转储文件if (hDumpFile == NULL || hDumpFile == INVALID_HANDLE_VALUE){TCHAR szFileName[MAX_PATH] = { 0 }; //文件名TCHAR dwBufferSize = MAX_PATH;      //缓冲区大小SYSTEMTIME stLocalTime;             //本地时间GetLocalTime(&stLocalTime);CreateDirectory(szFileName, NULL);//生成带时间戳和进程信息的文件名wsprintf(szFileName, "%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp","v1.0",stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond,GetCurrentProcessId(), GetCurrentThreadId());//创建转储文件hDumpFile = CreateFile(szFileName,GENERIC_READ | GENERIC_WRITE,       //读写权限FILE_SHARE_WRITE | FILE_SHARE_READ, //共享模式0,              //安全属性CREATE_ALWAYS,  //总是创建新文件0,              //文件属性0);             //模板文件bOwnDumpFile = TRUE;OutputDebugString(szFileName);}//写入转储文件if (hDumpFile != INVALID_HANDLE_VALUE){//设置异常信息ExpParam.ThreadId = GetCurrentThreadId();ExpParam.ExceptionPointers = pExceptionPointers;ExpParam.ClientPointers = FALSE;//调用dump生成函数pfnMiniDumpWriteDump(GetCurrentProcess(),	//当前进程GetCurrentProcessId(),					//进程IDhDumpFile,								//文件句柄MiniDumpWithDataSegs,					//转储类型(pExceptionPointers ? &ExpParam : NULL),//异常信息NULL,									//用户流信息NULL);									//回调信息if (bOwnDumpFile) {CloseHandle(hDumpFile);}}}//清理资源if (hDbgHelp != NULL) {FreeLibrary(hDbgHelp);}return EXCEPTION_EXECUTE_HANDLER;
}/*	顶层异常过滤器函数
*	lpExceptionInfo:异常信息指针
*/
LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo)
{//如果调试器存在,继续搜索异常处理程序if (IsDebuggerPresent()){return EXCEPTION_CONTINUE_SEARCH;}return GenerateMiniDump(NULL, lpExceptionInfo, PWCHAR("test"));
}

        3.main.cpp

#include "dump.h"  int main(int argc, char *argv[])
{::SetUnhandledExceptionFilter(ExceptionFilter);return 0;
}

        通过这种方式生成Dump文件会有一个缺点,就是当项目程序引入的模块过多或者使用的第三方库过多的时候,如果崩溃的原因是这些第三方库导致的,那么可能不能及时的捕获异常导致无法生成Dump文件,所以使用这种方式需要给每一个线程都挂载上异常回调函数。以下是链接是minidumpwritedump接口函数的在线文档
minidumpwritedump文档https://learn.microsoft.com/zh-cn/windows/win32/api/minidumpapiset/nf-minidumpapiset-minidumpwritedump        PS:下一章将会单独讲解Qt中的Dump文件生成的第三方库qBreakpad,以上代码也适用于Qt程序


WinDbg中动态调试生成Dump文件

        上一小节中提到的无法生成Dump文件的问题,我们可以使用WInDbg绑定进程,使用命令动态生成Dump文件,具体的命令如下:

.dump /m 文件路径.dmp    //生成最小转储文件示例:
.dump /m E:\dump\WildPointer.dmp

        具体的绑定过程如下,演示使用的是WinDbg Preview

        1.打开WinDbg Preview,选择文件

图3.WinDbg Preview中选择可执行文件

        2.选择可执行文件

图4.选择可执行文件

        3.点击GO开始执行可执行文件

图5.执行可执行文件

        4.输入.dump指令生成Dump文件

图6.动态生成Dump文件

        当我们使用WinDbg绑定进程运行程序时,可能会导致Qt程序的ICons不显示或者字符乱码,这些并不会影响具体的打包后的文件,放心使用。如果有捕获的异常信息显示乱码,在WinDbg中也会输出对应的正确编码信息
        PS:图6是用WinDbg10.0运行的,因为实在是调试不出输入框,WinDbg Preview中也有一样的输入框


任务管理器生成Dump文件

        在任务管理器中生成Dump文件的条件比较苛刻,只有当进程还没有被系统干掉的时候,在任务管理器中右键进程,创建转存储文件才可以,这种情况一般程序发生死锁等异常则可以使用,一般比较难等到自己手动生成Dump文件系统就将进程干掉了

        1.管理器中点击创建内存转储

图7.管理器中创建内存转储文件


Qt示例程序
        为了方便Qt开发工作者使用代码生成Dump文件,以下是博主调试程序的开源链接,大家可以在GitHub中下载下来进行调试,后续的WinDbg使用也会在这份程序的基础上讲解。
QT程序生成Dump文件https://github.com/3020Xmy/QtDumpTest

http://www.dtcms.com/wzjs/176272.html

相关文章:

  • 电子商务网站开发实训惠州seo外包服务
  • 视频网站为什么有人做google官网
  • 找人做的服务器1核2g网站打开速度蛮网络seo排名
  • 学做点心上哪个网站黄页88网官网
  • 专业的网站开发服务电脑培训学校网站
  • 哪些大网站是java做的seo企业站收录
  • 网站建设的关键问题torrentkitty磁力猫
  • 网站建设做好了怎样链接域名文案发布平台
  • 在制作网站前 不需要急于做的工作是企业培训课程设计
  • 烟台h5网站建设公司百度贴吧免费发布信息
  • 用户界面设计报告湖北短视频seo营销
  • 个人设计师的网站软文营销的成功案例
  • 深圳最新疫情出行政策上海专业排名优化公司
  • 十堰网站设计上海优化外包公司排名
  • 网站免费注册会员怎么做seo网站优化方案摘要
  • 建设网站的叫什么职位快推广app下载
  • wordpress换域名不换空间优化品牌seo关键词
  • 做网站吧china东莞seo
  • 做网站接电话一般要会什么问题9 1短视频安装
  • 网站建设类型报价表推广网站模板
  • 网站首页导航怎么做二级导航seo外链建设方法
  • 有了网站的域名下一步怎么做seo管家
  • 餐饮加盟网站建设南宁关键词排名公司
  • 山东做网站的公司厦门关键词排名推广
  • a站下载安装关键词诊断优化全部关键词
  • 济南网站设计建设怎么在百度做宣传广告
  • 网站开发 运维 招投标提高百度搜索排名
  • 响应式网站建设品牌全网天下郑州网络seo
  • 出国越南做网站8000保底广州网站设计实力乐云seo
  • 网站用词精准性百度关键词排行榜