StackWalk64
- #include <Windows.h>
- #define PULONG_PTR ULONG**
- #define PULONG ULONG*
- #define ULONG_PTR ULONG*
- #include <DbgHelp.h>
- #include <stdio.h>
- #include <stdarg.h>
- #include <stdlib.h>
- // 添加对dbghelp.lib的编译依赖
- //
- #pragma comment(lib, "dbghelp.lib")
- const int MAX_ADDRESS_LENGTH = ;
- const int MAX_NAME_LENGTH = ;
- // 崩溃信息
- //
- // 安全拷贝字符串函数
- //
- // 得到程序崩溃信息
- //
- // 得到CallStack信息
- //
- #define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS (0x04) // lpModuleName是模块中的一个地址
- typedef BOOL (WINAPI* GetModuleHandleExA_T)(
- DWORD dwFlags,
- LPCSTR lpModuleName,
- HMODULE* phModule
- );
- HMODULE getmodulename(char* buffer,int size,void* addri)
- {
- HMODULE hmodule;
- char FileName[MAX_PATH] = {};
- GetModuleHandleExA_T GetModuleHandleExA=(GetModuleHandleExA_T)GetProcAddress(GetModuleHandle("kernel32.dll"),"GetModuleHandleExA");
- GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCSTR)addri, &hmodule);
- GetModuleFileNameA(hmodule, buffer, size);
- return hmodule;
- }
- char* gettimestring(char* buffer)
- {
- SYSTEMTIME systemtime;
- GetSystemTime( &systemtime);
- sprintf(buffer,"[%2.2d.%2.2d]",systemtime.wHour,systemtime.wMinute,systemtime.wSecond,systemtime.wMilliseconds);
- return buffer;
- }
- void log(const char*format,...)
- {
- va_list v;
- char buffer[];
- char tbuffer[];
- va_start(v,format);
- _vsnprintf(buffer,,format,v);
- va_end(v);
- char fname[];
- sprintf(fname,"%d.txt",GetCurrentThreadId());
- FILE* fd = fopen(fname,"a+b");
- fprintf(fd," %s[%d.%d]%s\r\n",gettimestring(tbuffer),GetCurrentProcessId(),GetCurrentThreadId(),buffer);
- fclose(fd);
- //OutputDebugStringA(buffer);
- }
- void logthread(DWORD threadid,const char*format,...)
- {
- va_list v;
- char buffer[];
- char tbuffer[];
- va_start(v,format);
- _vsnprintf(buffer,,format,v);
- va_end(v);
- char fname[];
- sprintf(fname,"%d.txt",threadid);
- FILE* fd = fopen(fname,"a+b");
- fprintf(fd," %s[%d.%d]%s\r\n",gettimestring(tbuffer),GetCurrentProcessId(),GetCurrentThreadId(),buffer);
- fclose(fd);
- //OutputDebugStringA(buffer);
- }
- void PrintCallStackFromContext(const CONTEXT *pContext,HANDLE hThread,DWORD dwThreadId) ;
- typedef HANDLE (WINAPI * OPENTHREADFUN)(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwThreadId);
- DWORD WINAPI __printstack(void* p)
- {
- DWORD dwThreadId = (DWORD)p;
- DWORD error;
- //1:kernel32 大部分程序都自动加载了kernel32.dll 所以再获得句柄之前不需要Loadlibray
- HMODULE hKernel32 = ::GetModuleHandle("kernel32.dll");
- //2获得函数指针
- OPENTHREADFUN pFun = (OPENTHREADFUN)GetProcAddress(hKernel32,"OpenThread");
- HANDLE hThread = pFun(THREAD_GET_CONTEXT,,dwThreadId);
- if(hThread==){
- error = GetLastError();
- ::MessageBox(,"error1",,);
- return -;
- }
- CONTEXT tagContext;
- tagContext.ContextFlags = CONTEXT_FULL;
- if(GetThreadContext(hThread,&tagContext)){
- PrintCallStackFromContext(&tagContext,hThread,dwThreadId);
- }else{
- error = GetLastError();
- ::MessageBox(,"error2",,);
- return -;
- }
- return ;
- }
- void PrintCurrentCallStack()
- {
- HANDLE hThread = CreateThread(,,__printstack,(void*)GetCurrentThreadId(),,);
- WaitForSingleObject(hThread,-);
- }
- void PrintCallStackFromContext(const CONTEXT *pContext,HANDLE hThread,DWORD dwThreadId)
- {
- HANDLE hProcess = GetCurrentProcess();
- CONTEXT c = *pContext;
- STACKFRAME64 sf;
- memset(&sf, , sizeof(STACKFRAME64));
- DWORD dwImageType = IMAGE_FILE_MACHINE_I386;
- // 不同的CPU类型,具体信息可查询MSDN
- //
- #ifdef _M_IX86
- sf.AddrPC.Offset = c.Eip;
- sf.AddrPC.Mode = AddrModeFlat;
- sf.AddrStack.Offset = c.Esp;
- sf.AddrStack.Mode = AddrModeFlat;
- sf.AddrFrame.Offset = c.Ebp;
- sf.AddrFrame.Mode = AddrModeFlat;
- #elif _M_X64
- dwImageType = IMAGE_FILE_MACHINE_AMD64;
- sf.AddrPC.Offset = c.Rip;
- sf.AddrPC.Mode = AddrModeFlat;
- sf.AddrFrame.Offset = c.Rsp;
- sf.AddrFrame.Mode = AddrModeFlat;
- sf.AddrStack.Offset = c.Rsp;
- sf.AddrStack.Mode = AddrModeFlat;
- #elif _M_IA64
- dwImageType = IMAGE_FILE_MACHINE_IA64;
- sf.AddrPC.Offset = c.StIIP;
- sf.AddrPC.Mode = AddrModeFlat;
- sf.AddrFrame.Offset = c.IntSp;
- sf.AddrFrame.Mode = AddrModeFlat;
- sf.AddrBStore.Offset = c.RsBSP;
- sf.AddrBStore.Mode = AddrModeFlat;
- sf.AddrStack.Offset = c.IntSp;
- sf.AddrStack.Mode = AddrModeFlat;
- #else
- #error "Platform not supported!"
- #endif
- //HANDLE hThread = GetCurrentThread();
- logthread(dwThreadId,"=====stackwalk64=====");
- while (true)
- {
- // 该函数是实现这个功能的最重要的一个函数
- // 函数的用法以及参数和返回值的具体解释可以查询MSDN
- //
- if (!StackWalk64(dwImageType, hProcess, hThread, &sf, &c, NULL, , , NULL))
- {
- break;
- }
- if (sf.AddrFrame.Offset == )
- {
- break;
- }
- // 得到函数名
- //
- DWORD retaddress = (DWORD)sf.AddrPC.Offset;
- char buffer[];
- HMODULE hmod = getmodulename(buffer,,(void*)retaddress);
- logthread(dwThreadId,"retaddress=%s %x",buffer,retaddress-(DWORD)hmod);
- }
- logthread(dwThreadId,"==========");
- }
StackWalk64的更多相关文章
- 《Note --- Unreal --- MemPro (CONTINUE... ...)》
Mem pro 是一个主要集成内存泄露检测的工具,其具有自身的源码和GUI,在GUI中利用"Launch" button进行加载自己待检测的application,目前支持的平台为 ...
- 《Walking the callstack(转载)》
本文转载自:https://www.codeproject.com/articles/11132/walking-the-callstack Download demo project with so ...
- Google之Chromium浏览器源码学习——base公共通用库(四)
本文将介绍debug调试相关的内容,包括调试器.性能分析.堆跟踪.跟踪事件等: alias.h:Alias函数,提供防止载微软的编译器优化某参数变量的操作,内部通过#pragma optimize(& ...
- 【转】调试Release发布版程序的Crash错误
http://www.cppblog.com/Walker/archive/2012/11/08/146153.html http://blog.sina.com.cn/s/blog_48f93b53 ...
- 使用Visual Leak Detector检测内存泄漏[转]
1.初识Visual Leak Detector 灵活自由是C/C++语言的一大特色,而这也为C/C++程序员出了一个难题.当程序越来越复杂时,内存的管理也会变得越加复杂,稍有不慎就会出现内存问题 ...
- VLD(Visual LeakDetector)内存泄露库的使用
VLD简介 由于C/C++语言没有所谓的垃圾收集器,内存的分配和释放都需要程序员自己来控制,这会给C/C++程序员带来一定的困难.当您的程序越来越复杂时,它的内存管理也会变得越来越困难.内存泄漏.内存 ...
- [转]让程序在崩溃时体面的退出之CallStack
原文地址:http://blog.csdn.net/starlee/article/details/6618849 在我的那篇<让程序在崩溃时体面的退出之Unhandled Exception& ...
- 内存泄漏工具VLD1.0_要点分析
0X01 关闭FPO优化 // Frame pointer omission (FPO) optimization should be turned off for this // entire fi ...
- vld(Visual Leak Detector) 内存泄露检测工具
初识Visual Leak Detector 灵活自由是C/C++语言的一大特色,而这也为C/C++程序员出了一个难题.当程序越来越复 杂时,内存的管理也会变得越加复杂,稍有不慎就会出现内存问题.内存 ...
随机推荐
- ubantu下安装pip,python,pycharm,numpy,scipy,matplotlibm,pandas 以及sklearn
ubuntu 安装 pip 及 pip 常用命令: https://blog.csdn.net/danielpei1222/article/details/62969815 ubuntu下不同版本py ...
- Elixir 单元测试
概述 elixir 中自带了单元测试框架 ExUnit ,其中提供单元测试的一系列,主要包含以下模块: ExUnit: 单元测试框架 ExUnit.Assertions: 断言 ExUnit.Case ...
- [WeChall] Training: MySQL I (MySQL, Exploit, Training)
Training: MySQL I (MySQL, Exploit, Training) MySQL Authentication Bypass - The classic This one is t ...
- 前端性能优化成神之路--SSR(服务端渲染)
Nuxt.js的介绍 Nuxt.js概述 nuxt.js简单的说是Vue.js的通用框架,最常用的就是用来作SSR(服务器端渲染).Vue.js是开发SPA(单页应用)的,Nuxt.js这个框架,用V ...
- Linux vi/vim编辑器
所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正 ...
- android studio 定位具体的错误原因
编译一个数据监测APP的时候出现了报错: Error:Compilation failed; see the compiler error output for details. 在网上查到方法如下: ...
- oldboy-作业01.登录多次进行账号锁定
"""可以支持多个用户登录 (提示,通过列表存多个账户信息)用户3次认证失败后,退出程序,再次启动程序尝试登录时,还是锁定状态(提示:需把用户锁定的状态存到文件里) &q ...
- 构建企业 YUM仓库
构建企业 YUM仓库 本地光盘提供基础软件包Base yum缓存提供update软件包 yum缓存提供常用软件包: nginx, zabbix, docker, saltstack 环境准备 系统 I ...
- 网站建设部署与发布--笔记2-部署Apache
网站部署(Linux) 部署Apache 操作系统:CentOS 7.2 1.首先连接云服务器,清楚系统垃圾. $ yum clean all Loaded plugins: fastestmirro ...
- 吴恩达课后作业学习2-week3-tensorflow learning-1-基本概念
参考:https://blog.csdn.net/u013733326/article/details/79971488 希望大家直接到上面的网址去查看代码,下面是本人的笔记 到目前为止,我们一直在 ...