windows下C++程序release版本崩溃错误排查方法。
一个你精心设计的24小时不间断运行,多线程的程序,突然运行了几个月后崩了,此问题是非常难以排查的,也是很头疼的问题。
现利用Google开源工具crashrpt与Microsoft windbg工具,解决这个问题,并分享给大家。
使用工具
Crashrpt、Windbg.
因为windbg这个工具很常见,暂不介绍。其中重点介绍一下crashrpt。
一、crashrpt 简介
crashrpt是一个包含能够在程序出现各种类型未处理异常时生成程序错误报告,然后将该报告按照指定的方式(例如HTTP或者SMTP)发送给开发者,最后分析这些信息的工具。
crashrpt由3个部分组成:
(1)错误报告生成库CrashRpt
我们需要在自己的程序中使用该库捕获我们的程序没有处理的异常,在该库捕获到这些未处理的异常后,CrashRpt会生成MiniDump文件,
并将和你使用该库指定的信息(例如日志文件和屏幕截图等)一起打包成错误报告。
CrashRpt库支持处理我所知道的所有Windows C/C++程序抛出的各类异常,还能捕获C++异常、信号和调用各类CRT库中的函数出现的错误。
(2)异常信息发送工具CrashSender
该工具能够按照我们使用CrashRpt设置的方式,将生成的错误报告按照我们指定的方式(HTTP、SMTP或者MAPI)发送给我们。
(3)自动异常信息处理工具crprober
该工具能够在后台接收CrashSender发送给我们的错误报告,通过分析错误报告后以文本的形式输出程序的异常信息。
二、下载安装
crashrpt
(1)下载crashrpt
crashrpt下载地址:https://code.google.com/p/crashrpt
关于crashrpt更详细的介绍,可以参考面https://code.google.com/p/crashrpt/ (大陆可能很难访问到)以及http://crashrpt.sourceforge.net/docs/html/getting_started.html (大陆可能很难访问到)
下载解压后的目录如下图所示:其中bin目录中包含使用vc10编译出来的所有crashrpt相关库和程序,include和lib目录中包含了开发所需要的头文件以及lib文件。
(2)使用vc编译crashrpt
如果你不介意程序在发布时带上vc10的运行库,或者你的程序就是用vc10开发的,你可以直接使用这些编译好的二进制文件。
如果你想crashrpt和你的程序依赖相同的vc运行库,那么你需要使用你的vc重新编译crashrpt。
对于使用除vc10之外的其它vc版本的朋友,如果要编译crashrpt,则需要使用开源交叉编译工具
cmake
,我们需要
使用cmake生成和你vc版本相同的解决方案以及工程文件
。
附cmake安装使用方法:首先在http:/
windows下C++程序release版本崩溃错误排查方法。一个你精心设计的24小时不间断运行,多线程的程序,突然运行了几个月后崩了,此问题是非常难以排查的,也是很头疼的问题。现利用Google开源工具crashrpt与Microsoft windbg工具,解决这个问题,并分享给大家。使用工具Crashrpt、Windbg.因为windbg这个工具很常见,暂不介绍。其中...
在Windows环境下做C/C++
程序
开发有段时间了,经常遇到
程序
奔溃时缺无法捕获,经同事推荐,知道了
Crash
Rpt这个捕获C/C++
程序
异常的工具,让我省去了通过增加打印调试去查询
程序
异常的繁琐方式。下面记录下使用这个工具的一些
方法
。
Crash
Rpt工具简单介绍
Crash
Rpt是一个功能很强大的错误报告生成、发送以及分析工具,我是在Windows下使用VS2017开发C++项目使用这...
C
程序
的
崩溃
通常是由于某个组件发生故障或者
程序
本身出现问题造成的。要
排查
崩溃
原因,应该从操作系统、硬件、软件等多个方面去考虑。首先,检查操作系统的更新情况,如果操作系统有新的补丁可以应用,应该尽快更新;其次,检查硬件设备,确保内存、磁盘等设备都在正常工作状态;最后,检查软件,如果发现
崩溃
程序
有运行时错误,可以尝试重新安装软件或者更新软件,以解决问题。
main.cpp中定义函数:
LONG WINAPI UnhandledExceptionFilter_SpawDmp(struct _EXCEPTION_POINTERS* ExceptionInfo)
TCHAR s...
作者 邵发 官网 http://afanihao.cn 本文是 C/C++学习指南(补充篇)- 单步调试 的官方文档。。。
程序
崩溃
的原因分类
1. 函数栈溢出
一个变量未初化、未赋值,就读取它的值。
( 这属于逻辑问题,往往是粗心大意的导致的 )
2. 函数栈溢出
(1)定义了一个体积太大的局部变量
(2)函数嵌套调用,层次过深(如无穷递归)
3. 数组越界访问
访问数组元素时,下标越界
4. 指针
#
崩溃
日志
Android 应用
程序
崩溃
日志到文件。
这是将
崩溃
日志写入 android 应用
程序
中的文件的代码。 现有的 Android 日志
崩溃
日志仅在开发人员模式下。 当
crash
log 将 lib
crash
log.so 动态加载到应用
程序
中时,它会在应用
程序
指定的目录中创建一个
崩溃
日志文件。
##edit $vi local.properties
sdk.dir=<your>
ndk.dir=<your>
NDKBUILD=ndk-build (linux, mac) or ndk-build.cmd (windows)
##Complie
$make or ./gradlew assemble
ls app/build/outputs/apk/
app-debug.apk app-debug-unaligned.a
项目场景:
智能家居网关应用
程序
通过Zigbee Coordinator和Zigebee Route(或者Zigbee Endpoint)设备通信,获取或者改变设备属性状态
提示:这里简述项目相关背景:
例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大)
关于系统离线
崩溃
问题分成两个阶段原因
排查
。
阶段一 描述(what):
程序
不定时
崩溃
,堆栈信息会直向公共部分如库代码
堆栈信息:
提示:这里描述项目中遇到的问题:
例如:数据传输过程中数据
便有此功能,用法也不复杂,在项目里实现之后发现监测不到【Debug/Release】~~~我勒个擦
搜索SetUnhandledExceptionFilter无效 貌似蛮多人遇到这个问题的,参考几个博客的内容
尝试了几次依然还是捕获
崩溃
失败,遂放弃了此.
昨天线上某业务线项目挂掉了,记录下
排查
流程
查看项目下是否有core.文件、heapdump文件、hs_err.log文件
也可以查看var/log/message文件,通过找到
crash
时的时间对应的相应日志
重点可以看下hs_err*.log,是否包含oom等常见
crash
问题,不过我们的hs_err*.log发现异常是一个nullpointexception,其他没有发现明显问题。
随后观看了下异常栈栈顶部分发现包名不是业务包,询问发现是安全部的一个部署侵入包,于是询问对应的安全部rd并提供hs_er
在 C
程序
中,定位
程序
崩溃
点通常可以通过以下方式进行:
使用调试器:使用调试器可以在
程序
崩溃
时获取
程序
状态的快照,以便更容易地定位问题。可以使用 gdb、lldb、Visual Studio 等调试器。在调试器中,您可以设置断点、单步执行代码,查看变量的值,以及跟踪
程序
执行流程等。
输出调试信息:在
程序
中添加调试输出信息,例如 printf 或者 log 等,可以帮助您更好地了解
程序
执行过程...