注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

gmd20的个人空间

// 编程和生活

 
 
 

日志

 
 

VC里面的CaptureStackBackTrace函数可以用来捕获stack trace  

2014-01-26 11:53:28|  分类: C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

这个有什么用的,看看vc开发团队工程师的一篇文章

Examining stack traces of objects using Visual Studio 2013

http://blogs.msdn.com/b/vcblog/archive/2014/01/23/examining-stack-traces-of-objects-using-visual-studio-2013.aspx

简单的来说,就是可以或的所有的函数调用链。 返回的是各个frame的函数地址的 数组。
这个有些辅助用处的吧,类似gcc的 backtrace 函数。比如用于某些关键错误路径上面的log记录之类的。
 不过当然这个应该没有lLinux下面的libunwind 库那么强大吧。

另外vc可以通过下面这个函数直接在程序里面输出mini dump 文件,跟CaptureStackBackTrace相比较各有优势吧
http://msdn.microsoft.com/en-us/library/windows/desktop/ms680360(v=vs.85).aspx


比如 Google 的tcmalloc里面 heap profiler 在Windows 平台就是用这个api来获取当前的stacktrace的

stacktrace_win32-inl.h

// Load the function we need at static init time, where we don't have

// to worry about someone else holding the loader's lock.

static RtlCaptureStackBackTrace_Function* const RtlCaptureStackBackTrace_fn =

   (RtlCaptureStackBackTrace_Function*)

   GetProcAddress(GetModuleHandleA("ntdll.dll"), "RtlCaptureStackBackTrace");


PERFTOOLS_DLL_DECL int GetStackTrace(void** result, int max_depth,

                                     int skip_count) {

  if (!RtlCaptureStackBackTrace_fn) {

    // TODO(csilvers): should we log an error here?

    return 0;     // can't find a stacktrace with no function to call

  }

  return (int)RtlCaptureStackBackTrace_fn(skip_count + 2, max_depth,

                                          result, 0);

}

  评论这张
 
阅读(1363)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017