利用gdb调试core文件
gd调试命令,gdb调试core文件

gd调试命令,gdb调试core⽂件使⽤ gcc -g test.c -o test.out 编译程序,只有加-g参数才⽀持gdb调试;
然后 gdb ./test.out 运⾏可执⾏⽂件,进⼊gdb调试模式(gdb),在括号后⾯的输⼊命令;
(gdb)help:查看命令帮助
(gdb)start:单⾏执⾏
(gdb)l:查看源程序
(gdb)n:执⾏下⼀⾏
(gdb)s:进⼊被调函数⾥⾯
(gdb)bt:查看函数调⽤栈
(gdb)p 变量:打印变量值
(gdb)f:切换函数栈帧
(gdb)run:重新开始运⾏⽂件
(gdb)finish:结束当前函数,返回到函数调⽤点
(gdb)q:退出gdb
(gdb)回车:执⾏上⼀条命令
调试core⽂件:
先找到core的发⽣未知:find $HOME -name core
然后进⼊到core发⽣的⽬录,可以使⽤ file + ⽬录辅助定位是哪个可执⾏⽂件报core
然后执⾏ gdb + 可执⾏⽂件
(gdb)where:可以看到哪⼀⾏有错。
Linux下交叉编译gdb,gdbserver+gdb的使用以及通过gdb调试core文件

Linux下交叉编译gdb,gdbserver+gdb的使⽤以及通过gdb调试core⽂件交叉编译gdb和gdbserver$ tar jxvf gdb-7.2.tar.bz2注:⼩技巧:Linux下⼀般压缩⽂件后缀为.tar.bz2和.tar.gz,它们解压命令有两三个选项是⼀致的:xf(v),前者再加上j选项,后者再加上z选项。
3、进⼊该⽬录$ cd gdb-7.2/4、配置$./configure --target=arm-linux --program-prefix=arm-linux- --prefix=/usr/local/arm-gdb注:--target=arm-linux意思是说⽬标平台是运⾏于ARM体系结构的linux内核;--program-prefix=arm-linux-是指⽣成的可执⾏⽂件的前缀,⽐如arm-linux-gdb,--prefix是指⽣成的可执⾏⽂件安装在哪个⽬录,这个⽬录需要根据实际情况作选择。
如果该⽬录不存在,会⾃动创建,当然,权限⾜够的话。
5、编译、安装$ make$ make install幸运的话,会在--prefix指定的⽬录下⽣成三个⼦⽬录:bin、lib、share,我们需要的arm-linux-gdb就在其中的bin⽬录下。
如果你不⼩⼼查看它的⼤⼩的话,会发觉它有14MB那么⼤!天呐!怎么会占这么多空间?没关系,我们可以为它瘦⾝。
没错!就是使⽤strip命令!$ strip arm-linux-gdb -o arm-linux-gdb-stripped$ ls -lh总计 33M-rwxr-xr-x 1 latelee root 14M 12-14 16:16 arm-linux-gdb-rwxr-xr-x 1 latelee root 3.1M 12-14 16:25 arm-linux-gdb-stripped可以看到,strip后的⽂件⼤⼩只有3.1MB,瘦⾝效果明显!如果做⼴告的话,绝对有说服⼒。
gdb调试coredump原理

gdb调试coredump原理GDB调试coredump原理引言:在开发过程中,我们经常会遇到程序崩溃的情况。
为了定位程序崩溃的原因,我们需要进行调试。
而在调试过程中,有一种特殊的情况,叫做coredump。
当一个程序发生严重错误或崩溃时,操作系统会生成一个core文件,记录程序崩溃时的内存状态。
通过调试这个core文件,我们可以更加方便地找到程序的问题所在。
本文将以gdb调试coredump为主题,详细介绍其原理和使用方法。
一、什么是coredump?Coredump指的是当一个程序因为错误而异常终止时,操作系统将程序的内存状态保存到一个特殊的文件中,即core文件。
这个core文件包含了程序崩溃时的内存状态、寄存器的状态以及函数、变量的信息。
对于GDB 来说,这个core文件就是一个可调试的文件,我们可以使用GDB来调试这个文件,进一步定位程序错误的原因。
二、生成coredump文件的配置生成coredump文件的配置主要涉及到操作系统的配置和程序的编译配置。
1. 操作系统配置大多数Unix-like系统默认是开启coredump功能的,但有时会被禁用。
我们可以通过下面的命令来查看系统是否开启了coredump功能:ulimit -c如果输出为0,则表示未开启,大于0则表示开启。
我们可以通过下面的命令来开启coredump功能,并设置生成的core文件大小:ulimit -c unlimitedulimit -c <size>其中,<size>指的是core文件的大小,单位为字节。
2. 编译配置在编译程序时,我们需要添加-g选项来启用调试信息的产生。
例如,我们可以使用gcc编译C程序时,添加如下的命令行选项:gcc -g -o program program.c通过以上配置,就可以在程序崩溃时生成core文件。
三、使用GDB调试coredump文件1. 命令行方式通过命令行方式使用GDB调试coredump文件非常简单,只需指定coredump文件和可执行文件即可。
利用core文件调试程序

CommBuf = '\0' <repeats 79 times>}, ConnType = 0 '\0',
SQLType = 0 '\0', DBServer = '\0' <repeats 19 times>,
CommBuf = '\0' <repeats 79 times>}, ConnType = 0 '\0', SQLType = 0 '\0',
DBServer = '\0' <repeats 19 times>, DataBase = '\0' <repeats 19 times>,
000\000\000\000\000\000\000\000\000(2N㤘+\000\000S} :7\000\000\000\000\000\000
00`+\000\000\000\000\000\000\000\000\000\000\001", '\0' <repeats 15 times>, "\
#1 0x000000373b246729 in vfprintf () from /lib64/libc.so.6
#2 0x000000373b263689 in vsprintf () from /lib64/libc.so.6
#3 0x000000373b24d0e8 in sprintf () from /lib64/libc.so.6
core文件查看

core⽂件查看步骤:(1)⽆论你是⽤Makefile来编译,还是直接在命令⾏⼿⼯输⼊命令来编译,都应该加上 -g 选项。
(2)⼀般来说,在默认情况下,在程序崩溃时,core⽂件是不⽣成的(很多Linux发⾏版在默认时禁⽌⽣成核⼼⽂件)。
所以,你必须修改这个默认选项,在命令⾏执⾏:ulimit -c unlimited表⽰不限制⽣成的core⽂件的⼤⼩。
(3)运⾏你的程序,不管⽤什么⽅法,使之重现Segmentation Fault错误。
(4)这时,你会发现在你程序同⼀⽬录下,⽣成了⼀个⽂件名为 core.*** 的⽂件,即核⼼⽂件。
例如,“core.15667”这样的⽂件。
(5)⽤GDB调试它。
假设你的可执⾏程序名为test,则在命令⾏执⾏:gdb test core.15667然后可能会显⽰出⼀堆信息:GNU gdb Fedora (6.8-27.el5)Copyright (C) 2008 Free Software Foundation, Inc.This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law. Type "show copying"and "show warranty" for details.This GDB was configured as "i386-redhat-linux-gnu"...warning: Can't read pathname for load map: Input/output error.…………………(中间还有很多内容,此处省略)……………………………Loaded symbols for /usr/lib/libgpg-error.so.0Core was generated by `./test'.Program terminated with signal 11, Segmentation fault.[New process 15668]#0 0x0804c760 in thread _handler () at test.cpp:707707 CDev* cur_dev = *it_d;然后我们输⼊并执⾏命令 bt :(gdb) bt就会得到类似于下⾯的信息:#0 0x0804c760 in thread _handler () at test.cpp:707#1 0x006b149b in start_thread () from /lib/libpthread.so.0#2 0x0060842e in clone () from /lib/libc.so.6于是,我们⼀眼就看出来了:程序是在第707⾏使⽤指针时出的问题。
gdb调试coredump文件过程:

gdb coredump应用程序 coredump文件 调试coredump文件
通过以上三步就可以调试coredump文件了 通过以下命令调试coredump文件 info threads 显示所有线程 bt 显示线程堆栈信息 thread thread_num 切换线程 frame num 切换栈 info r 显示当前帧的寄存器信息 (每一帧的寄存器信息都是不相同的)
readelf应用coredump readelf -h 读取coredump文件头 readelf -wl 读取应用程序debug_line readelf -源自f 读取应用程序fde和cie信息
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
gdb调试 coredump文件过程:
第一步:首先需要一个进程的 coredump文件,怎么搞出 coredump文 件 呢 ?
1、 ps -fax|grep
进程名称 找到进程的pid
2、gdb -p pid
调试进程
3、gcore coredump名称 则生成core文件
第二步:找出coredump文件的应用程序
1、gdb -c corefile 使用gdb调试core文件
2、info auxv
索引31对应的是core文件的应用程序
第三部:gdb使用应用程序调试coredump文件
core文件设置及其使用

命令:gdb 可执行程序路径 core 文件路径 运行之后输入 bt
例如:gdb /app/bin/nvr_sys /tmp/usb0/core_2013_03_01 运行之后输入 bt 或者 where
命令:gdb –c core 文件路径 可执行程序路径
2,在程序中修改 core 文件设置 一般系统会禁止在产生段错误的时候生成 core 文件,当我们启动一个程序的时候可以
在程序当中进行修改 core 文件的设置。 所有关于进程资源的限制,都可以通过 getrlimit 函数与 setrlimit 函数进行设置 #include<sys/resource.h> int getrlimit(int resource,struct rlimit *rlptr); //获取当前进程的限制值 int setrlimit(int resource struct rlimit *rlptr);//设置当前进程的限制值 struct rlimit { rlim_t rlimt_cur; //soft limit:current limit 软件值,也就是进城当前的值 rlim_t rlim_max; //hard limit:maximum valur for rlim_cur //硬件值,也就是可以设置的最大值 };
在程序中设置 core 文件的时候可以使用以下程序: void corefile_enable(void) {
struct rlimit rlim, rlim_new;
if (getrlimit(RLIMIT_CORE, &rlim) == 0) //获取当前进程的限制值 {
用GDB调试程序--调试器GDB常用功能

一,GDB调试器简介GDB是Linux下的常用调试器,主要用于调试源代码、调试运行中的进程和查看core dump文件。
Linux下的调试器主要有gdb、cgdb、ddd、eclipse。
GDB调试器的运行速度快、能够进行源代码同步显示。
使用-tui 选项开启gdb命令输入和源代码的分屏显示,tui即Terminal User Interface。
二,GDB常用调试命令a)调试可执行文件以源代码为/home/zebra/目录下的test.c文件产生的可执行文件test为例(可执行文件使用gcc进行编译,并使用-g选项以产生调试信息),进行命令的说明(详细源代码参见第三部分:三,调试实例分析 )。
gdb调试源代码流程:1,开启gdb程序,即运行如下命令:gdb -q (-q用以使得gdb不输出gdb程序的版本等信息)2,指定调试的二进制文件:file test3,list查看源代码4,设定断点breakpoint mainbreakpoint sub上述分别在main函数和sub函数处设定了断点。
断点可以设置在任意已知源代码文件的某一行,某一个函数,同时可以指定是设置在哪个/哪些线程上(见下边描述)。
5,运行可执行文件:run6,这样程序会运行到断点处停止下来,gdb会打印当前断点的信息。
7,使用s 或者n进行单步调试。
s即step,n即next都是执行一条语句,然后停下来。
如果想执行一条汇编语句,则可以使用si ,ni,即step instruction,next instruction。
8,bt命令查看当前的调用栈,bt即backtrace。
9,info frame查看函数帧信息。
10,frame n 进入某个函数帧(编号为n)11,info 命令可以对当前的函数帧的寄存器、局部变量、函数的参数进行查看。
info register;info local;info args。
12,disassemble对当前函数对应的二进制进行反汇编。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利用gdb调试core文件
什么是core dump
core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump。
(linux中如果内存越界会收到SIGSEGV信号,然后就会core dump)
在程序运行的过程中,有的时候我们会遇到Segment fault(段错误)这样的错误。
这种看起来比较困难,因为没有任何的栈、trace信息输出。
该种类型的错误往往与指针操作相关。
往往可以通过这样的方式进行定位。
造成segment fault,产生core dump的可能原因
1、内存访问越界
a) 由于使用错误的下标,导致数组访问越界
b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符
c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆。
应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。
2、多线程程序使用了线程不安全的函数。
3、多线程读写的数据未加锁保护。
对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成core dump
4、非法指针
a) 使用空指针
b) 随意使用指针转换。
一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。
这是因为如果这段内
存的开始地址不是按照这种结构或类型对齐的,那么访问它时就很容易因为bus error而core dump.
5、堆栈溢出
不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。
配置操作系统使其产生core文件
首先通过ulimit命令查看一下系统是否配置支持了dump core的功能。
通过ulimit -c或ulimit -a,可以查看core file大小的配置情况,如果为0,则表示系统关闭了dump core。
可以通过ulimit -c unlimited来打开。
若发生了段错误,但没有core dump,是由于系统禁止core 文件的生成。
解决方法:
$ulimit -c unlimited(只对当前shell进程有效)
或在~/.bashrc的最后加入:ulimit -c unlimited(一劳永逸)
# ulimit -c
$ ulimit -a
core file size (blocks, -c) 0
dataseg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
用gdb查看core文件
发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行.
gdb [exec file] [core file]
如: gdb ./test test.core
然后使用bt查看调用堆栈。