在Windows下如何在程序中获得当前调用栈信息

简介: Windows所提供的获取当前调用栈机制和Solaris有点类似,附件代码把它加以封装,以CallStack类提供给使用者。#ifndef _CALLSTACK_H_ #define _CALLSTACK_H_ #include list> #def...
Windows所提供的获取当前调用栈机制和Solaris有点类似,附件代码把它加以封装,以CallStack类提供给
使用者。
  1. #ifndef _CALLSTACK_H_
  2. #define _CALLSTACK_H_

  3. #include list>

  4. #define MAX_CALLSTACK_FRAMES 102400

  5. class CallStack
  6. {
  7. public:
  8.     static bool LoadDbgHelpLib (); //加载所使用的库dbghelp.dll,必须在初始化是调用。
  9.     int GetCallStack(); //获得当前调用栈所有指令地址PC
  10.    
  11.     //把在GetCallStack函数中所获得的所有指令地址转换成函数名和文件名、行号等信息,并打印出来
  12.     int GenCallStackDetails();

  13. private:
  14.     static char *BuildSymbolSearchpath();
  15.     static HANDLE m_process;
  16.     HANDLE m_thread;
  17.     std::listDWORD64> m_framePC;
  18. };
  19. #endif


使用示例:
  1. #include "CallStack.h"
  2. int main(int argc, char *argv[])
  3. {
  4.     if(!CallStack::LoadDbgHelpLi())
  5.     {
  6.          printf("Load dbghelp.dll failed!\n");
  7.          return -1;
  8.     }
  9.     CallStack *pStack = new CallStack();
  10.     pStack->GetCallStack();
  11.     pStack->GenCallStackDetails();
  12.     delete pStack;
  13.     return 0;
  14. }

  15. 结果是:
  16.  Call Stack:
  17.    f:\vs70builds\3077\vc\crtbld\crt\src\dbgdel.cpp (54): operator delete
  18.    f:\vs70builds\3077\vc\crtbld\crt\src\delete2.cpp (21): operator delete[]
  19.    e:\mydocuments\visual studio projects\allochook\allochook.cpp (46): main
  20.    f:\vs70builds\3077\vc\crtbld\crt\src\crt0.c (259): mainCRTStartup

注意:在Visiual Project下的工程一定要用debug模式编译。
详细请参照:
http://www.codeproject.com/Articles/9815/Visual-Leak-Detector-Enhanced-Memory-Leak-Detectio
zip.gif callstack.zip  
在Linux下如何在程序中获得当前调用栈信息
在Solaris下如何在程序中获得当前调用栈信息
在AIX下如何在程序中获得当前调用栈信息
《返璞归真--UNIX技术内幕》

目录
相关文章
|
2月前
|
安全 Ubuntu iOS开发
Nessus Professional 10.10 Auto Installer for Windows - Nessus 自动化安装程序
Nessus Professional 10.10 Auto Installer for Windows - Nessus 自动化安装程序
141 3
Nessus Professional 10.10 Auto Installer for Windows - Nessus 自动化安装程序
|
4月前
|
Ubuntu Linux Windows
如何在Ubuntu系统中安装Wine,借此来运行Windows程序
熟悉的登录画面出现,在Ubuntu系统中扫描登录微信程序。
|
4月前
|
Unix Linux 编译器
解决在Windows平台上运行Golang程序时出现的syscall.SIGUSR1未定义错误。
通过这种结构,你的代码既可以在支持 SIGUSR1 信号的系统上正常工作,又可以在不支持这些信号的 Windows 系统上编译通过,确保跨平台的兼容性和功能的完整性。
184 0
|
5月前
|
Windows
Windows下版本控制器(SVN)-验证是否安装成功+配置版本库+启动服务器端程序
Windows下版本控制器(SVN)-验证是否安装成功+配置版本库+启动服务器端程序
145 2
|
6月前
|
Windows
Windows下版本控制器(SVN)-启动服务器端程序
Windows下版本控制器(SVN)-启动服务器端程序
198 4
|
7月前
|
安全 Devops 测试技术
AppSpider 7.5.018 for Windows - Web 应用程序安全测试
AppSpider 7.5.018 for Windows - Web 应用程序安全测试
150 0
AppSpider 7.5.018 for Windows - Web 应用程序安全测试
|
10月前
|
安全 JavaScript Java
AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
166 12
AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
|
9月前
|
Windows
Windows程序的数字签名证书怎么申请
Windows程序的数字签名证书申请流程包括:准备企业资料(营业执照、税务登记证等),提交申请表及企业资料。经过初审、实名认证和二审后,等待1-5个工作日审核结果。审核通过后,CA机构颁发证书并通过邮件或邮寄方式发送。收到证书后按指南安装并使用签名工具对程序进行数字签名,确保软件完整性和可信度。注意证书有效期、管理和兼容性问题。
|
9月前
|
自然语言处理 安全 测试技术
HCL AppScan Standard 10.8.0 (Windows) - Web 应用程序安全测试
HCL AppScan Standard 10.8.0 (Windows) - Web 应用程序安全测试
575 0
HCL AppScan Standard 10.8.0 (Windows) - Web 应用程序安全测试
|
安全 API C#
C# 如何让程序后台进程不被Windows任务管理器强制结束
C# 如何让程序后台进程不被Windows任务管理器强制结束
535 0