`
猫太的鱼
  • 浏览: 242680 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

学会用core dump调试程序错误

 
阅读更多
      在使用半导体作为内存的材料前,人类是利用线圈当作内存的材料(发明者为王安),线圈就叫作core ,用线圈做的内存就叫作“core memory”。(线圈的单词应该是coil,呵呵)如今,半导体工业澎勃发展,已经没有人用线圈当内存了,不过,在许多情况下,人们还是把内存叫作“core”。所以注意了:这里的core不是核心,而是内存。不过结合实际来看,好像也有点“内核所占内存”的意思。
      core dump又是什么东东? 我们在开发(或使用)一个程序时,最怕的就是程序莫明其妙地挂掉。虽然系统没事,但我们下次仍可能遇到相同的问题。于是,这时操作系统就会把程序挂掉时的内存内容写入一个叫做core的文件里(这个写入的动作就叫dump,dump的英语意思是垃圾、倾倒。从这里来看,这些内存的内容是程序错误运行的结果,所以算是垃圾,把他弄出来就好比从大的内存池里“倾倒”。),以便于我们调试。这个过程,因此叫做core dump。

1. 在嵌入式系统中,有时core dump直接从串口打印出来,结合objdump查找ra和epa地址,运用栈回溯,可以找到程序出错的地方。

2. 在一般Linux系统中,默认是不会产生core dump文件的,通过ulimit -c来查看core dump文件的大小,一般开始是0,可以设置core文件大小,ulimit -c 1024(kbytes单位)或者ulimit -c unlimited。

3. core dump文件输出设置,一般默认是当前目录,可以在/proc/sys/kernel中找到core-user-pid,通过

引用
echo "1" > /proc/sys/kernel/core-user-pid使core文件名加上pid号,还可以用

mkdir -p /root/corefile

echo "/root/corefile/core-%e-%p-%t" > /proc/sys/kernel/core-pattern

控制core文件保存位置和文件名格式。

以下是参数列表:
    %p - insert pid into filename 添加pid
    %u - insert current uid into filename 添加当前uid
    %g - insert current gid into filename 添加当前gid
    %s - insert signal that caused the coredump into the filename 添加导致产生core的信号
    %t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
    %h - insert hostname where the coredump happened into filename 添加主机名
    %e - insert coredumping executable name into filename 添加命令名

4. 用gdb查看core文件:
下面我们可以在发生运行时信号引起的错误时发生core dump了.编译时加上-g
发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行.
gdb [exec file] [core file]
如:
gdb ./test test.core
在进入gdb后, 用bt命令查看backtrace以检查发生程序运行到哪里, 来定位core dump的文件行.

5. 给个例子

test.c



void a()

{

   char *p = NULL;

   printf("%d/n", *p);

}

 

int main()

{

    a();

    return 0;

}



编译 gcc -g -o test test.c

运行 ./test

报segmentation fault(core dump)

gdb ./test test.core如果生成的是test.core.


GDB中键入where,就会看到程序崩溃时堆栈信息(当前函数之前的所有已调用函数的列表(包括当前函数),gdb只显示最近几个),我们很容易找到我们的程序在最后崩溃的时候调用了core_dump_test.c第7行的代码,导致程序崩溃。注意:在编译程序的时候要加入选项-g。您也可以试试其他命令, 如 fram、list等。更详细的用法,请查阅GDB文档。

core文件创建在什么位置

在进程当前工作目录的下创建。通常与程序在相同的路径下。但如果程序中调用了chdir函数,则有可能改变了当前工作目录。这时core文件创建在chdir指定的路径下。有好多程序崩溃了,我们却找不到core文件放在什么位置。和chdir函数就有关系。当然程序崩溃了不一定都产生core文件。

什么时候不产生core文件

在下列条件下不产生core文件:
( a )进程是设置-用户-ID,而且当前用户并非程序文件的所有者;
( b )进程是设置-组-ID,而且当前用户并非该程序文件的组所有者;
( c )用户没有写当前工作目录的许可权;
( d )文件太大。core文件的许可权(假定该文件在此之前并不存在)通常是用户读/写,组读和其他读。
分享到:
评论

相关推荐

    浅析Linux中的core文件及调试方法

    总之,Linux中的core文件是调试程序的关键工具,尤其是在处理诸如段错误这样的运行时错误时。理解core文件的生成原理,学会使用`ulimit`和调试器,可以帮助开发者有效地诊断和修复程序中的问题。

    VB.NET调试技术手册

    在VB.NET开发中,调试不仅关乎找出程序中的错误,还包括理解代码执行流程、检查变量状态以及优化性能。本书将涵盖以下核心知识点: 1. **Visual Studio IDE调试器**:Visual Studio作为VB.NET的主要开发环境,内置...

    java c++ PHP c# 代码快速调试工具

    此外,PHP的错误报告和var_dump()函数也是调试的基础手段。 4. **C# 调试**:C#的调试主要依赖于Visual Studio的调试器,它提供了强大的功能,如逐步执行、数据监视、异常处理等。对于.NET Core项目,也可以使用...

    Unix程序设计教案

    9. **调试技巧**:学会使用gdb等调试工具,分析core dump,是定位和解决问题的关键。 10. **错误处理与日志记录**:良好的错误处理机制和日志记录是软件可靠性的保障。学习如何正确使用errno、perror和strerror,...

    Linux C编程一站式学习

    8. **调试技巧**:使用gdb调试工具进行程序调试,学会分析core dump文件。 9. **并发编程**:理解线程(pthread)和信号(signal)的概念,以及如何在C程序中实现多线程和信号处理。 10. **网络编程**:学习套接字...

    LINUX编程白皮书

    9. **错误处理和调试**:掌握如何处理和调试程序中的错误是每个程序员的基本技能,这包括理解和使用errno、strerror等函数,以及学会阅读和理解core dump。 10. **版本控制系统**:使用版本控制系统如Git来跟踪代码...

    UNIX环境高级编程第二版.pdf

    7. **错误处理和调试**:Unix提供了丰富的错误诊断工具,如strerror、perror、core dump等,帮助开发者定位和修复程序中的问题。此外,学会使用gdb等调试器也是提高开发效率的关键。 8. **Shell脚本编程**:Unix ...

    Linux 编程白皮书

    学会使用gdb进行程序调试,理解core dump,以及如何利用性能分析工具如strace、perf等来优化代码性能。 十、构建与打包 Linux下常用构建工具如make、autotools、cmake等,可以帮助自动化编译和构建过程。同时,了解...

    linux c一站式网页教程

    10. **调试技巧**:介绍gdb调试器的使用,以及core dump分析,帮助开发者找出程序错误。 11. **编程实践**:提供实际项目案例,如编写简单的shell脚本、实现简单的文件系统或网络服务,巩固理论知识并提升实战能力...

    Linux编程白皮书Linux编程白皮书

    8. **调试与性能分析**:学会使用gdb进行程序调试,分析core dump,定位运行时错误。同时,使用性能分析工具如strace、perf、gprof等,可以发现程序性能瓶颈,进行优化。 9. **shell脚本编程**:bash等shell脚本...

    Linux编程问题百解

    9. **调试技巧**:学会使用`gdb`调试器,理解核心转储(core dump)的用途,以及如何分析日志和性能瓶颈。 10. **Makefile与构建工具**:了解如何编写Makefile进行项目构建,掌握`make`命令的使用,以及更现代的...

    UNIX环境高级编程英文第三版源码

    10. **程序调试**:使用gdb进行程序调试,理解核心转储(core dump)以及如何分析它。 11. **POSIX标准**:理解POSIX标准对UNIX系统编程的影响,以及如何编写可移植的代码。 源码阅读可以帮助读者深入理解上述概念...

    深入学习unix

    10. **调试技巧**:学会使用gdb等调试工具,以及coredump分析,可以帮助解决程序中的错误和问题。 11. **Unix标准与版本**:Unix有许多不同的变体,如Linux、FreeBSD和Solaris。理解POSIX标准和Open Group认证,有...

Global site tag (gtag.js) - Google Analytics