【WIN32】C++在打印Windows中调用堆栈信息

C++在打印Windows中调用堆栈信息

关键函数

GetCurrentProcess

返回当前进程的伪句柄
伪句柄是一个特殊常量,当前 (HANDLE) -1,被解释为当前进程句柄。 为了与将来的操作系统兼容,最好调用 GetCurrentProcess ,而不是硬编码此常量值。 每当需要进程句柄时,调用进程都可以使用伪句柄来指定自己的进程。 伪句柄不由子进程继承

SymInitialize(HANDLE hProcess, PCSTR UserSearchPath, BOOL fInvadeProcess)

初始化进程的符号处理
hProcess标识调用方的句柄
UserSearchPath用于搜索符号文件的路径或用分号分隔的路径系列。 如果此参数为 NULL,则库将尝试从以下源形成符号路径:

  • 应用程序的当前工作目录
  • _NT_SYMBOL_PATH 环境变量
  • _NT_ALTERNATE_SYMBOL_PATH 环境变量

fInvadeProcess如果为 TRUE,则枚举进程的加载模块,并有效地为每个模块调用 SymLoadModule64 函数

如果函数成功,则返回值为 TRUE。
如果函数失败,则返回值为 FALSE。

CaptureStackBackTrace(ULONG FramesToSkip, ULONG FramesToCapture, PVOID *BackTrace, PULONG BackTraceHash)

通过向上浏览堆栈并记录每个帧的信息来捕获堆栈回跟踪。
FramesToSkip 标识要从回溯开始跳过的帧数
FramesToCapture要捕获的帧数。 最多可以捕获 MAXUSHORT 帧
Windows Server 2003 和 Windows XP:FramesToSkip 和 FramesToCapture 参数的总和必须小于 63。
BackTrace标识从当前堆栈跟踪捕获的指针数组。
BackTraceHash标识可用于组织哈希表的值。 如果此参数为 NULL,则不计算哈希值。
此值是根据 BackTrace 数组中返回的指针的值计算的。 两个相同的堆栈跟踪将生成相同的哈希值。

返回
捕获的帧数。

SymFromAddr(HANDLE hProcess, DWORD64 Address, PDWORD64 Displacement, PSYMBOL_INFO Symbol)

检索指定地址的符号信息
hProcess进程的句柄。此句柄必须以前传递给 SymInitialize 函数。
Address符号应位于的地址。地址不必位于符号边界上。如果地址位于符号的开头之后和符号的末尾之前,则会找到该符号。
Displacement符号开头的位移,或零。
Symbol指向 SYMBOL_INFO 结构的指针,该结构提供有关符号的信息。 符号名称的长度可变;因此,此缓冲区必须足够大,才能保存存储在 SYMBOL_INFO 结构末尾的名称。 请务必将 MaxNameLen 成员设置为为名称保留的字节数。

#include <windows.h>
#include <dbghelp.h>
#include <stdio.h>#if _MSC_VER
#define snprintf _snprintf
#endif#define STACK_INFO_LEN  1024void ShowTraceStack(char* szBriefInfo)
{static const int MAX_STACK_FRAMES = 12;void *pStack[MAX_STACK_FRAMES];static char szStackInfo[STACK_INFO_LEN * MAX_STACK_FRAMES];static char szFrameInfo[STACK_INFO_LEN];HANDLE process = GetCurrentProcess();SymInitialize(process, NULL, TRUE);WORD frames = CaptureStackBackTrace(0, MAX_STACK_FRAMES, pStack, NULL);strcpy(szStackInfo, szBriefInfo == NULL ? "stack traceback:\n" : szBriefInfo);for (WORD i = 0; i < frames; ++i) {DWORD64 address = (DWORD64)(pStack[i]);DWORD64 displacementSym = 0;char buffer[sizeof(SYMBOL_INFO)+MAX_SYM_NAME * sizeof(TCHAR)];PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer;pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);pSymbol->MaxNameLen = MAX_SYM_NAME;DWORD displacementLine = 0;IMAGEHLP_LINE64 line;line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);if (SymFromAddr(process, address, &displacementSym, pSymbol) && SymGetLineFromAddr64(process, address, &displacementLine, &line)){snprintf(szFrameInfo, sizeof(szFrameInfo), "\t%s() at %s:%d(0x%x)\n", pSymbol->Name, line.FileName, line.LineNumber, pSymbol->Address);}else{snprintf(szFrameInfo, sizeof(szFrameInfo), "\terror: %d\n", GetLastError());}strcat(szStackInfo, szFrameInfo);}printf("%s", szStackInfo);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/90555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux账户组管理及权限练习

1.使用id命令查看root账户信息 [rootserver ~]# id root 用户id0(root) 组id0(root) 组0(root) 2.使用id命令查看自己的普通账户信息 [rootserver ~]# id kxy 用户id1000(kxy) 组id1000(kxy) 组1000(kxy),10(wheel) 3.新建账户test1&#xff0c;并查看账户信息&#xff1a; [ro…

BASH shell脚本篇3——字符串处理

这篇文章介绍下BASH shell中的字符串处理的相关命令。之前有介绍过shell的其它命令&#xff0c;请参考&#xff1a; BASH shell脚本篇1——基本命令 BASH shell脚本篇2——条件命令 Bash字符串也是一种数据类型&#xff0c;它用于表示文本而不是数字&#xff0c;它是一组可能…

No150.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

后台管理系统: 商品管理

商品管理之三级联动静态组件 先做俩个卡片组件&#xff0c;分开距离 三级联动很多地方都用到了它&#xff0c;我们可以封装成一个组件 注册为一个全局组件 <div><el-form :inline"true" class"demo-form-inline"><el-form-item label&qu…

1200*A. Flipping Game(前缀和)

解析&#xff1a; 100数据量&#xff0c;两层遍历每个区间&#xff0c;然后前缀和计算1的个数&#xff0c;维护最大值即可。 #include<bits/stdc.h> using namespace std; #define int long long const int N110; int n,a[N],res,sum[N]; signed main(){scanf("%ll…

Python标准库分享之时间与日期 (time, datetime包)

Python具有良好的时间和日期管理功能。实际上&#xff0c;计算机只会维护一个挂钟时间(wall clock time)&#xff0c;这个时间是从某个固定时间起点到现在的时间间隔。时间起点的选择与计算机相关&#xff0c;但一台计算机的话&#xff0c;这一时间起点是固定的。其它的日期信息…

目标检测:FROD: Robust Object Detection for Free

论文作者&#xff1a;Muhammad,Awais,Weiming,Zhuang,Lingjuan,Lyu,Sung-Ho,Bae 作者单位&#xff1a;Sony AI; Kyung-Hee University 论文链接&#xff1a;http://arxiv.org/abs/2308.01888v1 内容简介&#xff1a; 1&#xff09;方向&#xff1a;目标检测 2&#xff09;…

性能优化实战使用CountDownLatch

1.分析问题 原程序是分页查询EventAffinityScoreDO表的数据&#xff0c;每次获取2000条在一个个遍历去更新EventAffinityScoreDO表的数据。但是这样耗时比较慢&#xff0c;测试过30万的数据需要2小时 private void eventSubjectHandle(String tenantId, String eventSubject) …

3.6+铁死亡+WGCNA+机器学习

今天给同学们分享一篇3.6铁死亡WGCNA机器学习的生信文章“Identification of ferroptosis related biomarkers and immune infiltration in Parkinsons disease by integrated bioinformatic analysis”&#xff0c;这篇文章于2023年3月14日发表在BMC Med Genomics期刊上&#…

队列的使用以及模拟实现(C++版本)

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…

C运算符和控制语句

几乎每一个程序都需要进行运算&#xff0c;对数据进行加工处理&#xff0c;否则程序就没有意义了。要进行运算&#xff0c;就需规定可以使用的运算符。 C语言的运算符范围很宽&#xff0c;把除了控制语句和输人输出以外的几乎所有的基本操作都作为运算符处理。 运算符分类1 除…

QToolButton几个小知识点总结

QToolButton设置图标及更改图标大小 QToolButton btn;btn.setIconSize(QSize(35,35));//更改图标大小btn.setIcon(QIcon(":/images/screen.png"));//设置图标QToolButton设置图标和文字显示格式 enum ToolButtonStyle {ToolButtonIconOnly, //只显示图标&#xff08;…

正太分布核函数

正太分布概率密度推导&#xff1a; 设 I ∫ − ∞ ∞ 1 2 π e − x 2 2 d x I \int _{-\infty}^{\infty}\frac{1}{\sqrt{2\pi}}e^{-\frac{x^2}{2}}dx I∫−∞∞​2π ​1​e−2x2​dx 则&#xff1a; I 2 ∫ − ∞ ∞ 1 2 π e − x 2 2 d x ∫ − ∞ ∞ 1 2 π e −…

likeadmin和fastapi的bug

以下内容写于2023年8月11日 bug 1 请求体 - 多个参数 - FastAPI (tiangolo.com)中“请求体中的单一值”处&#xff0c;选python3.6&#xff0c;接口示例代码是 from typing import Unionfrom fastapi import Body, FastAPI from pydantic import BaseModel from typing_exte…

Spring Boot中配置文件介绍及其使用教程

目录 一、配置文件介绍 二、配置简单数据 三、配置对象数据 四、配置集合数据 五、读取配置文件数据 六、占位符的使用 一、配置文件介绍 SpringBoot项目中&#xff0c;大部分配置都有默认值&#xff0c;但如果想替换默认配置的话&#xff0c;就可以使用application.prop…

从零手搓一个【消息队列】项目设计、需求分析、模块划分、目录结构

文章目录 一、需求分析1, 项目简介2, BrokerServer 核心概念3, BrokerServer 提供的核心 API4, 交换机类型5, 持久化存储6, 网络通信7, TCP 连接的复用8, 需求分析小结 二、模块划分三、目录结构 提示&#xff1a;是正在努力进步的小菜鸟一只&#xff0c;如有大佬发现文章欠佳之…

阿里云效自动构建python自动测试脚本

之前一直用的是jenkins自动构建自动化脚本&#xff0c;因为现在的公司统一在阿里云效的流水线上做代码的管理&#xff0c;构建&#xff0c;要求自动化测试也在上面自动构建&#xff0c;故而学习了一下。为自己做一个记录&#xff0c;也给有需要的朋友做一个参考。 1. 新建流水…

设计模式4、建造者模式 Builder

解释说明&#xff1a;将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示 UML 结构图&#xff1a; 抽象建造者&#xff08;Builder&#xff09;&#xff1a;这个接口规定要实现复杂对象的那些部分的创建&#xff0c;并不设计具体部件对象的创…

在MySQL中使用VARCHAR字段进行日期筛选

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

ROS2 从头开始​​:第6部分 - ROS2 中的 DDS,用于可靠的机器人通信

一、说明 在这篇文章中,我们将重点关注 ROS 2的通信栈DDS,其中这是介于管理节点通信与控制节点通信环节,是上位机决策体系与下位机的控制体系实现指令-执行-反馈的关键实现机制。 二、ROS工程的概念框架 现代机器人系统非常复杂,因为需要集成各种类型的传感器、执行器和其…