dump和coredump

来源:互联网 发布:ctp交易接口源码 编辑:程序博客网 时间:2024/06/13 16:49

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

我感觉在计算机的世界里,没有将就,没有差不多,没有大约,没有似乎。。。只有对与不对,只有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


3 1
原创粉丝点击