在我的那篇《让程序在崩溃时体面的退出之Unhandled Exception》中提供了一个捕捉程序崩溃事件的方法,可以添加代码在程序崩溃的时候做出适当的处理。不过,只知道程序在什么时候崩溃,但是不知道为什么崩溃,这对于程序开发者来说没有任何意义。因为如果不知道程序崩溃的原因,就没法去找到代码中的缺陷,当然就没法去修改代码而避免程序的崩溃。
所有调试过代码的开发者都知道CallStack的重要性。如果在程序崩溃的时候得到CallStack,那么就能定位程序崩溃的具体位置,并最终找到解决方法。那么有没有什么方法在程序崩溃的时候得到CallStack呢?答案是肯定的。微软提供了一个DbgHelp.dll,里面包含了一系列的Windows API来供开发者调用。它是一个调试跟踪相关的模块,用于跟踪进程工作,在进程崩溃时收集程序产生异常时的堆栈信息,以供开发人员分析,从而很快找出使程序出现异常的原因。
下面用具体的例子代码来说明怎样使用DbgHelp.dll中的Windows API来得到CallStack。代码里面有详细的注释来帮助理解。
用VC创建一个名为Test的控制台程序,添加下面的代码。
编译上面的代码,到工程的Debug目录下找到编译好的Test.exe,双击运行,程序就会崩溃。从代码我们知道函数调用顺序是main() -> CrashTest::Test() -> CrashTest::Crash()。那么怎么在程序崩溃的时候得到CallStack呢?首先,先添加一些工具函数。
然后,就可以用《让程序在崩溃时体面的退出之Unhandled Exception》中提供的捕捉程序崩溃事件的方法添加一个回调函数,在这个函数里面调用上面的函数来得到程序崩溃时的CallStack。
最后,在main函数的开头添加下面的代码。
编译上面的代码,到工程的Debug目录下找到编译好的Test.exe,双击运行,程序在崩溃的时候就会输出CallStack。
分享到:
相关推荐
Android下各语言加callStack打印信息的示例 包括C语言, C++,Java和Kernel Space。
小程序开发 crypto-js 报错 加密 解密 maximum call stack size exceeded
一个简单的打印程序调用栈的例子 .... <br>http://topic.csdn.net/u/20080804/15/623a4355-cfeb-4241-8fba-022fff8facf4.html
android开发,打印调用栈
memleak_callstack_ok for android project
android java CPP的callstack函数回调打印,将文档的代码植入系统就可以。分别介绍了基于java 和 CPP的linux底层call back
android开发,打印调用栈 ,callstack.cpp,android开发,打印调用栈,android开发,打印调用栈
主要介绍了Java反射之Call stack introspection详解,具有一定参考价值,需要的朋友可以了解下。
在android上logd logv 时,看不到函数堆栈。 把这个函数加进去。ok。。 好用就顶 usage: ... #include "CallStack.h" ... mycallstack::CallStack calStk; calStk.update(2); calStk.dump(); ...
前端开源库-eslint-config-callstack-ioeslint配置callstack io,eslint预设扩展airbnb,流,prettier和jest
一本讲函数调用栈的文章,很不错 文章是英文版的,不错都很好懂,值得一看
在文件中实现EditText编辑框中输入内容。设置一个登录按钮监听器,当输入的用户名和密码正确时弹出Toast提示“恭喜登录成功!”,否则提示“请输入正确的用户名或密码!”。设置一个清空按钮监听器,当点击清空按钮...
帮助Android开发者,让项目在崩溃时从异常堆栈中,自动寻找Stack Overflow的回答
config 或使用npm: npm install --save-dev eslint @callstack/eslint-config用法您可以通过扩展您的ESLint配置(选择具有以下的环境中工作的一个.eslintrc ,或eslintConfig在现场package.json含) @callstack配置...
This document describes how to analyze and retrieve the call stack for an executing program written in C or C++. The process can be quite complicated because of the unique features of certain ...
Mage :: helper ( 'stack/callstack' )-> toFirePhp (); Mage :: helper ( 'stack/callstack' )-> toLog (); 示例输出 .../app/code/community/Timbroder/Stack/Helper/Callstack....
关于@callstack/react-theme-provider是一组实用程序,可以通过几个简单的步骤帮助您创建自己的主题系统。 您可以使用它自定义颜色,字体等。特征在React和React Native中工作createTheming(defaultTheme) -工厂返回...
以下是调用的方法,在主程序入口函数第一行动态加载异常捕获库,崩溃后可以在运行目录下生成如【进程名称.exception】的文件,可以看到崩溃的堆栈信息 void main() { //Install our crash handler HMODULE ...
提供易于使用的CallStack抽象,可用于代码反射。 笔记 使用 kuebk/node-stack 作为可选依赖项:这个 dep 可以访问 v8::StackTrace。 如果该依赖项不存在,请使用 Error 进行自省。 每个堆栈帧都应该有一些信息: ...
很多人认为当程序崩溃时用C/C++难以获知程序在哪出现了错误。在很大程度上,C/C++的确难以做到,但是调试器却能做到这一点。下文给出的程序可以做到不用调试器却可以得到程序的堆栈轨迹,和内核给出的堆栈轨迹类似。...