资源简介
在用qt编写程序时经常会遇到崩溃问题,如果抓取不到crash堆栈信息就会对崩溃问题束手无策,只能对其进行复现,推断。
该程序展示如何获取crash堆栈信息
代码片段和文件信息
#include “ccrashstack.h“
#include
#include
//
// ccrashstack.cpp
//
//
// Created by Lan huaiyu on 9/27/13.
// Copyright 2013 CCrashStack. All rights reserved.
//
CCrashStack::CCrashStack(PEXCEPTION_POINTERS pException)
{
m_pException = pException;
}
QString CCrashStack::GetModuleByRetAddr(PBYTE Ret_Addr PBYTE & Module_Addr)
{
MODULEENTRY32 M = {sizeof(M)};
HANDLE hSnapshot;
wchar_t Module_Name[MAX_PATH] = {0};
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE 0);
if ((hSnapshot != INVALID_HANDLE_VALUE) &&
Module32First(hSnapshot &M))
{
do
{
if (DWORD(Ret_Addr - M.modbaseAddr) < M.modbaseSize)
{
lstrcpyn(Module_Name M.szExePath MAX_PATH);
Module_Addr = M.modbaseAddr;
break;
}
} while (Module32Next(hSnapshot &M));
}
CloseHandle(hSnapshot);
QString sRet = QString::fromWCharArray(Module_Name);
return sRet;
}
QString CCrashStack::GetCallStack(PEXCEPTION_POINTERS pException)
{
PBYTE Module_Addr_1;
char bufer[256]={0};
QString sRet;
typedef struct STACK
{
STACK * Ebp;
PBYTE Ret_Addr;
DWORD Param[0];
} STACK * PSTACK;
STACK Stack = {0 0};
PSTACK Ebp;
if (pException) //fake frame for exception address
{
Stack.Ebp = (PSTACK)pException->ContextRecord->Ebp;
Stack.Ret_Addr = (PBYTE)pException->ExceptionRecord->ExceptionAddress;
Ebp = &Stack;
}
else
{
Ebp = (PSTACK)&pException - 1; //frame addr of Get_Call_Stack()
// Skip frame of Get_Call_Stack().
if (!IsBadReadPtr(Ebp sizeof(PSTACK)))
Ebp = Ebp->Ebp; //caller ebp
}
// Break trace on wrong stack frame.
for (; !IsBadReadPtr(Ebp sizeof(PSTACK)) && !IsBadCodePtr(FARPROC(Ebp->Ret_Addr));
Ebp = Ebp->Ebp)
{
// If module with Ebp->Ret_Addr found.
memset(bufer0 sizeof(0));
sprintf(bufer “\n%08X “ (unsigned int)Ebp->Ret_Addr);
sRet.append(bufer);
QString moduleName = this->GetModuleByRetAddr(Ebp->Ret_Addr Module_Addr_1) ;
if (moduleName.length() > 0)
{
sRet.append(moduleName);
}
}
return sRet;
} //Get_Call_Stack
QString CCrashStack::GetVersionStr()
{
OSVERSIONINFOEX V = {sizeof(OSVERSIONINFOEX)}; //EX for NT 5.0 and later
if (!GetVersionEx((POSVERSIONINFO)&V))
{
ZeroMemory(&V sizeof(V));
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 6604 2013-09-30 11:27 TestCrash\ccrashstack.cpp
文件 593 2013-09-30 11:26 TestCrash\ccrashstack.h
文件 301 2013-09-30 11:16 TestCrash\dialog.cpp
文件 332 2013-09-30 10:33 TestCrash\dialog.h
文件 738 2013-09-30 10:32 TestCrash\dialog.ui
文件 943 2013-09-30 11:01 TestCrash\main.cpp
文件 465 2013-09-30 10:53 TestCrash\TestCrash.pro
文件 23496 2013-09-30 11:25 TestCrash\TestCrash.pro.user
目录 0 2013-09-30 10:28 TestCrash
----------- --------- ---------- ----- ----
33472 9
- 上一篇:物联网信息安全
- 下一篇:QT下实现类似QQ聊天窗口tab控件
相关资源
- QT下实现类似QQ聊天窗口tab控件
- QT一个简单通讯录
- qt Qpushbutton圆按钮加图片代码
- qt股票系统
- QT编写的RTSP播放器各QT版本可完整编译
- qt 界面跳转 界面跳转 界面跳转
- QT仪表盘(项目实战)
- QT中利用QCustomPlot类画曲线图
- QT 自助点餐系统
- Qt实现托盘全部常用功能
- Qt实现仿qq右下角浮动弹窗
- QTP11.5原版以及中文版本地址.xlsx
- Qt 获取Cookie
- SerialPort.zip
- MQTT MQTTnet 实现
- QT5应用视频教程
- Qt实现多功能计算器
- Qt 自定义Model和自定义Delegate
- tiny4412 + qtopia + v4l2 + usb camera
- QT类似QQ截图工具
- qt界面样式风格
- QT 二维数组成图
- 实时录音与播放的内存实现 Qt代码
- Qt实现的转灰度图源代码
- QT网络调试助手
- qt各种页面切换动画实现
- QVTKWidgetPlugin.dll
- Qt中QLabel单击事件响应
- qt贪吃蛇游戏源码
- Qt写的天气预报
评论
共有 条评论