Windows打印堆栈

Windows下C++打印堆栈 搜索了下在Windows下C++打印堆栈的相关资料,发现很多都是类似,且方法比较复杂,因此自己封装了一个接口。主要用到了CaptureStackBackTrace,SymFromAddr,SymGetLineFromAddr64这三个接口。CaptureStackBackTrace用于获取当前堆栈,SymFromAddr用于获取符号信息,SymGetLineFromAddr64用于获取文件和行号信... 阅读详情
//打印堆栈
#include <stdarg.h>
#include <windows.h>
//#include <dbghelp.h>
#include <stdio.h>

#if _MSC_VER
#define snprintf _snprintf
#endif

#define STACK_INFO_LEN 1024
static int vsnprintf_s(char* buf, size_t len, const char* fmt, va_list arg)
{
	return ::vsnprintf_s(buf, len, _TRUNCATE, fmt, arg);
}

static int vsnprintf_s(wchar_t* buf, size_t len, const wchar_t* fmt, va_list arg)
{
	return ::_vsnwprintf_s(buf, len, _TRUNCATE, fmt, arg);
}

static int snprintf_s(char* buf, size_t len, const char* fmt, ...)
{
	va_list args;
	va_start(args, fmt);
	int nRes = vsnprintf_s(buf, len, fmt, args);
	va_end(args);
	return nRes;
}

void 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);
	strcat(szStackInfo, " ");
	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_s(szFrameInfo, sizeof(szFrameInfo), "\t%s() at %s:%d(0x%x)\n",
				pSymbol->Name, line.FileName, line.LineNumber, pSymbol->Address);
		}
		else
		{
			snprintf_s(szFrameInfo, sizeof(szFrameInfo), "\terror: %d\n", GetLastError());
		}
		strcat(szStackInfo, szFrameInfo);
	}
	MyLog(L"%s", CString(szStackInfo));//此处是你的日志函数
}

在什么情况下使用打印堆栈函数?

1.一个函数多次调用,调用地方不同,不能下断点,打印日志也看不出什么,打印堆栈可以看出。

2.分析崩溃。

缺点:

1.看不到调用堆栈栈帧变量的值。只能看到调用堆栈函数。

VC中如何打印当前调用堆栈 立即下载

相关推荐

蓝桥杯单片机省一经验分享1:基础篇.含详细代码与应试技巧

含详细代码、驱动修改与应试技巧

qq_53529450的博客 1万+

Windows内存分配堆栈打印

Windows内存分配堆栈打印

gaojunhuiwww的专栏 1463

为Codex添加任务完成提示音:提升开发效率的实用技巧

在自动化脚本开发和模型训练过程中,实时获取任务状态反馈是提升工作效率的关键。通过Hook机制,开发者可以在代码执行的关键节点注入自定义逻辑,实现各种自动化操作。Codex的Hook系统特别适合用于任务完成提醒,其post_execution节点能准确捕获执行结束事件。技术实现上,只需简单配置TOML文件并编写音频播放脚本,就能让系统在任务完成时自动播放提示音。这种声音反馈机制尤其适用于长时间运行的批量任务和模型训练场景,实测可提升30%以上的工作效率。结合动态音效选择和跨平台兼容方案,该技巧还能扩展为桌面通

weixin_26767391的博客 534

C中打印堆栈或者通过函数指针获取函数名

c语言中如果需要打印函数堆栈或者根据函数指针输出函数名。 可以使用一下函数。 需要注意的一点就是,需要在链接时候增加-rdynamic的设置。           #include          int backtrace(void **buffer, int size);          char **backtrace_symbols(void *const *buff

追寻神迹 3718

AppleAccount注册之生成sign

根据日志发现:签名来自于AuthKit的-[AKAppleIDServerResourceLoadDelegate signRequest:withCompletionHandler:]的一个block,这个库是放在共享缓存库里的,找到提前准备好的IDA文件,先去找主方法,根据分析IDA,最后找到了实际生成签名的方法:t1。,接受五个参数,context(之前讲的获取到的客户端证书),bytes(待加密的body字节),length(字节长度),以及两个接受结果的参数,直接进这个方法看,

2503_90751938的博客 1005

K230在原有LVGL控件触摸屏控制的基础上,增加USB鼠标控制!

搭配CanMV图形化编程,中小学生可快速开发“键鼠控制AI小游戏”“智能画板”等趣味项目,降低AI学习门槛;:HDMI屏幕+键鼠组合,直接在开发板上调试代码、修改ISP参数、查看AI推理日志,无需频繁连接电脑;:打造带交互的AI设备(如工业控制面板、智能显示器),鼠标操作菜单、键盘输入指令,体验媲美小型PC;:无网络场景下,通过键盘直接向AI设备录入数据、配置参数,适配野外监测、本地工控等场景。,自动识别、快速响应,完美适配交互控制、参数调试、数据输入等场景。

weixin_47446386的博客 146

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

伪句柄是一个特殊常量,当前 (HANDLE) -1,被解释为当前进程句柄。每当需要进程句柄时,调用进程都可以使用伪句柄来指定自己的进程。指向 SYMBOL_INFO 结构的指针,该结构提供有关符号的信息。用于搜索符号文件的路径或用分号分隔的路径系列。如果地址位于符号的开头之后和符号的末尾之前,则会找到该符号。如果为 TRUE,则枚举进程的加载模块,并有效地为每个模块调用 SymLoadModule64 函数。此值是根据 BackTrace 数组中返回的指针的值计算的。符号开头的位移,或零。

Joeyshaw的博客 1196

软件设计师---程序设计语言

软件设计师---程序设计语言

我从不打没有准备的仗! 2万+

windows环境下C++代码打印函数堆栈调用情况

文章目录前言查看函数堆栈的作用实现打印堆栈信息的函数显示堆栈调用信息总结程序源码 前言 程序运行的过程中,函数之间的是会相互调用的,在某一时刻函数之间的调用关系,可以通过函数调用堆栈表现出来,这个调用堆栈所展现的就是函数A调用了函数B,而函数B又调用了函数C,这些调用关系在代码中都是静态的,不需要程序运行就可以知道。 既然函数之间的调用关系可以通过分析代码就可以知道,那么查看函数调用的堆栈是不是...

AlbertS Home of Technology 1万+

QT+OSG/osgEarth编译之七十六:gltf+Qt编译(一套代码、一套框架,跨平台编译,版本:osgEarth-3.3插件库osgdb_gltf)

通过一套gltf代码和框架,实现osgdb_gltf跨平台编译。 在Qt环境下,集成头文件、库文件,构建跨平台编译的pro文件。 通过构建的一套配置工程,基于Qt Creator IDE,完成跨平台的编译实践。 在Windows、Linux、MacOS等操作系统上进行测试,成功编译,形成的成果(头文件、库文件等)可在不同系统下调用或使用,从而更好地构建跨平台解决方案。 采用的是osgEarth3.3版本。 读者可参考博客中的集成原理,构建不同版本的osgdb_gltf跨平台包。

LuckyHanMo的博客 1800

windows server 2012 AD 活动目录部署系列(十一)安装证书服务器(ADCS)

本篇博文介绍如何在AD域控上安装证书服务器,本实验域环境:yun.com。 步骤如下: 1、打开“服务器管理器”,点击“添加角色和功能”,如下图: 2、点击下一步, 3、点击下一步, 4、点击下一步, 5、点击“Active Directory证书服务”,弹出功能选择,点击"添加功能",如下图,

白昼的技术专栏 2万+

linux 打印堆栈日志_在Linux与Windows上获取当前堆栈信息的方法

在编写稳定可靠的软件服务时经常用到输出堆栈信息,以便用户/开发者获取准确的运行信息。常用在日志输出,错误报告,异常检测。在Linux有比较简便的函数获取堆栈信息:#include #include #include #include #include void handler(int sig) {void *array[5];size_t size;// get void*'s for all e...

weixin_35934226的博客 1154

手把手教你学Simulink--进阶电机控制场景实例:基于Simulink的直流电机双闭环调速系统抗负载扰动仿真

摘要:本文基于Simulink平台构建直流电机双闭环调速系统,重点研究其在工业传送带场景下的抗负载扰动性能。系统采用转速外环(稳速)和电流内环(限流)的嵌套结构,通过工程法整定PI参数,实现了转速跌落<10%、恢复时间<0.5s的优异抗扰性能。仿真结果表明,相比单闭环系统,双闭环控制使转速跌落率降低47%,恢复时间缩短75%。文中详细介绍了数学模型建立、Simulink模块实现及参数优化方法,并提供了完整代码和模型文件,为电机控制系统设计提供实用参考。

MHD0815的博客 179

windows VS 下打印堆栈日志

别人的源码地址 http://www.codeproject.com/Articles/11132/Walking-the-callstack

HeroRazor的专栏 3153

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

堆栈的打印方式

Windows堆栈的打印函数方法(已测可用) #include &amp;lt;windows.h&amp;gt; #include &amp;lt;DbgHelp.h&amp;gt; #include &amp;lt;WinBase.h&amp;gt; void printStack() { unsigned int i; void * stack[100]; unsigned short frames; S

z296671124的博客 1038

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

VC++ 崩溃处理以及打印调用堆栈

我们在程序发布后总会面临崩溃的情况,这个时候一般很难重现或者很难定位到程序崩溃的位置,之前有方法在程序崩溃的时候记录dump文件然后通过windbg来分析。那种方法对开发人员的要求较高,它需要程序员理解内存、寄存器等等一系列概念还需要手动加载对应的符号表。Java、Python等等语言在崩溃的时候都会打印一条异常的堆栈信息并告诉用户那块出错了,根据这个信息程序员可以很容易找到对应的代码位置并进行处...

Masimaro的专栏 3919

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

打印函数堆栈调用情况

打印 堆栈

pizziars的专栏 593

vc++实现打印函数调用堆栈(附带源码)

在VC++中,我们可以使用Windows的StackWalk64函数来打印函数调用堆栈。这个函数属于DbgHelp库,能够帮助我们在程序运行时获取调用堆栈信息。通过打印堆栈信息,我们可以追踪函数调用的历史,有助于调试程序。

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 821

c++ 打印堆栈信息

void printStack( void ) { unsigned int i; void * stack[ 100 ]; unsigned short frames; SYMBOL_INFO * symbol; HANDLE process; process = GetCurrentProcess(); SymInitialize( p...

谢小军的专栏 1万+

vc c++ 打印运行时堆栈信息

c++打印运行时堆栈信息void printStack( void ) { unsigned int i; void * stack[ 100 ]; unsigned short frames; SYMBOL_INFO * symbol; HANDLE process; process =

littlewhistler的博客 3924

打印函数调用的堆栈信息

转自:http://blog.youkuaiyun.com/anonymousrookie/article/details/51813418 有些时候为了便于调试,我们需要记录函数调用的堆栈信息。为此,封装了一个类StackDumper,在相应的函数中调用该类的成员函数即可。 stack_dumper.h #ifndef STACK_DUMPER_H #define STACK_DUMPER_H

ACM Dream 2717

关于Mysql errno: 22 - Invalid argument Unhandled MySQL errono 1017. Unexpected behaviour possible. 错误

关于Mysql errno: 22 - Invalid argument Unhandled MySQL errono 1017. Unexpected behaviour possible. 错误

weixin_41696782的博客 2392

[转]C++异常中的堆栈跟踪

<br />C++语言的运行时环境是基于栈的环境,堆栈跟踪(trace stack)就是程序运行时能够跟踪并打印所调用的函数、变量及返回地址等,C++异常中的堆栈跟踪就是当程序抛出异常时,能够把导致抛出异常的语句所在的文件名和行号打印出来,以及把调用抛出异常的语句的函数以及其它上层函数信息都打印出来。<br />    1. 为什么需要堆栈跟踪<br />    当你在开发程序时,你是否曾遇到过程序运行过程中突然当机,而你不知道哪一行代码出的问题;你是否曾遇到过程序调试过程中突然抛出异常,而你不知道哪一行代

游戏人生的专栏 1532
上一篇: QEventLoop概念原理及应用
下一篇: C++设计模式-里氏替换原则
vczxh
博客等级 码龄19年 1371粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值