首页 > 系统相关 >在Windows下,可以使用以下步骤来捕获程序崩溃的堆栈信息

在Windows下,可以使用以下步骤来捕获程序崩溃的堆栈信息

时间:2023-10-29 11:33:40浏览次数:36  
标签:Windows 捕获 stackFrame 信息 获取 context Offset 堆栈

在Windows下,Qt程序崩溃时,可以通过以下步骤捕获堆栈信息:

定义一个全局的异常处理函数,在该函数中获取并保存堆栈信息。可以使用Windows API函数SetUnhandledExceptionFilter来注册这个函数。

LONG WINAPI UnhandledExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo)

{

//在这里获取和保存堆栈信息 

//...

return EXCEPTION_EXECUTE_HANDLER;

}

int main(int argc, char *argv[])

{

SetUnhandledExceptionFilter(UnhandledExceptionFilter);

//...

}

在获取堆栈信息时,可以使用Windows API函数StackWalk64。但是这个函数的使用比较复杂,需要一些其他的辅助函数和数据结构。

为了简化获取堆栈信息的过程,可以使用一些第三方库,如DbgHelp库,这是微软提供的一个用于符号处理和堆栈回溯的库。

下面是一个使用DbgHelp库获取堆栈信息的例子:

#include

#include

#pragma comment(lib, "Dbghelp.lib")

LONG WINAPI UnhandledExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo)

{

HANDLE hProcess = GetCurrentProcess();

SymInitialize(hProcess, NULL, TRUE);

CONTEXT context = *(ExceptionInfo->ContextRecord); STACKFRAME64 stackFrame; memset(&stackFrame, 0, sizeof(stackFrame));

#ifdef _M_X64

DWORD machineType = IMAGE_FILE_MACHINE_AMD64;

stackFrame.AddrPC.Offset = context.Rip;

stackFrame.AddrFrame.Offset = context.Rbp;

stackFrame.AddrStack.Offset = context.Rsp;

#elif _M_IX86

DWORD machineType = IMAGE_FILE_MACHINE_I386;

stackFrame.AddrPC.Offset = context.Eip;

stackFrame.AddrFrame.Offset = context.Ebp;

stackFrame.AddrStack.Offset = context.Esp;

#endif

stackFrame.AddrPC.Mode = AddrModeFlat; stackFrame.AddrFrame.Mode = AddrModeFlat; stackFrame.AddrStack.Mode = AddrModeFlat; while (StackWalk64(machineType, hProcess, GetCurrentThread(), &stackFrame, &context, NULL, SymFunctionTableAccess64, SymGetModuleBase64, NULL)) { //在这里获取并保存堆栈信息 //... } SymCleanup(hProcess); return EXCEPTION_EXECUTE_HANDLER;

}

int main(int argc, char *argv[])

{

SetUnhandledExceptionFilter(UnhandledExceptionFilter);

//...

}

注意,此例子需要在项目中链接DbgHelp库,并且需要确保程序的符号信息没有被剥离,否则无法获取到正确的堆栈信息。

标签:Windows,捕获,stackFrame,信息,获取,context,Offset,堆栈
From: https://blog.51cto.com/u_12597366/8078780

相关文章

  • Windows与UOS虚拟机实现互相复制粘贴文本及文件
    往期文章:麒麟KYLINOS2303版本上使用KDE桌面共享软件hello,大家好啊,今天给大家带来一篇在VMwareworkstation17Pro上安装UOS虚拟机后实现互相复制粘贴文本及文件的文章,主要通过open-vm-tools-desktop软件实现,当我们安装完UOS1060虚拟机后,想要复制里面的内容到Windows上的时候,会发......
  • Win10 ssh客户端 scp 传输linux文件到windows 端
    1Window10安装openssh服务2启动windowssshd服务netstartsshd3scplinux向windows传输文件Win10中打开powershell,登录ssh把linux下的shell01.sh传到window10的桌面上[email protected]:/C:/Users/admin/Desktop......
  • 【nodejs】Windows环境 ffmpeg添加水印
    一、Windows下面获取到的字体路径需要做处理,否则无法执行路径中:改为\:路径中:\改为/不要使用中文的名称 原路径:D:\Users\670493228\Desktop\public\font\default.ttf  使用水印命令(-logleveldebug可以看到执行日志,方便定位问题)ffmpeg-i1.mp4-vf"draw......
  • 利用windows自带的winsat工具获得硬盘顺序读写速度
    源代码如下:packagetest;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.nio.charset.StandardCharsets;importjava.util.regex.Matcher;importjava.util.regex.Pattern;public......
  • Windows编译PDF库:libharu
    libharu编译需要libpng,libpng依赖zlib,所以需要下载这三个库libharu下载:http://libharu.org/libpng下载:http://www.libpng.org/pub/png/libpng.htmlzlib下载:https://www.zlib.net/ *:libpng我下载的版本是V1.6.40,对应的zlib版本需要在V1.0.4以上,我用的zlibV1.3参考链接:ht......
  • Windows 常用快捷键
    tab空两格ctrl+c复制ctrl+v粘贴ctrl+a全选ctrl+x剪切ctrl+z撤销ctrl+y反撤销短暂性删除:选中+delet长久性删除:选中+shift+deletwindoes+r运行windows+e我的电脑任务管理器:①桌面最下方点鼠标右键②ctrl+shift+escwindow+tab切换应用程序 ......
  • Windows 文件夹权限不足——夺权
    由于Windows有着大家都不怎么使用的多用户权限管理机制,有的时候在一些特殊文件夹无法使用默认权限进行操作,本文以安装在C:\ProgramData的Miniconda3为例。主要有两种方法:将文件夹所有者改为自己给自己添加完全控制权限TIPS操作文件夹时,如果文件夹中间有特殊字符或空格......
  • Qt之堆栈布局(QStackedLayout)
    一、QStackedLayout概述QStackedLayout是Qt中的一个布局管理器,用于管理多个子窗口或页面的堆叠显示。它允许你在一个固定区域内显示多个子窗口,但每次只显示其中一个子窗口,其他子窗口被堆叠在后面。与QStackedWidget类似,但QStackedLayout是一个布局管理器,可以与其他布局管......
  • 实用小脚本——Windows系统使用dos命令删除文件
    @echooff&color0aset/pff=输入文件名:title查找%ff%echo.&set/p=正在查找<nulfor%%iin(cdefgh)do(ifexist%%i:\ (cd/d%%i:\set/p=%%i:<nulfor/f "delims="%%jin('dir/b/a-d/s"%ff%"2^>nul')do(echo.&......
  • 在Windows和Linux终端下使用代理的方式
    背景在快乐上网的时候,网页会经过代理,但是有些在终端运行的程序不一定会经过代理,比如用gitclonegithub仓库的时候,或者curl下载githubrelease的时候,如果不走代理,下载可能会很慢很慢。Windows在执行gitclone前,在终端执行sethttps_proxy=localhost:7890sethttp_proxy=loca......