资源简介
在用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控件
相关资源
- vtk QT做的三维地质可视化系统2of2
- Qt局域网聊天软件
- Qt Creator opengl实现四元数鼠标控制轨迹
- QT局域网聊天系统(基于QT5.修改过)
- qt-电子点菜系统
- C 餐厅叫号系统(QT平)
- QT 实现文件下载
- qt图像处理
- QT,JPEG解码源代码(已完成)
- Qt 播放音频文件
- Qt 读取16进制的data文件
- MQTT+串口(usart)透传
- 易语言QQTEA算法源码
- VC工程转Qt工程文件的工具
- MQTT推送Demo
- 基于Linux、QT的视频监控系统的设计与
- Qt 百度地图 定位
- QT酷炫界面开发指南《QmlBook》
- ida pro for mac 破解版 含解决打开就显示
- Ubuntu下操作Excel,qt代码
- Qt图片浏览器 --基于Qt的Graphics View f
- qtnribbon2破解
- Qt软件开发 完整项目代码
- MQTT_3.1protocol_Specific中文版
- 在QT中使用RTP进行视频的采集和传输
- Mini6410 Qt4和Qtopia编程开发指南
- Qt实现Code39条形码
- qt_ffmpeg_mp4_export_and_import.zip
- QT5.5入门与项目实战
- Huffman Compress 霍夫曼编码 压缩 解压缩
评论
共有 条评论