`
isiqi
  • 浏览: 16398145 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

gdb用法(二) 在Linux下产生并调试core文件

阅读更多

分析核心(core)文件


在程序发生崩溃时,有时可能无法直接运行GDB来进行调试。比如程序可能是在另外一台机器上运行的,或者因为程序对时间比较敏感,所以手动跟踪调试会产生 无法接受的延迟等。遇到这些情况,就只能等到程序运行结束后才能判断崩溃的原因了。这时需要用到Linux提供的core dump机制。当程序中出现内存操作错误时,会发生崩溃并产生核心文件。使用GDB可以对产生的核心文件进行分析,找出程序是在什么时候崩溃的和在崩溃之 前程序都做了些什么。当然,如果要用GDB来分析核心文件,也必须在编译时加上-g选项来产生调试符号表。


在分析核心文件之前必须确认系统是否允许生成核心文件,很多Linux发行版在默认时禁止生成核心文件。为了生成核心文件,首先必须执行下面的命令:
# ulimit -c unlimited
然后就可以生成核心文件了。

$ uname -a
Linux dev 2.4.21-9.30AXsmp #1 SMP Wed May 26 23:37:09 EDT 2004 i686 i686 i386 GNU/Linux

再看看默认的一些参数,注意core file size是个0,程序出错时不会产生core文件了。

$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) 4
max memory size (kbytes, -m) unlimited
open files (-n) 2048
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 7168
virtual memory (kbytes, -v) unlimited


这里仍以前面的debugme程序为例,再次执行下面命令将产生核心文件:

# ./debugme
            Enter a string to count words:Happy new year!
            The number of words is 3.
            Segmentation fault (core dumped)



生成的核心文件名根据系统配置的不同会有所差异。要在GDB中分析核心文件,除了要给出核心文件的文件名外,还必须给出生成该核心文件的可执行程序的名称,示例如下:

#gdb debugme core.547
            ……
            Program terminated with signal 11, Segmentation fault.
            Reading symbols from /lib/libc.so.6...done.
            ……



从GDB的输出信息中可以看出,产生这个核心文件的原因是因为程序收到了序号为11的信号。如果想知道程序在崩溃之前运行到了哪里,可以使用“backtrace”或“info stack”命令查看一下堆栈的历史记录。示例如下:

(gdb) info stack
            #0 0x4000c6ac in _dl_fini () from /lib/ld-linux.so.2
            #1 0x40057940 in exit () from /lib/libc.so.6
            #2 0x4004291f in _libc_start_main () from /lib/libc.so.6



由上可知,程序崩溃时正处于_dl_fini()函数之中。但很多时候程序员感兴趣的可能并不是这个,而是exit()或_libc_start_main()函数,因为它们才可能是问题真正的症结所在。GDB提供的“frame”命令可以用来在不同的调用上下文中切换。例如下面的命令可以查看exit()函数在执行时的状况:

(gdb) frame 1
            #1 0x40057940 in exit () from /lib/libc.so.6



此外还可以用“up”或“down”命令在不同的函数调用上下文中切换。开发人员使用这三条命令可以很轻松地实现调用栈的遍历。在分析核心文件时,通过将遍历栈的命令和检查变量值的“print”命令结合起来,就能够复原程序运行时的全部景象。

分享到:
评论

相关推荐

    Linux下怎么产生core dump文件及GDB怎么调试core.pptx

    ### Linux下产生Core Dump文件及使用GDB调试详解 #### 一、Core文件的基本概念与作用 当一个程序因为某些原因而崩溃时,系统内核会自动创建一个名为`core`的文件,这个文件包含了程序崩溃时刻的内存映像以及其他...

    linux下core文件调试方法

    core文件是Linux下非常有用的调试工具之一,通过合理地设置core文件的生成与命名规则,并结合使用GDB和其他辅助工具,我们可以有效地定位程序中的错误,解决复杂的问题。此外,掌握core文件的高级调试技巧,如多线程...

    linux 使用GDB调试 资料

    在Linux操作系统中,GDB(GNU Debugger)是一个强大的命令行工具,用于调试C、C++以及其他支持的语言编译的程序。GDB可以帮助开发者追踪代码执行流程,定位和修复程序中的错误,是Linux环境下进行软件开发不可或缺的...

    Linux下core文件调试方法.pdf

    在 Core 文件所在目录下键入 `gdb -c core` 命令,可以启动 GDB 调试器,并显示生成此 Core 文件的程序名、中止此程序的信号等信息。如果已经知道是由什么程序生成的 Core 文件,例如 MyServer 崩溃了生成 core....

    在X86环境下GDB调试使用方法

    GDB 调试工具在 X86 环境下的使用方法 在 X86 环境下,GDB 是一个强大的调试工具,主要用于调试 C/C++ 程序。要使用 GDB,需要在编译时添加调试信息,以便在调试时可以查看函数名、变量名等信息。 GDB 的主要功能...

    Linux调试GDB中文手册

    ### Linux调试GDB中文手册知识点解析 #### GDB概述 - **定义与作用**:GDB(GNU Debugger)是一款由GNU开源组织发布的强大且灵活的程序调试工具,主要用于Unix及类Unix系统(如Linux)环境下的软件开发。尽管图形...

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

    在Linux操作系统中,core文件是当程序因某种错误崩溃时,内核生成的一种特殊文件,它包含了程序崩溃时的内存映像和调试信息。这对于排查和解决程序中的错误,特别是像“段错误”这样的运行时错误,是非常有价值的。...

    Linux下编译与调试((gcc、gdb)

    在Linux操作系统中,开发C和C++程序...通过`gcc`和`gdb`的配合使用,开发者可以在Linux环境下高效地编译、调试C和C++程序,找出并解决代码中的问题。熟练掌握这两个工具对于任何Linux环境下的软件开发人员都至关重要。

    Linux环境下GDB的使用

    GDB 是一个强大的命令行调试工具,在 Linux 环境下广泛应用于 C++ 开发调试。以下是 GDB 的使用方法和知识点总结: GDB 概述 GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具。它可以帮助开发者完成...

    linux core 文件介绍

    下面将详细介绍 Linux Core 文件的概念、生成机制、使用方法等方面的知识点。 一、Core 文件的简单介绍 Core 文件是一个内存映象,包括调试信息,是在程序崩溃时生成的。它的主要作用是用于调试目的,帮助开发者...

    Linux系统下GDB调试指南.docx

    在Linux系统中,当应用程序出现异常崩溃时,通常可以通过GDB(GNU Debugger)工具来调试core dump文件进行问题定位与分析。这一过程主要包括三个关键步骤:一是配置系统以捕获崩溃并生成core dump文件;二是安装合适...

    Linux下GDB调试GCC

    在Linux环境下,GDB(GNU调试器)是用于调试C和C++程序的强大工具,它提供了丰富的功能,如设置断点、单步执行、查看变量值等,是开发者不可或缺的调试助手。本文将深入探讨如何在Linux环境中使用GDB调试GCC编译的...

    GDB调试器及调试方法

    ### GDB调试器及调试方法 #### GDB简介 ...熟练掌握GDB的使用方法对于任何从事Linux开发工作的人员来说都是非常重要的。通过不断地实践和探索,开发者可以更加有效地利用GDB来提升自己的编程技能。

    Linux下的段错误Segmentationfault产生的原因及调试方法经典.pdf

    在 Linux 系统中,我们可以使用 gdb 来调试程序,并使用“core”命令来生成 core 文件。然后,我们可以使用“gcore”命令来分析 core 文件,找到出错的位置。 段错误是 Linux 系统中的一种常见错误,它的产生非常...

    GDB调试程序文档

    - 使用core dump文件进行调试: `gdb <program> core` #### 四、GDB与图形化调试器的对比 - **命令行VS图形界面**: - GDB的优点在于其强大的命令行功能,可以灵活地控制调试流程。 - 图形化调试器如VC++等则提供...

    gdb core分析方法

    在Linux系统中,gdb(GNU调试器)是一款强大的工具,用于调试C、C++和其他支持的语言编写的程序。当程序意外崩溃或挂起时,它通常会产生一个核心转储文件(简称core dump),这个文件包含了程序崩溃时的内存状态、...

    浅析Linux下core文件.doc

    在实际开发过程中,理解core文件的生成机制和使用方法对于提升软件质量至关重要。记住,每个操作系统可能会有不同的core文件处理方式,因此了解所使用的具体UNIX或Linux发行版的相关信息是十分必要的。

Global site tag (gtag.js) - Google Analytics