本文摘自PHP中文网,作者零下一度,侵删。
下面小编就为大家带来一篇在Linux与Windows上获取当前堆栈信息的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧在编写稳定可靠的软件服务时经常用到输出堆栈信息,以便用户/开发者获取准确的运行信息。常用在日志输出,错误报告,异常检测。
在Linux有比较简便的函数获取堆栈信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
以上代码从参考的stackoverflow中稍作修改而来。核心就是backtrace与backtrace_symbols两个函数。
Windows下推荐用StackWalker这个开源代码,支持X86,AMD64,IA64。
如果你需要一个最简的代码,那么下面是我抽取出来的代码,明显比Linux要复杂一些。(Win的很多功能实现起来要复杂一些,当然也有很多功能实现要比Linux简单很多。)
我会做一些讲解,在后面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
|
编译请链接dbghelp.lib
核心就是StackWalk与SymGetSymFromAddr64,SymGetLineFromAddr64。
StackWalk用于获取下一层堆栈。
SymGetSymFromAddr64用于获取当前函数名。
SymGetLineFromAddr64用于获取函数所在文件及行号。
为了这三个函数正常工作,还要初始化符号相关功能(SymInitialize),取得当前线程描述表(RtlCaptureContext),加载用到的模块(SymLoadModule64)。
用到了<DbgHelp.h> <TlHelp32.h>这两个头文件。
上面代码执行后会在控制台输出堆栈信息。
以上就是分享在Linux与Windows上获取当前堆栈信息实例的详细内容,更多文章请关注木庄网络博客!
相关阅读 >>
更多相关阅读请进入《Windows》频道 >>