VS调试方法总结(二)

2023-05-16

通过结构化异常定位崩溃程序

程序崩溃时,生成文本文件,记录崩溃得堆栈信息

直接上代码

已经编译通过,拷贝直接可用

.h


#include <Windows.h>
#include <stdarg.h>
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>

#pragma once
#ifdef _WIN32
class CExceptionHandler
{
public:
	static LONG WINAPI CleanExceptionFun(struct _EXCEPTION_POINTERS* pei);

private:
	static void GetCurModulePath(TCHAR* ptcPath, int iLen, LPVOID addr);

	//static void EI2Str(TCHAR* ptcInfo,int iInfoLen,ULONG_PTR* Info,int iCount);
	static void EI2Str(char* ptcInfo, int iInfoLen, ULONG_PTR* Info, int iCount);

	static void TcharToChar(const TCHAR * tchar, char * _char);

	static void CharToTchar(const char * _char, TCHAR * tchar);
};
#else
#endif

.cpp

#include "stdafx.h"
#include "exceptionhandler.h"

#ifdef _WIN32
#include <DbgHelp.h>
#pragma comment(lib, "Dbghelp.lib")

#pragma warning(disable:4313)

void CExceptionHandler::GetCurModulePath(TCHAR* ptcPath, int iLen, LPVOID addr)
{
	MEMORY_BASIC_INFORMATION mbi = { 0 };
	if (FALSE == ::VirtualQuery(addr, &mbi, sizeof(mbi)))
		return;
	UINT_PTR h_module = (UINT_PTR)mbi.AllocationBase;
	::GetModuleFileName((HMODULE)h_module, ptcPath, iLen);
	return;
}

void CExceptionHandler::EI2Str(char* ptcInfo, int iInfoLen, ULONG_PTR* Info, int iCount)
{
	int        i = 0;
	char*    p1 = ptcInfo;

	for (i = 0; i < iCount; i++)
	{
		sprintf(p1, "%08X ", Info[i]);
		p1 += 9;
	}
}

void CExceptionHandler::TcharToChar(const TCHAR * tchar, char * _char)
{
	int iLength;
	iLength = WideCharToMultiByte(CP_ACP, 0, tchar, -1, NULL, 0, NULL, NULL);
	WideCharToMultiByte(CP_ACP, 0, tchar, -1, _char, iLength, NULL, NULL);
}


void CExceptionHandler::CharToTchar(const char * _char, TCHAR * tchar)
{
	int iLength;
	iLength = MultiByteToWideChar(CP_ACP, 0, _char, strlen(_char) + 1, NULL, 0);
	MultiByteToWideChar(CP_ACP, 0, _char, strlen(_char) + 1, tchar, iLength);
}


LONG WINAPI CExceptionHandler::CleanExceptionFun(struct _EXCEPTION_POINTERS* pei)
{
	STACKFRAME    sf;
	CONTEXT        context;
	TCHAR        tcPath[2048] = { 0 };
	TCHAR        tcInfo[10240] = { 0 };
	TCHAR        tcExcep[20480] = { 0 };
	GetCurModulePath(tcPath, 2048, pei->ExceptionRecord->ExceptionAddress);

	char szExcep[20480] = {};
	char szInfo[10240] = {};
	char szPath[2048] = {};
	//TcharToChar(tcInfo, szInfo);
	TcharToChar(tcPath, szPath);
	EI2Str(szInfo, 10240, pei->ExceptionRecord->ExceptionInformation, pei->ExceptionRecord->NumberParameters);

	sprintf(szExcep, "threadid: %u code: 0x%08X flag:0x%08X param:%d %s \nmoudle:%s \nstack:\n",
		GetCurrentThread(),
		pei->ExceptionRecord->ExceptionAddress,
		pei->ExceptionRecord->ExceptionFlags,
		pei->ExceptionRecord->ExceptionAddress,
		pei->ExceptionRecord->NumberParameters, szInfo, szPath);



	memset(tcInfo, 0, sizeof(tcInfo));
	memset(&sf, 0, sizeof(STACKFRAME));
	memcpy(&context, pei->ContextRecord, sizeof(CONTEXT));

	sf.AddrPC.Offset = context.Eip;
	sf.AddrPC.Mode = AddrModeFlat;
	sf.AddrStack.Offset = context.Esp;
	sf.AddrStack.Mode = AddrModeFlat;
	sf.AddrFrame.Offset = context.Ebp;
	sf.AddrFrame.Mode = AddrModeFlat;

	DWORD machineType = IMAGE_FILE_MACHINE_I386;
	HANDLE hProcess = GetCurrentProcess();
	HANDLE hThread = GetCurrentThread();
	SymInitialize(hProcess, NULL, TRUE);

	for (; ; )
	{
		if (!StackWalk(machineType, hProcess, hThread, &sf, &context, 0, SymFunctionTableAccess, SymGetModuleBase, 0))
		{
			break;
		}

		if (sf.AddrFrame.Offset == 0)
		{
			break;
		}
		BYTE symbolBuffer[sizeof(SYMBOL_INFO) + 1024];
		PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)symbolBuffer;

		pSymbol->SizeOfStruct = sizeof(symbolBuffer);
		pSymbol->MaxNameLen = 1024;

		sprintf(szPath, "Offset:0x%08X ", sf.AddrPC.Offset);
		strcat(szExcep, szPath);


		memset(tcPath, 0, sizeof(tcPath));
		DWORD64 symDisplacement = 0;
		if (SymFromAddr(hProcess, sf.AddrPC.Offset, 0, pSymbol))
		{
			sprintf(szPath, "%s ", pSymbol->Name);
		}
		else
		{
			sprintf(szPath, "%s ", "Unknown symbol");
		}



		strcat(szExcep, szPath);



		IMAGEHLP_LINE lineInfo = { sizeof(IMAGEHLP_LINE) };
		DWORD dwLineDisplacement;

		memset(tcPath, 0, sizeof(tcPath));
		if (SymGetLineFromAddr(hProcess, sf.AddrPC.Offset, &dwLineDisplacement, &lineInfo))
		{
			sprintf(szPath, "[%s @ %u] ", lineInfo.FileName, lineInfo.LineNumber);
		}
		else
		{
		}
		strcat(szExcep, szPath);
		strcat(szExcep, "\n");


		//break;
	}
	strcat(szExcep, "\n");
	SymCleanup(hProcess);


	FILE* fp = fopen("C:\\Users\\pc\\Desktop\\1.txt", "w");
	if (NULL != fp)
	{

		fseek(fp, 0, SEEK_END);

		fprintf(fp, "%s", szExcep);

		fclose(fp);
		fp = NULL;
	}

	TerminateProcess(GetCurrentProcess(), 0);

	return EXCEPTION_EXECUTE_HANDLER;;
}
#else
#endif

以上代码可以正常执行

stdafx.h文件中无特殊头文件

main.cpp需要加上30、31这两行代码

#include "ExceptionHandler.h"

执行结果如下

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VS调试方法总结(二) 的相关文章

  • xrdp 老版本返回上一次登录以及error - problem connecting

    连接服务器失败总结以下几种处理方式 xff1a 首先确定不是网络问题 xff0c ping ip地址 说明服务器端的网络没有问题 xff0c 通常linux开机默认监听22 3350 3389几个端口 22端口是用来连接ssh xff0c
  • C51编程23-应用篇(HC 06蓝牙模块)

    现在的手机 平板 xff0c 笔记本电脑都会自带蓝牙 本文将会介绍51单片机使用HC 06 蓝牙模块实现手机与笔记本电脑的通讯 HC 06 模块 购买HC 06模块后需要检测蓝牙模块是否是好的 xff0c 使用串口线与HC 06 模块连接起
  • BiliBili自动签到

    前情提要 emmm怎么突然会出这个教程呢 xff0c 因为俺要白嫖TX xff0c 如下图 xff1a 这是腾讯云函数公众号的一个搭建环境送礼品的活动 xff0c 截止日期 xff1a 10 9 这活动多亏群友分享 xff0c 不然俺也不知
  • RHEL8-配置IP地址

    前导 本文主要讲解如何重启RHEL 8或者CentOS 8网络以及如何解决RHEL8和CentOS8系统的网络管理服务报错 xff0c 当我们安装好RHEL 8或者 CentOS 8 xff0c 重启启动网络时 xff0c 会出现以下报错
  • redhat-8-0重置root密码

    前导 如果你忘记了RHEL 8系统中的root密码 xff0c 那就得重置root密码 xff0c 以下为在Grub启动菜单中在RHEL 8上进行手动密码恢复 引导 重启RHEL 8系统 将系统重启 xff0c 在看到grub菜单后 xff
  • Debian10使用本地ISO搭建APT源

    前言 这是个坑 xff01 是个大坑 xff01 如果在配置debian10本地源的时候 xff0c 直接使用apt cdrom add命令创建本地源后 xff0c 在安装软件的时候会有很大几率找不到软件包的位置然后报错 报错 E The
  • Debian10.x创建Raid5

    技术简介 RAID5技术是把硬盘设备的数据奇偶校验信息保存到其他硬盘设备中 RAID 5磁盘阵列组中数据的奇偶校验信息并不是单独保存到某一块硬盘设备中 xff0c 而是存储到除自身以外的其他每一块硬盘设备上 xff0c 这样的好处是其中任何
  • Debian10.x创建NFS

    技术简介 NFS xff08 网络文件系统 xff09 服务可以将远程Linux系统上的文件共享资源挂载到本地主机的目录上 xff0c 从而使得本地主机 xff08 Linux客户端 xff09 基于TCP IP协议 xff0c 像使用本地
  • Windows下 gcc编译环境的构建(Sublime + Mingw)

    1 起源 Windows 7下VC 6 0装起来很困难 xff0c 不得不装了个Visual Studio 2010 Express 但感觉比庞大 xff0c 并且在程序运行的最后不会暂停 2 计划采用Sublime加Mingw构建一个gc
  • Linux下安装xrdp

    Linux下安装xrdp 使用rdp协议访问远程Linux桌面 一般情况下 xff0c 如果需要登陆远程Linux系统 xff0c 我们会使用ssh telnet来完成 xff0c 如果需要登陆到远程Linux系统的桌面环境 xff0c 我
  • bootstrap模态对话框宽度设置

    39 addFormbox 39 modal css width 39 auto 39 39 margin left 39 function return this width 2
  • Debian10.x简易配置DHCP服务器

    环境 Client 网卡1 系统 xff1a debian10 Server xff1a 三网卡IP 10 10 100 254 IP 172 16 100 254 IP xff1a 192 16 100 254 实施步骤 安装 apt i
  • haproxy各个指标的打印报告解析

    1 使用这个命令就可以获取haproxy所有的数据 span class hljs keyword echo span span class hljs string 34 show stat 34 span socat span class
  • CentOS7使用firewalld打开关闭防火墙与端口火墙与端口

    CentOS7使用firewalld打开关闭防火墙与端口火墙与端口 启动 xff1a systemctl start firewalld 关闭 xff1a systemctl stop firewalld 查看状态 xff1a system
  • poj 1752 Advertisement (区间差分约束+最长路 输出可行解)

    Advertisement Time Limit 1000MS Memory Limit 10000KTotal Submissions 919 Accepted 331 Special Judge Description The Depa
  • OSI 七层模型详解

    大家好 xff0c 我是蛋蛋 3T 43 技术学习视频资源 xff0c 500 43 技术电子书 xff0c 大量高效工具及网站 xff0c 私信回复 资源 即可免费获取 OSI xff08 Open System Interconnect
  • WebService的简单示例

    今天 xff0c 看到需求需要WebService进行通信 xff0c 所以我就先看看WebService是怎样的一个流程 xff0c 这里做个简单实例 首先我创建了两个工程 xff0c 一个为服务端 xff0c 另一个为客户端 part1

随机推荐

  • 今日头条2018校园招聘后端开发工程师 (第二批) 编程题 - 字母交换

    题目描述 xff1a 编码题 字符串S由小写字母构成 xff0c 长度为n 定义一种操作 xff0c 每次都可以挑选字符串中任意的两个相邻字母进行交换 询问在至多交换m次之后 xff0c 字符串中最多有多少个连续的位置上的字母相同 xff1
  • php 报错:A non-numeric value encountered

    意思是 39 遇到了非数值异常 39 xff0c 可能是你的代码里字符串拼接习惯性的将 39 39 写成了 39 43 39 所导致
  • linux系统变为只读,提示Read-only file system的解决办法

    mount o rw remount
  • 修改Debian登录窗口背景图片

    仅记录以便日后使用 xff1a 执行gresource export sh xff0c 将资源文件备份到 HOME shell theme目录将导出的 HOME shell theme theme中的所有文件 xff0c 保存到gnome
  • 【MySQL】Navicat修改数据库名称

    假设 xff1a 有一个数据库 xff0c 名称为A xff0c 需要修改为B 在Navicat中不可以按F2修改数据库的名称 xff0c 我们必须新建一个库 xff0c 命名为B 下面4种方式都可以实现目标 如果数据库中有远程表和权限设置
  • CityScapes数据集介绍

    CityScapes Cityperson数据集 xff0c 在16年CVPR上被提出 xff0c 是张姗姗一波人在CityScapes数据集上进行标注得到的行人检测数据集 做行人检测的应该都不陌生 在Replusion Loss和NMS
  • ARM学习(18) Jink Ozone调试总结

    笔者来聊聊Jink Ozone调试 1 Ozone加载选择elf或者bin Ozone调试的时候可以设置PC的位置 xff0c 主要有上面两种 从ELF读取PC位置 xff0c 调试时直接设置PC的初始位置从向量表中读取pc的初始值 xff
  • mac iCloud 关闭后 桌面文件不见了

    输入 user后回车 进入用户文件 打开iCloud Drive
  • 【模拟】AtCoder2160 Manhattan Compass

    分析 模拟实现题 把坐标轴转一下然后暴力求就行了 转了一下坐标轴 xff0c 问题就变成以p为中心 xff0c 与新的坐标轴平行的 xff0c 边长为2 d的正方形上的点能够与p相连 方便起见 xff0c 把答案分成两部分求 然后可以分别考
  • 处理爬虫是返回setCookie的一段js获取acw_sc__v2的方法

    处理爬虫是返回setCookie的一段js获取acw sc v2的方法 原文链接 setCookie JS反爬虫处理 处理代码 span class token keyword import span requests span class
  • C++ winpcap网络抓包代码实现,以及抓包内容解析。

    c 43 43 实现抓包代码 1 安装winpcap windows packet capture 是windows平台下一个免费 xff0c 公共的网络访问系统 开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能
  • Python dataframe更换列名称

    方法1 使用pd rename函数 span class hljs operator a span span class hljs built in rename span columns 61 span class hljs string
  • 知识点2:Swift REPL

    关于REPL简介 REPL xff1a 英文缩写 xff08 Read Eval Print Loop xff09 即读取 执行 输出 循环的意思 Xcode 6 1 引入了另一种以交互式的方式体验Sw ift的方法 主要特点 xff1a
  • iOS 关于UIAlertController常见使用方法

    Step 1 警告框 1 代码 1 创建提示窗口 参数1 xff1b Title xff1a 标题 参数1 xff1b message xff1a 提示内容 参数1 xff1b Style 风格 UIAlertControllerStyle
  • 2023年最新版kali linux安装教程

    一 前期准备 前排提醒 xff0c 文末有绿色版安装包免费领取 xff01 二 VMware虚拟机配置 1 打开vmware xff0c 点击创建新的虚拟机 2 选择自定义 高级 选项 xff0c 点击下一步 3 继续下一步 4 选择 稍后
  • CentOS7.1下 安装vncserver和删除vnc占有的端口

    今天给两台新服务器装CentOs7 1系统 xff0c 然后装VNCServer的时候感觉网上的教程要么复杂多此一举 xff0c 要么不清楚 xff0c 关于 list端口的部分都没讲 所以这里整理一下 xff0c 按着下面的顺序来就可以了
  • mac使用虚拟机(VirtualBox+centos7)搭建kubernetes(K8S)集群

    文章目录 说明一 环境准备1 配置主机网络2 配置磁盘空间3 安装虚拟机配置网络4 设置Linux环境 三台均需要设置 二 安装docker kubeadm kubelet kubectl 三台均需要设置 1 安装docker环境2 kub
  • .NET6入门:1.Windows开发环境搭建

    作为 NET的最新版本 NET6长期支持版已经发布 xff0c NET6宣称是迄今为止最快的 NET 那当然不能落下时代的潮流 xff0c 就让我们跟着文章进入 NET6的世界吧 1 NET6SDK下载 Download NET Linux
  • 音视频编解码原理(一) 封装格式和编码方式简介

    一 封装格式 要了解音视频编解码原理 xff0c 首先需要知道什么是封装格式 xff1f 所谓封装格式 xff0c 就是将已经编码压缩好的视频轨和音频轨按照一定的格式封装到一个文件中 xff0c 一般情况下 xff0c 不同的封装格式对应不
  • VS调试方法总结(二)

    通过结构化异常定位崩溃程序 程序崩溃时 xff0c 生成文本文件 xff0c 记录崩溃得堆栈信息 直接上代码 已经编译通过 xff0c 拷贝直接可用 h include lt Windows h gt include lt stdarg h