Linux环境下经常遇到某个进程挂掉而找不到原因,我们可以通过生成core file文件加上gdb来定位。

(1)首先 在makefile中要增加编译调试选项 -g,才可以利用下面的gdb来调试
 gcc udp_server.c -o udp_server.elf -g -lpthread
 
 -g选项的作用是在可执行文件中加入源代码的信息,比如可执行文件中第几条机器指令对应源代码的第几行,
 但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证gdb能找到源文件。
 
(2)如何产生core file?
我们可以使用ulimit这条命令对core file文件的大小进行设定。
在用这个命令的时候主要是为了产生core文件,就是程序运行发行段错误时的文件.
一般默认情况下,core file的大小被设置为了0,这样系统就不dump出core file了。
这时用如下命令进行设置:
ulimit -c unlimited
这样便把core file的大小设置为了无限大,同时也可以使用数字来替代unlimited,对core file的上限值做更精确的设定。
  
(3)调试段错误 实际例子
lijun@ubuntu-server:~/workspace/test/udp_server$ ulimit -a        (显示当前的各种用户进程限制)
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 63156
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 63156
virtual memory          (kbytes, -v) unlimited
lijun@ubuntu-server:~/workspace/test/udp_server$ ulimit -c unlimited   (把core file的大小设置为了无限大)
lijun@ubuntu-server:~/workspace/test/udp_server$ ./udp_server.elf     (可执行程序测试)
wait client...
start recv data1111...
start recvfrom... 255
Segmentation fault (core dumped)
lijun@ubuntu-server:~/workspace/test/udp_server$ gdb udp_server.elf core    (gdb结合core文件调试)
GNU gdb (Ubuntu/Linaro 7.3-0ubuntu2) 7.3-2011.08
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
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 "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/old_service/lijun/workspace/test/udp_server/udp_server.elf...done.
[New LWP 25812]

warning: Can't read pathname for load map: Input/output error.
[Thread debugging using libthread_db enabled]
Core was generated by `./udp_server.elf'.
Program terminated with signal 11, Segmentation fault.
#0  0x00007f8ac0a6c1a4 in vfprintf () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) bt
#0  0x00007f8ac0a6c1a4 in vfprintf () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007f8ac0a74f79 in printf () from /lib/x86_64-linux-gnu/libc.so.6
#2  0x00000000004009d8 in main () at ./udp_server.c:72   (定位到72行了)

参考:
段错误bug的调试 (挺经典的)
http://blog.csdn.net/ab198604/article/details/6164110

Linux下segment fault的调试
http://www.docin.com/p-390840896.html
http://wenku.baidu.com/view/310242e69b89680203d82599.html###

ulimit -c unlimited  (比较详细地介绍了ulimit命令)
http://www.cnblogs.com/qq78292959/archive/2012/05/08/2490443.html

GDB让调试变简单 (也写的很经典的)
http://dev.jizhiinfo.net/?post=25

gdb结合coredump定位崩溃进程 (很实用的)
http://lazycat.is-programmer.com/posts/31925.html

gdb core调试
http://www.cnblogs.com/wangkangluo1/archive/2012/06/28/2566575.html

gdb core文件调试
http://www.cppblog.com/isware/archive/2011/07/29/152046.aspx

LINUX下GDB调试
http://blog.csdn.net/yeyuangen/article/details/6825542

Linux下调试段错误 (gdb,core,ulimit)的更多相关文章

  1. 在Linux中调试段错误(core dumped)

    在Linux中调试段错误(core dumped) 在作比赛的时候经常遇到段错误, 但是一般都采用的是printf打印信息这种笨方法,而且定位bug比较慢,今天尝试利用gdb工具调试段错误. 段错误( ...

  2. Linux下的段错误(Segmentation fault)

    Linux下的段错误(Segmentation fault) 段错误是指:访问了系统分配给程序的内存空间之外起的内存空间,比如: 访问不存在的地址 访问受系统保护的地址 访问了只读内存地址 内存访问越 ...

  3. linux驱动调试--段错误之oops信息分析

    linux驱动调试--段错误之oops信息分析 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29401328&id= ...

  4. Linux下的段错误(Segmentation fault)

    Linux开发中常见段错误问题原因分析 1 使用非法的内存地址(指针),包括使用未经初始化及已经释放的指针.不存在的地址.受系统保护的地址,只读的地址等,这一类也是最常见和最好解决的段错误问题,使用G ...

  5. linux下寻找段错误的方法

    为了能够快速找到发生段错误的地方,记录以下两种方法. objdump和backtrace的配合使用 :https://www.cnblogs.com/jiangyibo/p/9507555.html ...

  6. linux ulimit的使用,如何产生core文件,调试段错误

    ---恢复内容开始--- 下面先简单介绍下ulimit命令: 1. limit -a 可以查看系统各种资源的限制,如: core文件大小,数据段的大小等. $ ulimit -a core file ...

  7. gdb调试段错误及使用

    在编程调试中,经常出现段错误,此时可用gdb调试.具体方法为注册段错误信号处理函数,在处理函数中启动gdb.具体代码如下: void segv_handler(int no) { ]; ]; FILE ...

  8. 【转】gdb 调试段错误

    [转]gdb 调试段错误 转自:blog.csdn.net/yangzhu1982/article/details/6318600 开发嵌入式Linux的时候经常会遇到segmentation fau ...

  9. linux下将编译错误输出到一个文本文件

    linux下将编译错误输出到一个文本文件 command > filename 把把标准输出重定向到一个新文件中 command > > filename 把把标准输出重定向到一个文 ...

随机推荐

  1. java菜鸟的Python学习之路(1)

    学习一门新的语言,应当抓住语言的共有特性,这样容易触类旁通,学习起来也十分的快捷愉悦 而语言的特性大约有以下元素 变量定义与类型 算术符号与逻辑符号 for 循环与 while 循环 数组,线性表等一 ...

  2. Jquery LigerUI

    http://www.ligerui.com/index.aspx http://api.ligerui.com/ 分享一个基于ligerui的系统应用案例ligerRM V2(权限管理系统)(提供下 ...

  3. Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码

    随着Jquery的作用越来越大,使用的朋友也越来越多.在Web中,由于CheckBox. Radiobutton . DropDownList等控件使用的频率比较高,就关系到这些控件在Jquery中的 ...

  4. 爬虫学习(六)——异常处理URLerrors异常处理

    # 异常处理都在urllib.error中进行处理 import urllib.requestimport urllib.error # 第一种异常:该网址不存在url = "http:// ...

  5. pycahrm git配置笔记

    1. 在file - setting - plugins 中查看是否有github插件, 此处是用于处理插件位置

  6. javascript 计算倒计时

    function timeDown(second) { var month = '', day = '', hour = '', minute = ''; if (second >= 86400 ...

  7. Python While循环、运算符以及一些基础运用

    1.循环语句 循环打印"人生苦短,我用python" while True: print("人生苦短,我用python") 利用While循环,打印1~10 c ...

  8. Scrapy-redis分布式爬虫爬取豆瓣电影详情页

    平时爬虫一般都使用Scrapy框架,通常都是在一台机器上跑,爬取速度也不能达到预期效果,数据量小,而且很容易就会被封禁IP或者账号,这时候可以使用代理IP或者登录方式爬,然而代理IP很多时候都很鸡肋, ...

  9. HDU 4857

    HDU 4857 (反向拓扑排序 + 优先队列) 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须 ...

  10. Maya建模命令

    Surface-Loft(放样)在两条曲线中间生成曲面Section Radius 改变圆环的圆环半径Edit Mesh- Merge 点连结挤压 keep face together(整体挤压),若 ...