程序崩溃调试记录和总结

1. 多线程访问共享资源没有加锁

错误提示:Segmentation fault!
解决办法:

  • 多线程读不需要加锁
  • 多线程同时读写则需要加锁
    加锁的方法有互斥量、信号量、读写锁、记录锁、互斥量和条件变量结合提供的事件通知机制。
    C++11里则有,lock_guard,unique_lock.两者都是在构造的时候加锁,析构的时候加锁。但unique_lock提供更多的特性,比如可以指定它在构造的时候不加锁,在需要的时候再调用.lock()加锁。如果和condition_variable结合使用只能用unqiue_lock.

2. 指针变量在定义的时候没有初始化为nullptr,或者在某个时候执行变成了悬挂指针,导致不可预知的错误。

错误提示:Segmentaion fault!
解决方法:

  • 指针变量在声明的时候初始化为nullptr,在使用的时候判断if(!ptr)
  • 仔细检查代码,杜绝出现悬挂指针。

3. std::thread在joinalble状态下析构会导致terminate

错误提示::terminate called without an active exception. Aborted
解决办法:

  • 创建thread的时候调用detach使之变为分离线程
  • thread执行之后调用join等待thread正常结束
    但是在写代码量多了之后,有时候会在甘个代码分支过早退出而引起thread析构而没运行到join语句,这样就会导致terminate;
    示例代码如下:
  1. void foo()
  2. {
  3. //do something;
  4. }
  5. int main()
  6. {
  7. std::thread t(foo);
  8. if(true)return1;
  9. t.join();
  10. return0;
  11. }

代码8时t以foo构造并运行,此是为joinable状态,代码9时程序退出,导致t在t.join()之前析构,thread在joinable状态析构下会导致terminate。~thread函数在cplusplus说明如下:
If the thread is joinable when destroyed, terminate() is called.

来自为知笔记(Wiz)

时间: 2024-07-29 00:17:56

程序崩溃调试记录和总结的相关文章

GPU应用程序Attach调试记录

前期工作 工程路径确认 GPU项目共有6个工程,如图 1-1: 图 1-1  GPU项目工程 这6个工程建议放在同一目录下,否则可能调试时会出现奇怪的问题,比如放在IDE默认的workspace目录下,如图 1-2: 图 1-2  workspace工程目录 测试程序文件名确认 例如测试程序工程叫gpu_test,那么主程序所在的文件名必须是gpu_test.c,不然调试时会报出找不到gpu_test.c警告.示例如图 1-3: 图 1-3  确认测试程序主文件 GDB调试设置 新建调试项目 打

dmesg 程序崩溃调试

[[email protected] log]# cat -n /root/xx.c 1 2 3 #include <stdio.h> 4 5 void func(char *p) 6 { 7 *p = 'p'; 8 } 9 10 int main(int argc, char *argv[]) 11 { 12 char *p=NULL; 13 func(p); 14 15 return 0; 16 } [[email protected] log]# /root/xx   [[email p

dmesg 程序崩溃调试2

dmesg命令基于缓冲区打印信息dmesg -c可以清除该内存信息清除后demsg 命令不显示任何信息,但可以到/var/log/dmesg查看信息 dmesg |tail 20dmesg |head 20dmesg |grep sdadmesg |grep ttydmesg |grep memorydmesg |grep DMAdmesg |grep usb [[email protected] var]# dmesg | more Linux version 2.6.32 ([email p

IOS调试技巧:当程序崩溃的时候怎么办 iphone IOS

转载:http://article.ityran.com/archives/1143 有这样一种情形:当我们正在快乐的致力于我们的app时,并且什么看都是无比顺利,但是突然,坑爹啊,它崩溃了.(悲伤地音乐响起) 我们需要做的第一件事就是:不要惊慌. 修复崩溃不是很困难的.假如你崩溃了,并且胡乱的改些东西,而且还在不停的念着咒语希望bug神奇的自动消失,你大多数情况下都会使情况更麻烦.相反的,你需要知道一些系统的方法,并且学习怎么找到崩溃和他的原因. 第一件需要知道的就是在你的代码中准确的找到cr

Android记录程序崩溃Log写入文件

将导致程序崩溃的堆栈调用Log写入文件,便于收集bug.在调试安卓程序,由于某些原因调试时手机不能连接PC端,无法通过IDE查看程序崩溃的Log,希望log能够写入文件中,对于已经发布的App可以通过该功能收集Bug. 01import java.io.FileNotFoundException; 02import java.io.FileOutputStream; 03import java.io.IOException; 04import java.io.PrintStream; 05imp

Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 (需要在运行时生成core dump文件,QMAKE_CC += -g)

记录一下 Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 需要在运行时生成core dump文件 首先在pro结尾里加入 QMAKE_CC += -g QMAKE_CXX += -g QMAKE_LINK += -g 在终端输入 ulimit -c 显示为 0 然后输入 ulimit -c unlimited 继续在终端运行编写的程序 出错后,会在当前目录生成 core 文件 然后在终端执行 “gdb 你的程序名 core” 然后输入 bt 对该错误进行跟踪调试 (gdb)

Android socket 学习记录 之 执行new socket(ip, port)程序崩溃

这段时间在学习Android的socket编程,我不是专做APP的,做的是bootloader.驱动.hal.framework这个线的,也就是系统搭建和功能优化设计.为了打通这整条线,为此学习了不少东西,今天把Android的socket学习记录一下,以防止以后会出现这样的低级错误. 我这里是在极客学院的源码基础上做的自己的一些添加和修改,学习开始不就是先会修改么,举一反三,自然就很快学会了.由于看过视频和资料后就迫不及待的按照自己的想法想做一个功能,但是遇到麻烦了,就是执行new socke

Python Cookbook(第3版)中文版:14.12 调试基本的程序崩溃错误

14.12 调试基本的程序崩溃错误? 问题? 你的程序崩溃后该怎样去调试它? 解决方案? 如果你的程序因为某个异常而崩溃,运行 python3 -i someprogram.py 可执行简单的调试.-i 选项可让程序结束后打开一个交互式shell.然后你就能查看环境,例如,假设你有下面的代码: # sample.py def func(n): return n + 10 func('Hello') 运行 python3 -i sample.py 会有类似如下的输出: bash % python3

Windows 程序 dump 崩溃调试

Windows 程序捕获崩溃异常 生成dump 概述 事情的起因是,有个同事开发的程序,交付的版本程序,会偶尔随机崩溃了. 悲催的是没有输出log,也没有输出dump文件. 我建议他给程序代码加个异常捕获,在崩溃时生成dump,方便找出问题点. 隔了一天之后,短暂交流,发现他没有这个开发经验,我只好披挂上阵了. 开动 查阅MSDN文档,和stackoverlfow.com的相关文章,可知 SetUnhandledExceptionFilter 可以捕获触发系统崩溃的异常 风风火火开始写代码 vo