利用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对当前函数对应的二进制进行反汇编。
linux下core 文件的调试方法
1)gdb -core=core.xxxx
file ./a.out
bt
2)gdb -c core.xxxx
file ./a.out
bt
4.开发板上使用core文件调试
-----------------------------
1.core文件的生成开关和大小限制
---------------------------------
1)使用ulimit -c命令可查看core文件的生成开关。若结果为0,则表示关闭了此功能,不会生成core文件。
2)使用ulimit -cfilesize命令,可以限制core文件的大小(filesize的单位为kbyte)。若ulimit -cunlimited,则表示core文件的大小不受限制。如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件。在调试此core文件的时候,gdb会提示错误。
可通过以下命令修改此文件:
echo "1" > /proc/sys/kernel/core_uses_pid
2)proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。
可通过以下命令修改此文件:
echo "/corefile/core-%e-%p-%t" > core_pattern,可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
2.core文件的名称和生成路径
----------------------------
GDB调试技巧
1、GDB 启动一般来说GDB主要调试的是C/C++的程序。
要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。
使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。
如:> cc -g hello.c -o hello> g++ -g hello.cpp -o hello如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。
当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。
启动GDB的方法有以下几种:1、gdb <program>program也就是你的执行文件,一般在当然目录下。
2、gdb <program> core用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
3、gdb <program> <PID>如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。
gdb会自动attach上去,并调试他。
program应该在PATH环境变量中搜索得到。
GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。
我在下面只例举一些比较常用的参数:-symbols <file>-s <file>从指定文件中读取符号表。
-se file从指定文件中读取符号表信息,并把他用在可执行文件中。
-core <file>-c <file>调试时core dump的core文件。
-directory <directory>-d <directory>加入一个源文件的搜索路径。
默认搜索路径是环境变量中PATH所定义的路径。
2、GDB的命令概貌启动gdb后,就你被带入gdb的调试环境中,就可以使用gdb的命令开始调试程序了,gdb的命令可以使用help命令来查看,如下所示:/home/hchen> gdbGNU gdb 5.1.1Copyright 2002 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty" for details.This GDB was configured as "i386-suse-linux".(gdb) helpList of classes of commands:aliases -- Aliases of other commandsbreakpoints -- Making program stop at certain pointsdata -- Examining datafiles -- Specifying and examining filesinternals -- Maintenance commandsobscure -- Obscure featuresrunning -- Running the programstack -- Examining the stackstatus -- Status inquiriessupport -- Support facilitiestracepoints -- Tracing of program execution without stopping the programuser-defined -- User-defined commandsType "help" followed by a class name for a list of commands in that class.Type "help" followed by command name for full documentation.Command name abbreviations are allowed if unambiguous.(gdb)gdb的命令很多,gdb把之分成许多个种类。
利用Core文件进行调试
利用Core文件进行调试利用Core文件进行调试2007-11-271. 什么是CORE文件 (2)2. CORE文件大小的设置 (2)3. CORE文件的模拟产生 (3)4. 利用CORE文件进行调试 (4)1. 什么是Core文件在使用半导体作为内存的材料前,人类是利用线圈当作内存的材料(发明者为王安),线圈就叫作core,用线圈做的内存就叫作core memory。
如今,半导体工业澎勃发展,已经没有人用core memory了,不过,在许多情况下,人们还是把记忆体叫作core 。
我们在开发(或使用)一个程序时,最怕的就是程序莫明其妙地当掉。
虽然系统没事,但我们下次仍可能遇到相同的问题。
于是这时操作系统就会把程序当掉时的内存内容dump 出来(现在通常是写在一个叫core的file里面),让我们或是debugger 做为参考。
这个动作就叫作core dump。
2. Core文件大小的设置先看机器:$ uname -aLinux 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 -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedfile size (blocks, -f) unlimitedmax locked memory (kbytes, -l) 4max memory size (kbytes, -m) unlimitedopen files (-n) 2048pipe size (512 bytes, -p) 8stack size (kbytes, -s) 10240cpu time (seconds, -t) unlimitedmax user processes (-u) 7168virtual memory (kbytes, -v) unlimited利用Core文件进行调试3. Core文件的模拟产生写个简单的程序,查看core文件是不是会被产生。
gdb调试命令
gdb调试命令 gdb是⼀个在UNIX环境下的命令⾏调试⼯具。
如果需要使⽤gdb调试程序,请在gcc时加上-g选项。
下⾯的命令部分是简化版,⽐如使⽤l代替list等等。
1.基本命令1)进⼊GDB #gdb test test是要调试的程序,由gcc test.c -g -o test⽣成。
进⼊后提⽰符变为(gdb) 。
2)查看源码 (gdb) l 源码会进⾏⾏号提⽰。
如果需要查看在其他⽂件中定义的函数,在l后加上函数名即可定位到这个函数的定义及查看附近的其他源码。
或者:使⽤断点或单步运⾏,到某个函数处使⽤s进⼊这个函数。
3)设置断点 (gdb) b 6 这样会在运⾏到源码第6⾏时停⽌,可以查看变量的值、堆栈情况等;这个⾏号是gdb的⾏号。
4)查看断点处情况 (gdb) info b 可以键⼊"info b"来查看断点处情况,可以设置多个断点;5)运⾏代码 (gdb) r6)显⽰变量值 (gdb) p n 在程序暂停时,键⼊"p 变量名"(print)即可; GDB在显⽰变量值时都会在对应值之前加上"$N"标记,它是当前变量值的引⽤标记,以后若想再次引⽤此变量,就可以直接写作"$N",⽽⽆需写冗长的变量名;7)观察变量 (gdb) watch n在某⼀循环处,往往希望能够观察⼀个变量的变化情况,这时就可以键⼊命令"watch"来观察变量的变化情况,GDB在"n"设置了观察点;8)单步运⾏ (gdb) n9)程序继续运⾏ (gdb) c 使程序继续往下运⾏,直到再次遇到断点或程序结束;10)退出GDB (gdb) q2.断点调试命令格式 例⼦ 作⽤break + 设置断点的⾏号 break n 在n⾏处设置断点tbreak + ⾏号或函数名 tbreak n/func 设置临时断点,到达后被⾃动删除break + filename + ⾏号 break main.c:10 ⽤于在指定⽂件对应⾏设置断点break + <0x...> break 0x3400a ⽤于在内存某⼀位置处暂停break + ⾏号 + if + 条件 break 10 if i==3 ⽤于设置条件断点,在循环中使⽤⾮常⽅便info breakpoints/watchpoints [n] info break n表⽰断点号,查看断点/观察点的情况clear + 要清除的断点⾏号 clear 10 ⽤于清除对应⾏的断点,要给出断点的⾏号,清除时GDB会给出提⽰delete + 要清除的断点编号 delete 3 ⽤于清除断点和⾃动显⽰的表达式的命令,要给出断点的编号,清除时GDB不会给出任何提⽰disable/enable + 断点编号 disable 3 让所设断点暂时失效/使能,如果要让多个编号处的断点失效/使能,可将编号之间⽤空格隔开awatch/watch + 变量 awatch/watch i 设置⼀个观察点,当变量被读出或写⼊时程序被暂停rwatch + 变量 rwatch i 设置⼀个观察点,当变量被读出时,程序被暂停catch 设置捕捉点来补捉程序运⾏时的⼀些事件。
gdb调试
GDB讲解GDB概述GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。
一般来说,GDB主要帮忙你完成下面四个方面的功能:1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。
(断点可以是条件表达式)3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
gcc编译程序中必须加-g 选项。
GDB启动启动方式主要有三种1、gdb <program>program也就是你的执行文件,一般在当然目录下。
2、gdb <program> core用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
3、gdb <program> -p <PID>如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。
gdb会自动attach上去,并调试他。
program应该在PATH环境变量中搜索得到。
用gdb –help 还可以gdb启动时的一些启动开关-symbols <file>-s <file>从指定文件中读取符号表。
一般可以用调试静态库或动态链接库。
-se file从指定文件中读取符号表信息,并把他用在可执行文件中。
-core <file>-c <file>调试时core dump的core文件。
-directory <directory>-d <directory>加入一个源文件的搜索路径。
默认搜索路径是环境变量中PATH所定义的路径。
GDB调试命令1.设置断点break <function>在进入指定函数时停住。
break <file> <linenum>在指定行号停住。
如果只有一个文件,不用指定file参数。
[Debug]用gdb分析coredump文件
[Debug]⽤gdb分析coredump⽂件1,系统默认是不产⽣coredump⽂件的,需要⽤以下命令使系统产⽣coredump⽂件查看core⽂件的限制,此时为0,即不成⽣core⽂件ulimit -c打开core⽂件的限制,不限制core⽂件的⼤⼩,使程序可以产⽣core⽂件ulimit -c unlimitedulimit -cunlimited2,以下是内存访问错误⽰例[cpp]1. 1 #include<stdio.h>2. 2 int main()3. 3 {4. 4 char* str = "hello";5. 5 str[0] = 'H';6. 6 return 0;7. 7 }3,通过以下命令编译:gcc demosegfault.c -o a.out -ggdb a.out corebtCore was generated by `./demoSegfault'.Program terminated with signal 11, Segmentation fault.#0 0x0804835a in main () at demoSegfault.c:55 str[0] = 'H';(gdb) bt#0 0x0804835a in main () at demoSegfault.c:5(gdb)1,coredump的概念当⼀个程序崩溃时,OS会将该进程的的地址空间保存起来,然后通过⼯具(GDB,trace32)离线调试2,coredump参数/proc/sys/kernel/core_pattern (设置coredump的名称)⽀持的参数%p: 添加pid %u: 添加当前uid %g: 添加当前gid%s: 添加导致产⽣core的信号 %t: 添加core⽂件⽣成时的unix时间%h: 添加主机名 %e: 添加命令名ulimit -a (当core_pattern⾥有管道时忽略此参数) (设置coredump的⼤⼩)可以⽤ulimit -c filesize(KB)改变⼤⼩ulimit -c unlimited表⽰不设限如果为0,表⽰不⽀持coredump/proc/$pid/coredump_filter (设置允许coredump的内存)⽀持的参数bit0: 私有匿名 bit1: 共享匿名 bit2: 有底层⽂件的私有映射 bit3: 有底层⽂件共享映射bit4: ELF头 bit5: 私有⼤尺⼨页 bit6: 共享⼤尺⼨页默认值: 0x233..bat⽂件编写实例:adb remountadb shell echo "/system/coredump" > /proc/sys/kernel/core_pattern adb shell echo 0x27 > /proc/self/coredump_filteradb shell ulimit -c unlimitedadb shell /sbin/recoveryecho "wait 15s to pull coredump"@echo offping -n 15 127.0.0.1>nul@echo onadb pull /system/coredump。
Linux下core文件调试方法
Linux下core⽂件调试⽅法在程序不寻常退出时,内核会在当前⼯作⽬录下⽣成⼀个core⽂件(是⼀个内存映像,同时加上调试信息)。
使⽤gdb来查看core⽂件,可以指⽰出导致程序出错的代码所在⽂件和⾏数。
1.core⽂件的⽣成开关和⼤⼩限制(1)使⽤ulimit -c命令可查看core⽂件的⽣成开关。
若结果为0,则表⽰关闭了此功能,不会⽣成core⽂件。
通过上⾯的命令修改后,⼀般都只是对当前会话起作⽤,当你下次重新登录后,还是要重新输⼊上⾯的命令,所以很⿇烦。
我们可以把通过修改 /etc/profile⽂件来使系统每次⾃动打开。
步骤如下:1.⾸先打开/etc/profile⽂件⼀般都可以在⽂件中找到这句语句:ulimit -S -c 0 > /dev/null 2>&1.ok,根据上⾯的例⼦,我们只要把那个0 改为 unlimited 就ok了。
然后保存退出。
2.通过source /etc/profile 使当期设置⽣效。
3.通过ulimit -c 查看下是否已经打开。
其实不光这个命令可以加⼊到/etc/profile⽂件中,⼀些其他我们需要每次登录都⽣效的都可以加⼊到此⽂件中,因为登录时linux都会加载此⽂件。
⽐如⼀些环境变量的设置。
还有⼀种⽅法可以通过修改/etc/security/limits.conf⽂件来设置,⾸先以root权限登陆,然后打开/etc/security/limits.conf⽂件,进⾏配置:#vim /etc/security/limits.conf<domain> <type> <item> <value>* soft core unlimited(2)使⽤ulimit -c filesize命令,可以限制core⽂件的⼤⼩(filesize的单位为kbyte)。
若ulimit -c unlimited,则表⽰core⽂件的⼤⼩不受限制。
gdb_core文件_函数参数值_概述说明
gdb core文件函数参数值概述说明引言1.1 概述本文将介绍关于gdb core文件和函数参数值的相关内容。
首先,我们将对gdb core文件进行概述,包括其定义、作用以及生成方式。
接着,我们会详细探讨函数参数值的获取方法,其中包括gdb调试工具的简介、函数参数在core文件中保存的方式以及使用gdb获取函数参数值的具体步骤。
最后,我们将深入了解函数参数值的解读与分析过程,包括参数值类型的判断与转换、参数寄存器和内存地址之间的对应关系解析,并提供一些示例和实践案例分析供读者参考。
1.2 文章结构本文总共分为五个主要部分。
除了本引言外,还有"gdb core文件"、"函数参数值获取方法"、"函数参数值的解读与分析"以及"结论"。
每个部分都会围绕特定主题进行详细说明,并提供相关实例和案例,以帮助读者更好地理解和应用所学内容。
1.3 目的本文旨在帮助读者全面理解gdb core文件和如何获取函数参数值。
通过深入研究这些内容,读者可以更好地应对程序调试中出现的问题,并能准确地捕获和解释核心转储文件中的函数参数值。
该知识对于软件开发人员、系统工程师以及需要处理崩溃日志和调试问题的技术人员来说,具有重要的实用价值。
(文章内容仅供参考,可根据实际需求进行修改)2. gdb core文件:2.1 概述:在软件开发过程中,我们常常会遇到程序崩溃或异常终止的情况。
为了能够更好地分析和调试这些问题,我们需要一种手段来捕获程序崩溃时的状态信息。
gdb 是一个功能强大的调试工具,它可以帮助我们分析程序中的错误。
而core文件则是由操作系统在程序崩溃时生成的一个包含程序运行状态信息的文件。
2.2 core文件的作用:core文件记录了程序崩溃时内存映像、寄存器状态以及其他与进程有关的信息。
通过分析core文件,我们可以了解程序在出错前的运行状态,并从中获取有关错误原因、函数执行路径等重要信息。
gdb调试coredump文件
gdb调试coredump⽂件
linux上程序崩溃起来挺烦⼈,不过linux ⽐较好的是有gdb.
1、⽣成coredump⽂件
echo"ulimit -c unlimited" >> /etc/profile
然后记得敲⼊命令
source /etc/profile
然后敲⼊命令:
ulimit –c
效果如下:
确认能否⽣成coredump⽂件,使⽤如下命令(使⽤时注意,我在测的时候会直接退出当前⽤户)
kill -s SIGSEGV $$
然后回到执⾏上述命令的路径下即可看到coredump⽂件,我这边⽣成的⽂件名为core.3477,依个⼈会随机⽣成不同的数字。
2、调试coredump⽂件
调试⽅式为: gdb program coredump⽂件
例如我的可执⾏⽂件为test, ⽣成的coredump⽂件为core.3533,则命令如下:
gdb test core.3533
显⽰如下图所⽰:
嗯,有的⼈运⽓好,直接就显⽰源代码了,如果你像我⼀样,接着⽤下⾯的命令
backtrace
打印堆栈信息。
我们看到最接近崩溃的地⽅在第8⾏
然后调⽤命令
frame 8
直接找到源代码的位置:。
Linux下用gdb调试、查看代码堆栈
Linux下⽤gdb调试、查看代码堆栈Linux中⽤gdb 查看代码堆栈的信息core dump ⼀般是在segmentation fault(段错误)的情况下产⽣的⽂件,需要通过ulimit来设置才会得到的。
调试的话输⼊: gdb filename corefilename就是产⽣core⽂件的可执⾏⽂件,core就是产⽣的dump⽂件查看栈信息—————当程序被停住了,你需要做的第⼀件事就是查看程序是在哪⾥停住的。
当你的程序调⽤了⼀个函数,函数的地址,函数参数,函数内的局部变量都会被压⼊“栈”(Stack)中。
你可以⽤GDB命令来查看当前的栈中的信息。
下⾯是⼀些查看函数调⽤栈信息的GDB命令:backtracebt打印当前的函数调⽤栈的所有信息。
如:(gdb) bt#0 func (n=250) at tst.c:6#1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30#2 0x400409ed in __libc_start_main () from /lib/libc.so.6从上可以看出函数的调⽤栈信息:__libc_start_main --> main()--> func()backtracebtn是⼀个正整数,表⽰只打印栈顶上n层的栈信息。
backtrace <-n>bt <-n>-n表⼀个负整数,表⽰只打印栈底下n层的栈信息。
如果你要查看某⼀层的信息,你需要在切换当前的栈,⼀般来说,程序停⽌时,最顶层的栈就是当前栈,如果你要查看栈下⾯层的详细信息,⾸先要做的是切换当前栈。
framefn是⼀个从0开始的整数,是栈中的层编号。
⽐如:frame 0,表⽰栈顶,frame 1,表⽰栈的第⼆层。
up表⽰向栈的上⾯移动n层,可以不打n,表⽰向上移动⼀层。
down表⽰向栈的下⾯移动n层,可以不打n,表⽰向下移动⼀层。
- 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查看调用堆栈。