只要是程序猿一族,就会犯不少错(主要指的是编程),犯错了怎么办,就得找,就得解决,如果不解决,那这个程序就白写了!

我感觉在计算机的世界里,没有将就,没有差不多,没有大约,没有似乎。。。只有对与不对,只有0和60,60和90的区别!!

所以既然写了程序,那么就要把程序写完,要么不写,出错了怎么办,那也只有低头找错,否则从#include起,所有一切可能将付诸东流!
这里介绍几种比较有用的调试的方法:Valgrind,coredump文件,log文件,直接codeview(小),F5(小),GDB等一些。Valgrind用的比较少,看见了就记录一下!有待学习和提高!

当我们无论是使用着计算机浏览网页或者编程的时候,说不定啥时候系统就会出现异常或者崩溃的时候,这时候我们
可以通过生成dump文件,然后借助该文件来进行调试。在生产环境中产生的dump文件,拷贝到自己的开发机器上,
把dmp文件和exe, pdb文件放在同一目录下, 然后用编译器(如vc)打开或者用VS2010打开次文件,然后开始调试就会中断到刚才中断的地方,直接可以定位到源代码中的位置,并及时解决问题。

coredump包含了程序运行时的内存,寄存器,堆栈指令,内存管理信息等,可以理解将程序工作的当前状态存储成一个文件,许多程序和操作系统出错时会自动生成一个core文件。帮助程序调试找错。

早成coredump的原因有很多,这里根据经验和查阅的资料总结一下:

1.内存访问越界;
a,由于使用错误的下标,导致数组访问越界;
b,搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常使用结束符;
c,使用strcpy,strcat,strcmp等字符串操作函数,将目标字符串读/写爆,应该使用strncpy,strncat,strlcpy,strncmp等函数防止函数的读写越界;
2.多线程读写数据未加锁保护;
对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则容易造成coredump;
3.非法指针
a,使用空指针;
b,随意使用指针转换,一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构和类型的数据,否则不要将它转换为此种类型的指针,而应该将这段内存拷贝到这种结构或类型中,在访问这个结构类型。
这是因为如果这段内存的开始地址不是因为按照这种结构或类型对齐的,那么在访问的时候很容易出现bus error;
段错误:(segmention fault)通常是在一个非法的地址上进行取值赋值操作造成的;
总线错误:(bus error)通常是指针强制转换,导致CPU读取数据违反了一定的总线规则;
4,堆栈溢出
不要使用大的局部变量,因为局部变量都分配在栈上,这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。

系统dump
由于系统关键/核心进程,产生严重的无法恢复的错误,为了避免系统相关资源受到更大的伤害,系统都会强行停止运行。最长见的原因是;指令走飞(指令跳到一些不属于它的指令位置去执行一些莫名其妙的东西),或者缓冲区溢出,或者内存访问越界。

进程core dump产生的原因,基本等同于系统的DUMP,操作系统可以再一个进程出问题时,在不影响其它进程的情况下,终止此进程的运行,并将相关环境保存下来,这就是core dump文件,可供分析。coredump的时候,操作系统会将进程异常终止并释放其占有的资源,不可能对本身的运行造成为害。这是与系统dump的根本区别的一点,系统dump产生时,一定伴随着系统的崩溃和停机。进程core dump时只造成进程被终止,系统本身不可能崩溃;

一 在linux下支持生成core文件的方法:

首先需要确认当前会话的ulimit -c,若为0,则不会产生对应的coredump;

在ect/profile 中增加一行;

ulimit -c unlimit //把core的大小设为无限;

用GDB来查看core文件:
GDB ./test test.core

在进入gdb后, 用bt命令查看backtrace以检查发生程序运行到哪里, 来定位core dump的文件->行.

解除 Linux 系统的最大进程数和最大文件打开数限制:
 vi /etc/security/limits.conf
        # 添加如下的行
        * soft noproc 11000
        * soft nofile 4100

:* 代表针对所有用户,noproc 是代表最大进程数,nofile 是代表最大文件打开数

2 在windows下使用MiniDumpWriteDump API来生成程序的Dump:
MiniDumpWriteDump是MS DbgHelp.dll中一个API,用于导出当前运行的程序的Dump,这个dll程序系统中都有!
其实这种文件的生成在各种游戏的维护中也可以产生,比如魔兽世界,CS的堆栈平台,有时候系统突然崩溃,这时候就需要你填写一个用户,然后生成一个文件提交给服务器,反馈你的出错信息,其实通过email发送的就是dump文件,公开发者们修改bug。不过其中需要调试符号文件(.pdb),对于Debug来说是生成的,但是release版来说默认是不生成的,不过可以再编译器进行设置,让它也生成pdb文件。有了pdb文件后,我们就可以用WinDBG等调试器来分析异常的发生情况。
程序需要使用Dbghelp.h和Dbghelp.lib文件;
生成dump函数static void DumpMiniDump(HANDLE hFile, PEXCEPTION_POINTERS excpInfo)
{
}
然后再加上自己的测试函数,这样就可以一步步的找出自己程序问题所在!!

参考资料:

http://blog.csdn.net/tenfyguo/article/details/8159176/

http://www.cnblogs.com/lijunjie/articles/1806847.html

http://blog.csdn.net/xhk456/article/details/7523150

http://www.cppblog.com/woaidongmao/archive/2011/05/10/146086.html

dump和coredump相关推荐

  1. Linux Core Dump

     1. 前言: 有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). 这通常都是指针错误引起的. 但这不像编译错误一样会提示到文件->行, 而是没有任何信息, 使得我们 ...

  2. 段错误调试神器 - Core Dump详解

    一.前言: 有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). 这通常都是指针错误引起的. 但这不像编译错误一样会提示到文件某一行, 而是没有任何信息, 使得我们的调试变得 ...

  3. Java VisualVM

    文章目录 1.Java VisualVM简介(Introduction to Java VisualVM) 1.1 Java VisualVM简介(Introduction to Java Visua ...

  4. linux系统core dump设置,linux coredump设置

    1. core 在Linux下程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息,编译时需要加上 -g -Wall). 使用gdb来查看core文件,可以指 ...

  5. 认识Java Core和Heap Dump

    什么是Java Core和Heap Dump Java程序运行时,有时会产生Java Core及Heap Dump文件,它一般发生于Java程序遇到致命问题的情况下. 发生致命问题后,Java进程有时 ...

  6. 学会用core dump调试程序错误(转)

    前言 最近在项目中遇到大型程序出现SIGSEGV ,一直不知道用core dump工具来调试程序,花了近一周的时间,才定位问题,老大很生气,后果很严重,呵呵,事后仔细学习了这块的知识,了解一点core ...

  7. linux 崩溃文件 coredump 简介

    目录 1.什么是coredump 2.开启或关闭core文件的生成 3.造成程序core的原因 4.用GDB调试coredump 1.什么是coredump 我们经常听到大家说到程序core掉了,需要 ...

  8. gdb coredump

    一,什么是coredump 跑程序的时候经常碰到SIGNAL 或者 call trace的问题,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满 ...

  9. gdb coredump

    写C/C++程序经常要直接和内存打交道,一不小心就会造成程序执行时产生Segment Fault而挂掉.一般这种情况都是因为数组越界访问,空指针或是野指针读写造成的.程序小的话还比较好办,对着源代码仔 ...

最新文章

  1. 北京大兴要打造成未来科技新中心?
  2. jwt获取token_SpringBoot2 高级案例(09): 整合 JWT 框架,解决Token跨域验证问题
  3. R Learnilng 十八讲7-12
  4. [转载] ffmpeg超详细综合教程——摄像头直播
  5. 看反病毒专家对EICAR检测代码的专业解读
  6. vue3+TypeScript封装echarts5组件
  7. linux 线程带参数,Linux中多线程编程并传递多个参数的简单例子
  8. 飞鸽传书mayfish 数据入库验证
  9. 产品经理学习---高级产品经理
  10. 为什么不早一点告诉我?——情场篇
  11. 使用Popup窗口创建无限级Web页菜单(4)
  12. [转]linux下IPTABLES配置详解
  13. linux下c语言 读取文件
  14. OpenStack之Nova模块
  15. python字符串介绍_Python字符串详细介绍
  16. linux考试试题及答案填空题,Linux认证考试试题及答案(20210511022419)
  17. oracle查询创建用户,Oracle创建设置查询权限用户
  18. python求小于n的最大素数_枚举1--求小于n的最大素数
  19. 麒麟KY-RTI分布仿真技术:第一章 简介
  20. android华为隐藏底部虚拟按键,沉浸式状态栏/华为虚拟按键隐藏

热门文章

  1. L2-023 图着色问题 (25 分c++代码)
  2. 「首席架构师精选」精选绘图软件
  3. 降成本利器——SRM之电子招投标
  4. 15款android设备上的代码编辑器,超级方便!
  5. 简单排序算法时间空间复杂度分析及应用(4)-二分插入排序
  6. PHP中如何使用socket进行通信?
  7. SIM卡中UCS2编码的三种格式(80,81,82)分析
  8. 如何选择统计检验方法
  9. 如何创建自己的支付宝收款二维码
  10. 优先级多路选择器和无优先级的多路选择器的区别