首页新闻找找看学习计划

如何打印函数堆栈顺序

0
悬赏园豆:50 [已解决问题] 解决于 2014-03-27 15:55

背景:在window7操作系统下,用的vs2010开发的C++代码,在程序可以交付的最终阶段,有莫名其妙的crash,这个时候打上断点debug调试,往往编译和运行的时间很长。

 

想法:可不可以把函数调用情况打到本地.txt里,调用关系一目了然,crash的时候,直接可以快速定位到函数。函数是堆栈排列的嘛,不知道大家有没有这方面的经验给点提示。

yikoda的主页 yikoda | 初学一级 | 园豆:95
提问于:2014-03-27 11:01
< >
分享
最佳答案
0

用 DMP 分析。

收获园豆:50
Launcher | 高人七级 |园豆:45030 | 2014-03-27 11:03

window7环境支持么?

yikoda | 园豆:95 (初学一级) | 2014-03-27 11:20

@yikoda: Windows 7 当然支持,你有两种方式,一种是在程序 Crash 时自动输出 DMP,另一种方式是当程序 Crash 时,先别关闭程序,从任务管理器中找到你的进程,然后右键选择“创建转储文件”(XP部支持),但是你也可以使用 Debug Diagnostics Tool 工具。

Launcher | 园豆:45030 (高人七级) | 2014-03-27 11:30

@Launcher: 上面的方法我先写个小程序试试,但是感觉还是实用性不强啊,本地调试还好,程序提交给客户,肯定是编译的release版本,最好是能把函数名都输出到一个文件里,直接让客户把日志反馈回来,可以快速定位。

yikoda | 园豆:95 (初学一级) | 2014-03-27 11:33

@yikoda: 我不知道你的实用性不强是什么意思,我们一直在 C++ 程序中使用自动输出 DMP 文件的功能,如果程序在客户机器上 Crash,我们的程序会创建 DMP,我们就可以根据此 DMP 还原现场,迅速定位到 Crash 的位置,并且关联到原文件的代码。

Launcher | 园豆:45030 (高人七级) | 2014-03-27 11:38

@Launcher: 按您说的,C++程序中可以使用自动输出DMP文件的功能的么?那程序里面要配置什么么?

按我理解的 是操作程序运行的电脑,而不是对程序修改呢··您再给详细的说下吧。。按上面您说的【右键选择“创建转储文件”】方法DMP文件已经生出来了。。就是不知道怎么让程序怎么本身crash时自动生成。

yikoda | 园豆:95 (初学一级) | 2014-03-27 11:41

@yikoda: 在 Windows 系统中的程序采用结构化异常(SEH)和向量化异常(VEH)处理机制。对于 SEH 和 VEH,OS 都会使用默认的异常处理器来处理,在你的程序中,你可以使用 SetUnhandledExceptionFilter 来设置自己的异常处理器,然后调用 MiniDumpWriteDump 来创建内存转储文件。

Launcher | 园豆:45030 (高人七级) | 2014-03-27 13:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册