静态库

MFC静态库

crt静态库(/MT)

/MD动态库
vs2015以后的vc版本增加UCRT支持(win10除了exe程序还有uwp程序,兼容win10系统的所有终端,包括手机)

minidump生成

确保程序中有生成调试信息

通过SetUnhandledExceptionFilter设置全局异常钩子函数

SetUnhandledExceptionFilter(global_exception);

long __stdcall global_exception(_EXCEPTION_POINTERS* excp)
{BOOST_LOG_TRIVIAL(error) << "program exception,"<<("error address   %x/n", excp->ExceptionRecord->ExceptionAddress);Logger::instance()->obj() << "程序异常";HANDLE hFile = ::CreateFile(_T("./dumpfile.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile != INVALID_HANDLE_VALUE){MINIDUMP_EXCEPTION_INFORMATION einfo;einfo.ThreadId = ::GetCurrentThreadId();einfo.ExceptionPointers = excp;einfo.ClientPointers = TRUE;::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hFile, MiniDumpNormal, &einfo, NULL, NULL);::CloseHandle(hFile);}return EXCEPTION_EXECUTE_HANDLER;
}

minidump分析

minidump文件和pdb、exe相同目录下
项目中直接打开minidump调试,crash dump打开等待很久可以直接打开上面的文件选项

或者直接打开minidump文件调试

设置符号路径,根据项目依赖项,下载相关的符号文件。点击“使用仅限本机进行调试”,出现下面窗口,才能下载依赖的符号文件和正常调试
否则无完整的堆栈信息

项目添加源文件路径

通过StackWalk获取函数地址

void dump_callstack( CONTEXT *context )
{STACKFRAME sf;memset( &sf, 0, sizeof( STACKFRAME ) );sf.AddrPC.Offset = context->Eip;sf.AddrPC.Mode = AddrModeFlat;sf.AddrStack.Offset = context->Esp;sf.AddrStack.Mode = AddrModeFlat;sf.AddrFrame.Offset = context->Ebp;sf.AddrFrame.Mode = AddrModeFlat;DWORD machineType = IMAGE_FILE_MACHINE_I386;HANDLE hProcess = GetCurrentProcess();HANDLE hThread = GetCurrentThread();for( ; ; ){if( !StackWalk(machineType, hProcess, hThread, &sf, context, 0, SymFunctionTableAccess, SymGetModuleBase, 0 ) ){break;}if( sf.AddrFrame.Offset == 0 ){break;}BYTE symbolBuffer[ sizeof( SYMBOL_INFO ) + 1024 ];PSYMBOL_INFO pSymbol = ( PSYMBOL_INFO ) symbolBuffer;pSymbol->SizeOfStruct = sizeof( symbolBuffer );pSymbol->MaxNameLen = 1024;DWORD64 symDisplacement = 0;if( SymFromAddr( hProcess, sf.AddrPC.Offset, 0, pSymbol ) ){printf( "Function : %s\n", pSymbol->Name );}else{printf( "SymFromAdd failed!\n" );}IMAGEHLP_LINE lineInfo = { sizeof(IMAGEHLP_LINE) };DWORD dwLineDisplacement;if( SymGetLineFromAddr( hProcess, sf.AddrPC.Offset, &dwLineDisplacement, &lineInfo ) ){printf( "[Source File : %s]\n", lineInfo.FileName ); printf( "[Source Line : %u]\n", lineInfo.LineNumber ); }else{printf( "SymGetLineFromAddr failed!\n" );}}
}

restart

mfc、CWinApp支持自动重启

没有栈信息

参考:https://blog.csdn.net/yy405145590/article/details/60773631

程序暂停后,打开寄存器EBP,在内存中查找EBP的取值,EBP的低字节位是函数地址

mfc设置静态库和minidump、restart相关推荐

  1. MFC的静态库.lib、动态库.dll(包含引入库.lib)以及Unicode库示例

    以vs2012为标准.转自:http://technet.microsoft.com/zh-cn/library/w4zd66ye ,有改动. 一 MFC的静态库(.lib) MFC静态库使用下列命名 ...

  2. MFC 在静态库中使用MFC,静态多线程 兼容更多windows版本避免提示缺少很多dll,安装运行库 Visual C++ Redistributable for Visual Studio

    不管动态还是静态都有可能缺dll.最安全的是安装运行库: Download Visual C++ Redistributable for Visual Studio 2015 from Officia ...

  3. MFC设置静态文本框,编辑框等控件背景和字体颜色

    在MFC类库提供了CWnd::OnCtlColor函数,在工作框架的子窗口被重画时将调用该成员函数.因此可以重载WM_CTLCOLOR消息的响应函数.此函数的原型: afx_msg HBRUSH On ...

  4. 编译-speex For iOS静态库

    这篇文章只为记录,学习编译C++静态库的文章.对编译结果不做追究. 最新的Demo 这两天在折腾语音的东西,实现类似微信上对讲机的功能,做了两个Demo,一种使用lib-amr库用amr格式实现的,这 ...

  5. 【Android NDK 开发】Android Studio 使用 CMake 导入静态库 ( CMake 简介 | 构建脚本路径配置 | 引入静态库 | 指定静态库路径 | 链接动态库 )

    文章目录 I . CMake 简介 II . Android Studio 中 CMake 引入静态库流程 III . 指定 CMake 最小版本号 IV . 导入函数库 ( 静态库 / 动态库 ) ...

  6. 【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )

    文章目录 I . Android Studio 中使用 Android.mk 配置静态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  7. iPhone:创建、连接和使用静态库(过时了,仅参考)

    深入理解iPhone静态库(手把手教你iphone开发 - 基础篇) 作者:孙东风 2009-11-20(请尊重作者劳动成果,转载务必注明出处) 在实际的编程过程中,通常会把一些公用函数制成函数库,供 ...

  8. 结合CmakeList来更好地理解windows下的动态库和静态库

    动态库和静态库的输出 window下输出的静态库为.lib文件,用于包含所有的函数,以及函数的实现,以及其他的一些东西,所以文件较大:输出的动态库包含.lib文件和.dll文件,.lib文件主要包含接 ...

  9. 关于windows系统中静态库链接找不到的问题

    典型错误提示如下 error LNK2019: 无法解析的外部符号 _GdiplusStartup@12,该符号在函数 "public: __thiscall APPInit::APPIni ...

最新文章

  1. Codeforces Round #539 (Div. 2) C. Sasha and a Bit of Relax
  2. 一个用于推算神经网络理论收敛迭代次数的方法
  3. c、c++、Java和gcc写Hello World
  4. 促进儿童语言发展的方法
  5. HBase 数据存储结构
  6. 第三节:快速编译TypeScript,提高开发效率
  7. vue设置输入框输入长度_vue输入框限制字符串长度和输入内容实时验证的实现方式...
  8. 机器学习第六回-无监督学习—— K-均值算法
  9. ZJOI2019 线段树
  10. [Server] HP DL380 G6更新esxi6.0 SATA 硬盘掉线问题
  11. poj3268(Silver Cow Party)最短路
  12. 深度学习笔记_基本概念_Depthwise卷积与Pointwise卷积
  13. 算法:回溯十二 Word Search字符串匹配二维矩阵
  14. 内网穿透什么意思?内网穿透基础知识原理内网穿透服务器搭建可以干嘛服务器端口映射无需公网IP教程方法
  15. 信号及传播介质 综合布线系统
  16. 使用kettle向HBase导入数据
  17. TokenInsight 对话首席——分片技术的现状与未来(下)
  18. 纳米数据世界杯足球基础数据,接口文档,接口api调试,数据接口演示
  19. shell编程中空格的使用
  20. bugkuctf 游戏通关玄学式速通

热门文章

  1. java socket 银行,银行前置机程序(通信部分socket,java编写 )
  2. 3、基于XML管理bean
  3. ChatGPT和New Bing学术提问模版
  4. Lattice FPGA 开发工具Diamond使用流程总结——IP核使用、原语调用
  5. 计算机主机拆废品,废旧笔记本别再当废品卖掉了!简单拆开件件都是宝物!
  6. C# WPF ListView控件的实例详解
  7. css实现梯形标签页
  8. 大数据之路—— 离线数据开发
  9. Matlab中字符串表示、字符串矩阵、字符串中的常用函数
  10. HydroD 实用教程(三)环境数据